问题描述
我想从 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
我可以看到它是一个类型错误,但是已经尝试了各种方法并且似乎无法摆脱它。不知道是不是我的做法有误?
谢谢。
东南亚
解决方法
我已经看到下面出于同样的原因使用了
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() 方法得到二进制格式的图像。