【问题标题】:From JPG to b64encode to cv2.imread()从 JPG 到 b64encode 到 cv2.imread()
【发布时间】: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

标签: python opencv numpy


【解决方案1】:

从 OpenCV documentation 我们可以看到:

imread :从文件加载图像。

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

似乎是做你想做的更好的方式。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 您可能想用 cv2.imshow 删除最后一行 - 当我这样做时它会锁定。但这对程序来说并不重要——这只是我插入的一个中间步骤,以使原始问题中的代码更有意义。重要的是,在此之前的一切都解决了我遇到的问题,现在一切都解决了!谢谢!
    • 好的,谢谢。您可能需要 cv2.waitKey(1) 来查看 imshowed 图像并避免阻塞。
    • 是的,我有那个,但它仍然被锁定。我的程序中与之交互的部分基本上做同样的事情,这就是我在问题的 cmets 中提到的“新问题”。我认为这只是一个数据类型问题,应该很容易解决。再次感谢! :D
    • 嗨@Miki 和@godfreap,我想问一下......在上面的这段代码中:source = cv2.imdecode(npimg, 1) 1 是一个标志......这里的1 的意义值是什么?如果我没有设置flag=1,有什么区别吗?
    • @uyhaW 是的,这是一面旗帜。阅读here
    猜你喜欢
    • 2016-08-19
    • 2013-10-01
    • 2020-05-08
    • 2019-09-17
    • 2021-04-05
    • 2018-11-17
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多