将 Open CV 帧转换为 Base64 编码的 JPEG

Turning an Open CV frame into a Base64 encoded JPEG

我想从 Open CV 网络摄像头流中获取一帧,生成 JPEG 缩略图,然后将其编码为 Base64(然后它将作为 MQTT 消息发送,但这不是问题所在)。

我的Python“sendimage”函数是:

def sendimage():
    # produce thumbnail image
    thumbnail = imutils.resize(frame, width=320)
    # encode as base64 jpeg
    result, thumbnailjpg = cv2.imencode('.jpg', thumbnail, [cv2.IMWRITE_JPEG_QUALITY, 90])
    encodedimage = "data:image/jpeg;base64,"+base64.b64encode(thumbnailjpg)
    # send via mqtt
    print("sending thubnail image")

就 cv2.imencode 而言它似乎可以工作,但是 base64.b64encode 失败了。

线程 Thread-1 中的异常: 追溯(最近一次通话): 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py”,第 954 行,在 _bootstrap_inner 中 self.run() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py”,第 892 行,在 运行 self._target(*self._args, **self._kwargs) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 3452 行,在 _thread_main 中 self.loop_forever(retry_first_connection=真) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 1779 行,在 loop_forever rc = self.loop(超时, max_packets) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 1181 行,循环 rc = self.loop_read(max_packets) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 1572 行,在 loop_read rc = self._packet_read() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 2310 行,在 _packet_read rc = self._packet_handle() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 2936 行,在 _packet_handle return self._handle_publish() 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 3216 行,在 _handle_publish self._handle_on_message(留言) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第 3444 行,在 _handle_on_message self.on_message(自己,self._userdata,消息) 文件“/Users/seanclark/Documents/imagesearch/basic-motion-detection/picam.py”,第 80 行,在 on_message 中 发送图片() 文件“/Users/seanclark/Documents/imagesearch/basic-motion-detection/picam.py”,第 92 行,在 sendimage 中 encodedimage = "数据:image/jpeg;base64,"+base64.b64encode(thumbnailjpg) 类型错误:只能将 str(不是“字节”)连接到 str

我知道这是一个 TypeError,但尝试了各种方法似乎无法摆脱它。请问是不是我的做法有误?

谢谢。

SEan

出于同样的原因,我看到了下面的用法

import base64
import numpy as np
import cv2

img = cv2.imread('test.jpg')
_, im_arr = cv2.imencode('.jpg', img)  # im_arr: image in Numpy one-dim array format.
im_bytes = im_arr.tobytes()
im_b64 = base64.b64encode(im_bytes)

在上面的代码中,我们首先将Numpy ndarray 格式的图像保存到im_arr,这是一个一维的Numpy 数组。然后我们使用这个数组的 tobytes() 方法得到二进制格式的图像。