对于正在编写的程序,我正在使用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到磁盘即可。

谢谢!

最佳答案

您可以使用以下方法从解码数据中获取一个numpy数组:

import numpy as np
...
img = base64.b64decode(msg.payload)
npimg = np.fromstring(img, dtype=np.uint8)

然后,您需要imdecode从内存中的缓冲区读取图像。 imread用于从文件加载图像。

所以:
import numpy as np
...
def on_message(client, userdata, msg): # msg.payload is incoming data
    img = base64.b64decode(msg.payload);
    npimg = np.fromstring(img, dtype=np.uint8);
    source = cv2.imdecode(npimg, 1)

关于python - 从JPG到b64encode到cv2.imread(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50684393/

10-11 22:42