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

时间:2021-01-26 23:00:22

标签: python opencv 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=True) 文件“/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/paho/mqtt/client.py”,第1779行,在loop_forever中 rc = self.loop(timeout, 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 返回 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(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, self._userdata, message) 文件“/Users/seanclark/Documents/imagesearch/basic-motion-detection/picam.py”,第 80 行,在 on_message 发送图像() 文件“/Users/seanclark/Documents/imagesearch/basic-motion-detection/picam.py”,第 92 行,在 sendimage 编码图像 = "数据:图像/jpeg;base64,"+base64.b64encode(thumbnailjpg) 类型错误:只能将 str(不是“字节”)连接到 str

我可以看到它是一个类型错误,但是已经尝试了各种方法并且似乎无法摆脱它。不知道是不是我的做法有误?

谢谢。

东南亚

1 个答案:

答案 0 :(得分:0)

我已经看到下面出于同样的原因使用了

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() 方法得到二进制格式的图像。

相关问题