使用cv2与cPickle编解码摄像头帧时遇TypeError错误求助
解决
TypeError: buf is not a numerical tuple错误 我来帮你搞定这个问题!你遇到的报错是因为对cv2.imencode的返回值处理有误,咱们一步步理清楚:
问题根源
cv2.imencode('.jpg', frame)其实返回的是一个二元组:
- 第一个元素是布尔值(
True/False),表示编码操作是否成功 - 第二个元素才是编码后的JPG字节缓冲区
你现在直接把整个元组传给cPickle.dumps(),反序列化后得到的还是这个元组,但cv2.imdecode()只接受单独的字节数据作为输入,自然就抛出buf is not a numerical tuple的错误了。
修复方案
只需要把imencode返回的字节缓冲区单独提取出来序列化,反序列化后直接传给imdecode就行,具体步骤:
- 拆分
imencode的返回值,拿到编码后的字节数据 - 序列化时只处理这个字节数据
- 反序列化后直接用这个数据解码
修正后的完整代码
import cv2 import cPickle cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() # 拆分imencode的返回值,拿到编码后的字节缓冲区 success, encoded_frame = cv2.imencode('.jpg', frame) if not success: print("编码失败,跳过当前帧") continue # 只序列化编码后的字节数据 data = cPickle.dumps(encoded_frame) # 反序列化得到字节缓冲区 res = cPickle.loads(data) # 用字节缓冲区解码 small_frame = cv2.imdecode(res, 1) print(res)
这样修改后,就不会再出现那个类型错误了。另外建议加上编码成功的判断,避免编码失败时后续操作出问题~
内容的提问来源于stack exchange,提问作者Aakash aggarwal
相关产品推荐
相关产品推荐

