将opencv图像编码到Base64中不会产生有效的图像

时间:2019-01-04 06:36:22

标签: python-3.x opencv flask base64

我正在尝试将Pi相机中的图片发送到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 ...

根据以上数据。 但是我得到

  

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

来自test.jpg,来自在线Base64转换。将此字符串放在网页中将显示图像。

2 个答案:

答案 0 :(得分:0)

您必须将图像从numpy数组转换回可以正确编码为Base64的图像! 您现在要做的是将一个numpy数组编码为base64字符串,这肯定不会产生与在线base64工具相同的结果!

您需要做的是,将numpy数组传递给cv2.imencode,该数组将返回一个缓冲区图像对象,然后可以将其转换为base64

retval, buffer_img= cv2.imencode('.jpg', img)
data = base64.b64encode(buffer_img)

OR 您可以跳过img = cv2.imdecode(mydata, -1)并将mydata直接传递到base64.b64encode(mydata),而图像已存储在内存中!

没有openCV映像,openCV映像是ndArray。执行print(type(img))后,您将得到<class 'numpy.ndarray'>

答案 1 :(得分:0)

以下为我解决了这个问题:

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")