将OpenCV图像编码为Base64不会产生有效的图像

4
我正在尝试将树莓派相机拍摄的图片发送到Flask Web服务器。当我对图像进行Base64编码时,似乎无法生成有效的图像。
我可以拍摄照片并通过opencv进行处理。 Base64编码的图像传递到网页,但发送的字符串不是有效的图像。为了证明这一点,我保存了图像并使用在线的Base64转换器进行处理。将此字符串粘贴到网页中会显示图像。
def Take_Picture(camera):
    stream = io.BytesIO()                                           # saving the picture to an in-program stream 
    camera.resolution = (160,120)                                   # set resolution
    camera.capture(stream, format='jpeg', use_video_port=True)      # capture into stream
    mydata = np.fromstring(stream.getvalue(), dtype=np.uint8)       # convert image into numpy array
    img = cv2.imdecode(mydata, -1)                                  # to opencv image
    data = base64.b64encode(img).decode('utf-8')
    print(data)
    cv2.imwrite("test.jpg",img)
    return data

HTML

<img src="data:image/jpeg;charset=utf-8;base64,{{img}}"  alt="Camera View" width="640" height="480">

我从上面的数据中得到以下结果:

b'AAIAAAIAAAIAAAIAAAIAAAIAAAIAAAIAAAIAAAIAAAIAAAMAAAIAAAIAAA...

但是我从在线Base64转换中得到了以下结果:

/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUG...

使用这个字符串在网页上显示了图片。

2个回答

6
你需要将图像从numpy数组转换回图像,然后才能正确编码为Base64!你现在所做的是将一个numpy数组编码为Base64字符串,这肯定不能给出与在线Base64工具相同的结果!
你需要将numpy数组传递给cv2.imencode,它会返回一个缓冲图像对象,然后你可以将其转换为Base64。
retval, buffer_img= cv2.imencode('.jpg', img)
data = base64.b64encode(buffer_img)

或者,如果图像已经存储在内存中,您可以跳过 img = cv2.imdecode(mydata, -1) 直接将 mydata 传递给 base64.b64encode(mydata)

没有 openCV 图像,openCV 图像是一个 ndArray。当您执行 print(type(img)) 时,您将得到 <class 'numpy.ndarray'>


谢谢,作为一个新手,我花了一天时间在这上面,只是跳过了图像转换,它就可以工作了。 - NeilS
不用担心,@NeilsS,我很高兴能帮助你! - Peshmerge

2
以下方法解决了我的问题:
import cv2
import base64

# img is a numpy array / opencv image
_, encoded_img = cv2.imencode('.png', img)  # Works for '.jpg' as well
base64_img = base64.b64encode(encoded_img).decode("utf-8")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接