【发布时间】:2016-02-04 22:47:32
【问题描述】:
对于我正在编写的程序,我正在从一台计算机传输图像 - 使用 base64.b64encode(f.read(image)) - 并尝试在接收脚本中读取它而不将其保存到硬盘驱动器(在尽量减少处理时间)。我很难弄清楚如何在不保存本地的情况下将图像读入 OpenCV。
这是我发送图像的代码:
f = open(image.jpg)
sendthis = f.read()
f.close()
databeingsent = base64.b64encode(sendthis)
client.publish('/image',databeingsent,0)
# this is an MQTT publish, details for SO shouldn't be relevant
同时,这里是接收它的代码。 (这是在 on_message 函数中,因为我使用 MQTT 进行传输。)
def on_message(client, userdata, msg): # msg.payload is incoming data
img = base64.b64decode(msg.payload)
source = cv2.imread(img)
cv2.imshow("image", source)
消息解码后,出现错误: “TypeError:您的输入类型不是 numpy 数组”。
我已经进行了一些搜索,但似乎找不到相关的解决方案 - 一些解决方案涉及使用 b64 从文本文件转换为 numpy,但没有一个真正涉及使用图像并立即将解码后的数据读入 OpenCV无需将其保存到硬盘驱动器的中间步骤(使用“发送”脚本中用于读取文件的逆过程)。
我对 Python 和 OpenCV 还是很陌生,所以如果有更好的编码方法来发送图像 - 无论如何都能解决问题。图像如何发送无关紧要,只要我可以在接收端读取它而不将其作为 .jpg 保存到磁盘即可。
谢谢!
【问题讨论】:
-
使用
imdecode而不是imread -
"buf 不是一个 numpy 数组,也不是一个标量"尝试在这里通过 b64decode 步骤,仍然得到这个错误。所以,仍然要求一个 numpy 数组
-
看看this 是否有帮助。然后你需要 imdecode,因为 imread 从磁盘加载图像。
-
np.array(list(img), dtype=np.uint8)或np.fromstring(img, dtype=np.uint8)可能会解决问题。但我不知道蟒蛇。我的建议是你需要 imdecode。如何获取正确的参数类型取决于您:D -
很高兴它有帮助。感谢您的工作块:D