画像をcurlでflaskサーバーに送信しています。このcurlコマンドを使用しています。
curl -F "[email protected]" http://localhost:8000/home
サーバー側でCV2を使用してファイルを読み取ろうとしています。
サーバー側では、このコードで画像を処理します
@app.route('/home', methods=['POST'])
def home():
data =request.files['file']
img = cv2.imread(data)
fact_resp= model.predict(img)
return jsonify(fact_resp)
私はこのエラーを受けています-
img = cv2.imread(data)
TypeError: expected string or Unicode object, FileStorage found
サーバー側でCV2を使用してファイルを読み取るにはどうすればよいですか?
ありがとう!
flaskサーバーでopencvを使用しているときに同様の問題がありました。そのため、最初に画像をディスクに保存し、cv2.imread ()
これがサンプルコードです:
data =request.files['file']
filename = secure_filename(file.filename) # save file
filepath = os.path.join(app.config['imgdir'], filename);
file.save(filepath)
cv2.imread(filepath)
しかし、今私は here からさらに効率的なアプローチを得ていますcv2.imdecode()を使用してnumpy配列から画像を読み取る未満:
#read image file string data
filestr = request.files['file'].read()
#convert string data to numpy array
npimg = numpy.fromstring(filestr, numpy.uint8)
# convert numpy array to image
img = cv2.imdecode(npimg, cv2.CV_LOAD_IMAGE_UNCHANGED)
少し実験を行った後、私はCV2を使用してファイルを読み取る方法を見つけました。このため、最初にPIL.imageメソッドを使用して画像を読み取ります
これは私のコードです、
@app.route('/home', methods=['POST'])
def home():
data =request.files['file']
img = Image.open(request.files['file'])
img = np.array(img)
img = cv2.resize(img,(224,224))
img = cv2.cvtColor(np.array(img), cv2.COLOR_BGR2RGB)
fact_resp= model.predict(img)
return jsonify(fact_resp)
PILを使用せずにこれを行う簡単な方法はあるのでしょうか。
2行のソリューション、グレースケールを必要なものに変更
npimg = numpy.fromfile(request.files['image'], numpy.uint8)
# convert numpy array to image
img = cv2.imdecode(npimg, cv2.IMREAD_GRAYSCALE)
だからあなたがのようなことをしたい場合は、
file = request.files['file']
img = cv2.imread(file)
それからこのようにします
import numpy as np
file = request.files['file']
npimg = np.fromfile(file, np.uint8)
file = cv2.imdecode(npimg, cv2.IMREAD_COLOR)
これで、再度cv2.imread()を実行する必要はありませんが、これを次のコード行で使用できます。
これはopencv> 3に適用されます