Flask OpenCV Отправка и получение изображений в байтах - PullRequest
0 голосов
/ 14 сентября 2018

Я хочу отправлять и получать изображения в байтах в моем 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'

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Следующее сработало для меня.У меня нет кода клиента, но у меня есть запрос curl.Это должно сработать,

СЕРВЕР

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'
0 голосов
/ 14 сентября 2018

Проще отправлять изображения в формате 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, если вы уверены в своих входных изображениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...