0

我的挑战

我需要使用 Flask 发送和接收图像,以便对 1000 多个相机流进行实时对象检测。

第 1 部分:将我的视频帧发送到 API

我不想将图像帧保存在我的磁盘上,现在我没有用于发送到 Flask API 的 .png/.jpg 文件。我已经在内存中有图像数据numpy.array(我cv2.VideoCapture()用来从视频流中提取帧)。

如何将这些字节发送numpy.array到 Flask API?

现在我正在尝试使用 对图像进行编码cv2.imencode(),将其转换为字节,然后使用 base64 对其进行编码。

### frame is a numpy.array with an image
img_encoded = cv2.imencode('.jpg', frame)[1]
img_bytes = img_encoded.tobytes()

类似的东西是这样img_bytes的:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x02\x01\x01\x01\x01\x01\x02\x01\x01\x01\x02\x02\x02\x02\x02\x04\x03\x02\x02\x02\x02\x05\x04\x04\x03'

我正在尝试发送img_bytes我的requests.post()

files = {'imageData': img_bytes}
res = requests.post('http://127.0.0.1/image', files=files)

我收到<Response [200]>了,但 API 没有按预期工作。我相信我的 Flask 服务器不能很好地处理这些编码字节......所以我的问题可能在第 2 部分。

第 2 部分:在我的 Flask 服务器上接收图像字节并将其转换为 PIL.Image

我已经定义了一个函数predict_image()来接收PIL.Image.open()并执行所有对象检测任务的输出。

我的问题是我的变量imageData显然无法正确打开PIL.Image.open()。的是。type()_imageData<class 'werkzeug.datastructures.FileStorage'>

在下面的这个片段中,我的网络服务正在检索请求中收到的图像,并对其执行predict_image()对象检测:

def predict_image_handler(project=None, publishedName=None):
    try:
        imageData = None
        if ('imageData' in request.files):
            imageData = request.files['imageData']
        elif ('imageData' in request.form):
            imageData = request.form['imageData']
        else:
            imageData = io.BytesIO(request.get_data())

        img = Image.open(imageData)
        results = predict_image(img)
        return jsonify(results)

    except Exception as e:
        print('EXCEPTION:', str(e))
        return 'Error processing image', 500

将图像发送到 API 时,我没有收到错误消息,但 API 未按预期工作。我相信它不会以正确的方式将字节转换回图像。

我在这段代码中缺少什么?imageData在打开对象之前我需要对它做PIL.Image.open()什么?

4

2 回答 2

1

您是否将 img_encoded 或 img_bytes 发送到“imageData”?我确实认为将 img_bytes 作为 base64 发送可能会导致这样的行为。werkzeug.datastructures。FileStorage 应该代理流方法,但是您是否尝试过使用 imageData.stream?

于 2019-08-01T14:45:59.730 回答
0

我的代码有一个小错误,我试图img_encoded在帖子上发送而不是img_bytes. 现在一切正常。

第 1 部分:提出请求

### frame is a numpy.array with an image
img_encoded = cv2.imencode('.jpg', frame)[1]
img_bytes = img_encoded.tobytes()

files = {'imageData': img_bytes}
response = requests.post(url,
files=files)

第 2 部分:处理接收到的字节

def predict_image_handler(project=None, publishedName=None):
    try:
        imageData = None
        if ('imageData' in request.files):
            imageData = request.files['imageData']
        elif ('imageData' in request.form):
            imageData = request.form['imageData']
        else:
            imageData = io.BytesIO(request.get_data())

        img = Image.open(imageData)
        results = predict_image(img)
        return jsonify(results)

    except Exception as e:
        print('EXCEPTION:', str(e))
        return 'Error processing image', 500
于 2019-08-01T20:44:29.460 回答