python - 从 JPG 到 b64encode 再到 cv2.imread()

标签 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 保存到磁盘即可。

谢谢!

最佳答案

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

相关文章:

python - 概率分布和浮点变量,概率必须加到 1

python - 在 Beagle Bone Black 上使用 PWM 不起作用

python - 检测图像上其他物体上附着的小方 block

python - ./manage.py runserver 使用 https

opencv - 在 OpenCV 中,svm.predect 参数 returnDFVal 是什么?

c# - 扫描图像 OpenCV 上的文档检测

python - 将一维数组转换为下三角矩阵

python - 如何与向量一起遍历矩阵?

python - unicodedata.normalize 缺少一个字符进行转换

python - __future__ 模块在 exec 中不生效