首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于json传输的Python图像到字节字符串

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

Stack Overflow用户
提问于 2016-12-02 08:58:01
回答 2查看 76.6K关注 0票数 48

我使用python3numpy、scipy和opencv

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

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

代码语言:javascript
运行
复制
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 8\xff\xe0 0。我做错了什么?

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

代码语言:javascript
运行
复制
utf_string = converted.decode('utf-16-le')

UnicodeDecodeError:' UTF-16 -le‘编解码器无法解码0-1位置的字节:非法的UTF-16代位

代码语言:javascript
运行
复制
text = strrrrrr.decode('utf-8')

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

我想不出有什么办法能把这件事做好。

我还尝试将其转换为base64编码的字符串,就像在http://www.programcreek.com/2013/09/convert-image-to-string-in-python/中解释的那样,但这也不起作用。(这个解决方案不是首选的,因为它要求将映像临时写入磁盘,这不是我所需要的。更好的是,图像应该只保存在内存中,而不是磁盘上。)

该解决方案应该包含一种将图像编码为json-一致性字符串的方法,以及一种将其解码回numpy-数组的方法,因此它可以与cv2.imshow()一起使用。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-02 10:36:16

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

代码语言:javascript
运行
复制
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()

给你的开头是:

代码语言:javascript
运行
复制
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCg

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

代码语言:javascript
运行
复制
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格式),请尝试:

代码语言:javascript
运行
复制
jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
image_buffer = cv2.imdecode(jpg_as_np, flags=1)
票数 76
EN

Stack Overflow用户

发布于 2019-10-16 05:20:54

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

要为JSON编码:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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)

希望这能对某人有所帮助

票数 27
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40928205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档