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