将 opencv 图像编码为 Base64 不会生成有效图像

Nei*_*ilS 4 base64 opencv flask python-3.x

我正在尝试将 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
Run Code Online (Sandbox Code Playgroud)

超文本标记语言

<img src="data:image/jpeg;charset=utf-8;base64,{{img}}"  alt="Camera View" width="640" height="480">
Run Code Online (Sandbox Code Playgroud)

我得到的结果是

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊……

从上面的数据来看。但我得到

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

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

Pes*_*rge 6

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

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

retval, buffer_img= cv2.imencode('.jpg', img)
data = base64.b64encode(buffer_img)
Run Code Online (Sandbox Code Playgroud)

或者 您可以跳过并直接img = cv2.imdecode(mydata, -1)传递到图像已经存储在内存中的情况!mydatabase64.b64encode(mydata)

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