はじめに
今回は、pythonのフレームワーク flaskでの画像の受け取り方の一つをメモします。
具体的には、画像をbase64にエンコードされた形式で受け取り、flask側でデコードして画像を復元します。
ついでに、open-cvを使用して復元した画像をグレースケールに変換して、再度base64にエンコードして返却するところまでメモします。
ソース
使用するライブラリは下記です。
requirements.txt
flask
flask-cors
opencv-python
opencv-contrib-python
リクエストでもらうデータは、複数枚扱いたいのでjson形式にします。
[
{
id : 0
Image : id4zFjyrkAuSI2vUBKVLP...(base64でエンコードされたイメージ)
},
{
id : 1
Image : k75GN/oll7KUCulSpSM/S...(base64でエンコードされたイメージ)
}
]
main.py
from flask import Flask, jsonify, request
from flask_cors import CORS
import cv2
import numpy as np
import base64
app = Flask('flask-tesseract-api')
CORS(app)
@app.route("/image/", methods=["POST"])
def post():
"""
画像をグレースケールに変換する
"""
response = []
for json in request.json:
# Imageをデコード
img_stream = base64.b64decode(json['Image'])
# 配列に変換
img_array = np.asarray(bytearray(img_stream), dtype=np.uint8)
# open-cv でグレースケール
img_gray = cv2.imdecode(img_array, 0)
# 変換結果を保存
cv2.imwrite('result.png', img_before)
# 保存したファイルに対してエンコード
with open('result.png', "rb") as f:
img_base64 = base64.b64encode(f.read()).decode('utf-8')
# レスポンスのjsonに箱詰め
response.append({'id':json['id'], 'result' : img_base64})
return jsonify(response)
if __name__ == '__main__':
app.run(host='0.0.0.0',port=5000,debug=True)
まとめ
複数の画像をエンコードした状態で、json形式としてflaskに送ることができました。
これで、複数枚の画像を同時に扱う機能が実装できますね。