当前位置: 首页 > 面试题库 >

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

韩弘阔
2023-03-14
问题内容

我将 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()再次使用。

谢谢你的帮助。


问题答案:

您不需要将缓冲区保存到文件。以下脚本从网络摄像头捕获图像,将其编码为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)


 类似资料:
  • 问题内容: 我有一个十六进制字符串,看起来像: 我需要使用Java将其转换为图像。我尝试过先使用org.apache.commons.codec.binary.Hex类转换为字节数组。FileOutputStream稍后将其转储到文件中。 但是,十六进制类中的解析器会阻塞,但解码器例外:奇数个字符。无论我使用哪种方法转换为字节数组,它都会失败。该文件格式绝对是JPEG。 我尝试从字符串中删除 此

  • 问题内容: 我会马上追逐。现在,我正在开发基于Web的应用程序。它具有基于PHP REST的体系结构,可提供XML文档。在许多这些文档中,属性是十六进制编码的图片字符串。 在客户端,jQuery AJAX获取其中包含图片的XML文档。我需要在某些标签中显示上述图片。但是,我缺乏有关此类方法的知识,因此在这里寻求帮助。 目标:以十六进制或base64 >>> HTML显示的图像的JavaScript

  • 我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误:

  • 问题内容: 我正在尝试像PHP函数一样从字符串加载图像 我怎样才能做到这一点? 我有MySQL Blob字段图像。我正在使用 MySQLdb, 并且不想在PyOpenCV中创建用于处理图像的临时文件。 注意:需要cv(不是cv2)包装函数 问题答案: 这就是我通常用来将数据库中存储的图像转换为Python中的OpenCV图像的方式。 我已添加了从到的转换,因此上面的脚本将显示: 编辑: 从最新的n

  • 问题内容: 我将数据存储在字节数组中。如何将这些数据转换为十六进制字符串? 我的字节数组示例: 问题答案: 使用: 或使用 注意: 在format语句中,表示在必要时最多填充2个前导s。这很重要,因为它将被格式化为而不是 或与配合使用: 这是Python 3.6.1中上述方法的基准: 结果: 使用的方法的确提供了其他格式选项,例如用空格,逗号,大写字母/等分隔数字,但是会影响性能。

  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页