提问者:小点点

PythonOpenCV图像到字节字符串的json传输


我将python3与numpy、s的和opencv一起使用。

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

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

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

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

b'\xff\xd 8\xff\xe 0\x 00\x 10 J F IF\x 00\x 01\x 01\x 00\x 00\x 01\x 00\x 00\xff\x db\x 00 C\x 00\x 02\x 01\x 01\x 01\x 01\x 01\x 02\x 01……

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

我试图在上面的代码之后将其编码为UTF-8和UTF16,但我得到了几个错误:

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

'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()一起使用。

感谢任何帮助。


共2个答案

匿名用户

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

匿名用户

上面的答案对我不起作用,它需要一些更新。以下是这个问题的新答案:

编码JSON:

import base64
import json
import cv2

img = cv2.imread('./0.jpg')
string = base64.b64encode(cv2.imencode('.jpg', img)[1]).decode()
dict = {
    'img': string
}
with open('./0.json', 'w') as outfile:
    json.dump(dict, outfile, ensure_ascii=False, indent=4)

要解码回np. array

import base64
import json
import cv2
import numpy as np

response = json.loads(open('./0.json', 'r').read())
string = response['img']
jpg_original = base64.b64decode(string)
jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
img = cv2.imdecode(jpg_as_np, flags=1)
cv2.imwrite('./0.jpg', img)

希望这能帮助某人: P