Python OpenCV图像到字节字符串以进行JSON传输

发布于 2021-01-29 15:09:51

我将 python3numpy,scipy和opencv结合使用

我正在尝试将通过OpenCV和连接的相机接口读取的图像转换为二进制字符串,以通过某种网络连接将其发送到json对象中。

我尝试将数组编码为jpg并解码UTF-16字符串,但没有得到可用的结果。例如,

img = get_image()
converted = cv2.imencode('.jpg', img)[1].tostring()
print(converted)

我得到一个字节字符串作为结果:

b’\ xff \ xd8 \ xff \ xe0 \ x00 \ x10JFIF \ x00 \ x01 \ x01 \ x00 \ x00 \
x01 \ x00 \ x01 \ x00 \ x00 \ xff \ xdb \ x00C \ x00 \ x02 \ x01 \ x01 \ x01
\ x01 \ x01 \ x01 \ x02 \ x01 ....

但是此数据不能用作json对象的内容,因为它包含无效字符。有什么办法可以显示此字符串后面的实际字节?我相信\
xff表示字节值FF,所以我需要像FFD8FFE0 …这样的String来代替\ xff \ xd8 \ xff \ xe0。我究竟做错了什么?

在上面的代码之后,我尝试将其编码为UTF-8和UTF16,但是在此方面遇到了一些错误:

utf_string = converted.decode('utf-16-le')

UnicodeDecodeError:“ utf-16-le”编解码器无法解码位置0-1的字节:非法的UTF-16代理

text = strrrrrr.decode('utf-8')

UnicodeDecodeError:’utf-8’编解码器无法解码位置0的字节0xff:无效的起始字节

我想不出办法解决这个问题。

我还尝试将其转换为base64编码的字符串,如 http://www.programcreek.com/2013/09/convert-image-to-
string-in-python/中所述,
但这也不起作用。(此解决方案不是首选,因为它需要将映像临时写入磁盘,这与我所需要的不完全相同。最好,映像仅应保存在内存中,而不是磁盘上。)

该解决方案应包含一种将图像编码为符合json格式的字符串的方法,以及一种将其解码回numpy-array的方法,因此可以与cv2.imshow()再次使用。

谢谢你的帮助。

关注者
0
被浏览
93
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您不需要将缓冲区保存到文件。以下脚本从网络摄像头捕获图像,将其编码为JPG图像,然后将该数据转换为可打印的base64编码,该编码可与JSON一起使用:

    import cv2
    import base64
    
    cap = cv2.VideoCapture(0)
    retval, image = cap.read()
    retval, buffer = cv2.imencode('.jpg', image)
    jpg_as_text = base64.b64encode(buffer)
    print(jpg_as_text)
    cap.release()
    

    给你一些开始像:

    /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCg
    

    可以扩展它以显示如何将其转换回二进制,然后将数据写入测试文件以显示转换成功:

    import cv2
    import base64
    
    cap = cv2.VideoCapture(0)
    retval, image = cap.read()
    cap.release()
    
    # Convert captured image to JPG
    retval, buffer = cv2.imencode('.jpg', image)
    
    # Convert to base64 encoding and show start of data
    jpg_as_text = base64.b64encode(buffer)
    print(jpg_as_text[:80])
    
    # Convert back to binary
    jpg_original = base64.b64decode(jpg_as_text)
    
    # Write to a file to show conversion worked
    with open('test.jpg', 'wb') as f_output:
        f_output.write(jpg_original)
    

    要将图像作为图像缓冲区(而不是JPG格式)取回,请尝试:

    jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
    image_buffer = cv2.imdecode(jpg_as_np, flags=1)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看