使用OpenCV保存处理后视频时出现0xc10100be错误求助
错误原因与解决方法
核心问题点
- 你使用的
mp4v编码器默认仅支持写入3通道BGR格式的帧,但cv2.inRange输出的mask是单通道灰度图,格式不匹配导致写入的视频文件结构损坏,播放器解码时就会抛出0xc10100be错误。 - 手动填写的尺寸容易和实际处理后的帧尺寸不匹配,也会引发同类写入错误。
修复方案
仅需要改动两处代码即可:
- 写入视频前,把单通道mask转为3通道BGR格式
- 建议直接读取处理后帧的实际尺寸初始化
VideoWriter,避免手动填错尺寸
修改后的完整代码
import cv2 import numpy as np video = cv2.VideoCapture(".......mp4") # 先取一帧处理得到实际尺寸,避免手动填错 ret, test_frame = video.read() width, height = 450, 960 pts1 = np.float32([[68, 755], [1908, 733], [63, 803], [1909, 787]]) pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]]) matrix = cv2.getPerspectiveTransform(pts1, pts2) test_Img = cv2.warpPerspective(test_frame, matrix, (width, height)) test_imgOutput = cv2.rotate(test_Img, cv2.ROTATE_90_COUNTERCLOCKWISE) test_hsv = cv2.cvtColor(test_imgOutput, cv2.COLOR_BGR2HSV) test_mask = cv2.inRange(test_hsv, np.array([19,73,20]), np.array([60,237,188])) # 拿实际mask的尺寸初始化Writer,注意OpenCV尺寸是(宽,高) out_h, out_w = test_mask.shape result = cv2.VideoWriter('filename.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 15.0, (out_w, out_h)) # 把视频指针拨回开头 video.set(cv2.CAP_PROP_POS_FRAMES, 0) while(True): ret, frame = video.read() if ret == True: width, height = 450, 960 pts1 = np.float32([[68, 755], [1908, 733], [63, 803], [1909, 787]]) pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]]) matrix = cv2.getPerspectiveTransform(pts1, pts2) Img = cv2.warpPerspective(frame, matrix, (width, height)) imgOutput = cv2.rotate(Img, cv2.ROTATE_90_COUNTERCLOCKWISE) imgHSV = cv2.cvtColor(imgOutput, cv2.COLOR_BGR2HSV) h_min = 19 h_max = 60 s_min = 73 s_max = 237 v_min = 20 v_max = 188 lower = np.array([h_min, s_min, v_min]) upper = np.array([h_max, s_max, v_max]) mask = cv2.inRange(imgHSV, lower, upper) # 单通道转3通道,适配mp4v编码器要求 mask_3ch = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) result.write(mask_3ch) cv2.imshow('Output', mask) if cv2.waitKey(1) & 0xFF == ord('s'): break else: break video.release() result.release() cv2.destroyAllWindows() print("The video was successfully saved")
如果你不需要保留mp4格式,也可以更换支持单通道写入的编码器,比如*'XVID'对应输出avi格式的视频,也能解决格式不匹配问题。
内容的提问来源于stack exchange,提问作者Simo
相关产品推荐
相关产品推荐

