如何 `requests.post` 一个 numpy 数组

how to `requests.post` a numpy array

我正在尝试将由 opencv .read 函数编辑的图像 return 发送到服务器。当我使用 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}) 

这不是return 想要的响应。使用 {'img':open(filename,'rb')}) 做 return 所需的响应。我尝试了一些不同的东西,但我不知道如何将由 opencv 编辑的帧 return 转换为数据类型 open() returns (io.BufferedReader)。有人知道吗? 谢谢!

因为你有一个 numpy 数组,而不是一个类似文件的对象,我建议 不要 使用 files=... 方式来传递你的数据。

如果你有 bytes 数据(一个 numpy 数组可以变成那个),你可以用不同的方式传递它们:作为 data= 参数。这是使用 requests.post.

的直接方法

参数记录在此处:https://docs.python-requests.org/en/latest/api/#requests.post

注意:frame 已经是一个 numpy 数组(在您的 imencode 调用中)。将它“转换”为一个是多余的。

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}) 
...