我将 python3 与 numpy,scipy和opencv 一起使用。
我试图将通过OpenCV和连接的相机接口读取的图像转换为二进制字符串,以通过某种网络连接在json对象中发送它。
我尝试将数组作为jpg进行插入并解码UTF-16字符串,但我没有得到有用的结果。例如,
list
我得到一个字节字符串作为结果:
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,但是我得到了几个错误:
img = get_image()
converted = cv2.imencode('.jpg', img)[1].tostring()
print(converted)
UnicodeDecodeError:' utf-16-le'编解码器不能解码位置0-1中的字节:非法UTF-16代理
utf_string = converted.decode('utf-16-le')
UnicodeDecodeError:' utf-8'编解码器不能解码位置0中的字节0xff:无效的起始字节
我无法找到一种方法来做到这一点。
我还尝试将其转换为base64编码的字符串,如中所述 http://www.programcreek.com/2013/09/convert-image-to-string-in-python/ 但这也不起作用。 (这个解决方案不是首选,因为它需要将图像临时写入磁盘,这不是我需要的。最好是图像只能保存在内存中,而不能保存在磁盘上。)
解决方案应包含一种将图像编码为json-conform字符串的方法,以及将其解码回numpy-array的方法,因此可以再次使用cv2.imshow()。
感谢您的帮助。
答案 0 :(得分:25)
您无需将缓冲区保存到文件中。以下脚本从网络摄像头捕获图像,将其编码为JPG图像,然后将该数据转换为可打印的base64编码:
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)
答案 1 :(得分:3)
上面的答案有些不适用于我,需要一些更新。这是对此的新答案:
要编码为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