我试图将opencv .read函数返回的图像发送到服务器。当我使用open()导入图像时,一切工作正常,但发送帧不会导致所需的响应(似乎服务器需要另一种数据类型)。我的代码是:
ret, frame = vid.read()
img_str = cv2.imencode('.jpg', np.array(frame))[1].tobytes()
rsp = requests.post(url, auth = (user, pwd), files={'img':img_str})
这不会返回期望的响应。使用{'img':open(filename,'rb')})确实会返回所需的响应。我尝试了一些不同的东西,但我不知道如何将opencv返回的帧转换为数据类型open()返回(io.BufferedReader)。有人知道吗?谢谢!
既然你有一个numpy数组,但不是一个类似文件的对象,我建议不使用files=...
的方式来传递你的数据。
如果你有bytes
数据(numpy数组可以变成那样),你传递它们以不同的方式:作为data=
参数。这是使用requests.post
的直接方法。
参数记录在这里:https://docs.python-requests.org/en/latest/api/#requests.post
注意:frame
已经是一个numpy数组(在你的imencode
调用中)。"Converting"这对一个人来说是多余的。
success, frame_encoded = cv2.imencode('.jpg', frame)
assert success # always check for errors, at least fail hard
frame_bytes = frame_encoded.tobytes() # numpy array to bytes object
rsp = requests.post(url, ..., data=frame_bytes)
我认为只传递data=frame
可能已经工作了,因为numpy数组实现了python的"缓冲区"。协议,这应该是足够的requests.post
…你应该试试。
不要忘记打破你的视频阅读循环if not ret
。
如果你做想要继续使用files=...
(并给文件命名为img
),您可以使用io.BytesIO
:
...
import io
frame_file = io.BytesIO(frame) # yes, that is enough
rsp = requests.post(url, ..., files={'img': frame_file})
...