如何"请求".Post '一个numpy数组



我试图将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}) 
...

相关内容

  • 没有找到相关文章

最新更新