从JPG到b64encode到cv2.imread()

时间:2015-11-04 12:25:13

标签: python opencv numpy

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

谢谢!

2 个答案:

答案 0 :(得分:10)

您可以使用以下方法从解码数据中获取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)

答案 1 :(得分:3)

从OpenCV documentation我们可以看到:

imread :从文件中加载图片。

imdecode :从内存中的缓冲区中读取图像。

似乎有更好的方法来做你想做的事。