Я хочу отправлять и получать изображения в байтах в моем API-интерфейсе. Я также хочу отправить json вместе с изображением. Как я могу это достичь?
Ниже мое текущее решение, которое не работает
колба:
@app.route('/add_face', methods=['GET', 'POST'])
def add_face():
if request.method == 'POST':
# print(request.json)
nparr = np.fromstring(request.form['img'], np.uint8)
print(request.form['img'])
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
cv2.imshow("frame", img)
cv2.waitKey(1)
return "list of names & faces"
клиент:
def save_encoding(img_file):
URL = "http://localhost:5000/add_face"
img = open(img_file, 'rb').read()
response = requests.post(URL, data={"name":"obama", "img":str(img)})
print(response.content)
возникшая ошибка:
cv2.imshow("frame", img)
cv2.error: OpenCV(3.4.3) /io/opencv/modules/highgui/src/window.cpp:356: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
Легче отправлять изображения в формате base64, делая это, избавляясь от проблем с отправкой/получением двоичных данных, так как вы просто работаете со строкой. Также это удобнее в веб-материалах. Протестированный код ниже: Сторона сервера:
from flask import Flask, render_template, request
import pandas as pd
import cv2
import numpy as np
import base64
app = Flask(__name__)
@app.route('/add_face', methods=['GET', 'POST'])
def add_face():
if request.method == 'POST':
# read encoded image
imageString = base64.b64decode(request.form['img'])
# convert binary data to numpy array
nparr = np.fromstring(imageString, np.uint8)
# let opencv decode image to correct format
img = cv2.imdecode(nparr, cv2.IMREAD_ANYCOLOR);
cv2.imshow("frame", img)
cv2.waitKey(0)
return "list of names & faces"
if __name__ == '__main__':
app.run(debug=True, port=5000)
Сторона клиента:
import requests
import base64
URL = "http://localhost:5000/add_face"
# first, encode our image with base64
with open("block.png", "rb") as imageFile:
img = base64.b64encode(imageFile.read())
response = requests.post(URL, data={"name":"obama", "img":str(img)})
print(response.content)
Вы можете использовать COLOR вместо ANYCOLOR, если вы уверены в своих входных изображениях.
Для меня это работало. У меня нет клиентского кода, но у меня есть запрос на завивание. Это должно делать свое дело,
SERVER
from flask import request
from PIL import Image
import io
@app.route("/add_face", methods=["POST"])
def predict():
image = request.files["image"]
image_bytes = Image.open(io.BytesIO(image.read()))
СТОРОНА КЛИЕНТА
curl -X POST -F image=@PATH/TO/FILE 'http://localhost:5000/add_face'