Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于json传输的Python OpenCV图像到字节字符串_Python_Opencv - Fatal编程技术网

用于json传输的Python OpenCV图像到字节字符串

用于json传输的Python OpenCV图像到字节字符串,python,opencv,Python,Opencv,我将python3与numpy、scipy和opencv一起使用 我试图将通过OpenCV和连接的摄像头接口读取的图像转换为二进制字符串,通过某种网络连接将其发送到json对象中 我尝试将数组编码为jpg,并解码UTF-16字符串,但没有得到可用的结果。例如 img = get_image() converted = cv2.imencode('.jpg', img)[1].tostring() print(converted) 我得到一个字节字符串作为结果: b'\xff\xd8\xff\x

我将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\x02\x01

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

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

utf_string = converted.decode('utf-16-le')
UnicodeDecodeError:“utf-16-le”编解码器无法解码位置0-1中的字节:非法utf-16代理

UnicodeDecodeError:“utf-8”编解码器无法解码位置0中的字节0xff:无效的开始字节

我想不出一个正确的方法

我还尝试将其转换为base64编码字符串,如中所述 但这也不行。(此解决方案不是首选方案,因为它要求将映像临时写入磁盘,而这正是我所需要的。映像最好只保存在内存中,而不保存在磁盘上。)

该解决方案应该包含一种将图像编码为符合json的字符串的方法,以及一种将其解码回numpy数组的方法,这样它就可以与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格式),请尝试:


有些人认为上面的答案不适合我,需要更新。以下是对此的新答案:

要为JSON编码,请执行以下操作:

导入base64
导入json
进口cv2
img=cv2.imread('./0.jpg')
string=base64.b64encode(cv2.imencode('.jpg',img)[1]).decode()
dict={
“img”:字符串
}
将open('./0.json',w')作为输出文件:
dump(dict,outfile,确保ascii=False,indent=4)
要解码回
np.array

导入base64
导入json
进口cv2
将numpy作为np导入
response=json.load(open('./0.json','r').read())
字符串=响应['img']
jpg_original=base64.b64解码(字符串)
jpg_as_np=np.frombuffer(jpg_原件,dtype=np.uint8)
img=cv2.imdecode(jpg\u as\u np,flags=1)
cv2.imwrite('./0.jpg',img)

希望这能帮助某人:p

您可以使用base64编码,看起来不错,但我如何将其解码回numpy数组?b64decode()返回已解码的字符串。我尝试了image2=cv2.imdecode(jpg_original,-1),但我得到了TypeError:buf不是一个numpy数组,也不是标量。要将其作为图像缓冲区(而不是jpg格式)返回,请尝试:
jpg_as_np=np.frombuffer(jpg_original,dtype=np.uint8);image\u buffer=cv2.imdecode(jpg\u as\u np,flags=1)
yay,现在它正在处理这个添加项。非常感谢你!无法加载图像“test.jpg”。解释JPEG图像文件时出错(不是JPEG文件:以0x2f 0x39开头)当我打开test.jpgPlease时,我遇到了这个错误。当您已经读取它时,在base64编码中使用cv2.imencode有什么用?@AndoJurai有时我们已经将img作为np数组,而不是可以读取和获取base64字符串表示的文件
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_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
image_buffer = cv2.imdecode(jpg_as_np, flags=1)