我的挑战
我需要使用 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()
什么?