You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenCV保存处理后视频时出现0xc10100be错误求助

错误原因与解决方法

核心问题点

  • 你使用的mp4v编码器默认仅支持写入3通道BGR格式的帧,但cv2.inRange输出的mask是单通道灰度图,格式不匹配导致写入的视频文件结构损坏,播放器解码时就会抛出0xc10100be错误。
  • 手动填写的尺寸容易和实际处理后的帧尺寸不匹配,也会引发同类写入错误。

修复方案

仅需要改动两处代码即可:

  1. 写入视频前,把单通道mask转为3通道BGR格式
  2. 建议直接读取处理后帧的实际尺寸初始化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:06:03