如何 `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})
...
我正在尝试将由 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})
...