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

OpenCV findContours函数二进制输入仍报格式不支持错误排查

问题原因与解决方法

核心错误

你代码里的cv.cvtColor(img[1], cv.IMREAD_GRAYSCALE)用错了参数:cv.IMREAD_GRAYSCALE是用于cv.imread()读取灰度图的标识,不是cv.cvtColor的颜色转换参数。这个错误会导致生成的prepared_frame并非标准的8位单通道灰度图(CV_8UC1),后续即使做了阈值处理,图像格式依然不满足cv.findContours的要求,从而触发报错。

修复步骤

  1. 修正颜色转换参数:把cv.IMREAD_GRAYSCALE替换为cv.COLOR_BGR2GRAY,这才是将BGR格式帧转为灰度图的正确标识。
  2. 增加帧读取有效性检查:cap.read()返回的第一个值ret表示是否成功读取帧,需要先判断ret为True再处理,避免读到空帧引发异常。
  3. 适配OpenCV4的返回值:OpenCV4中cv.findContours返回两个值(轮廓列表、层级信息),建议显式接收这两个返回值。

修正后的核心代码

filename = os.fsdecode(file)
frame_count = 0
previous_frame = None
ipath = data + "/" + filename
cap = cv.VideoCapture(ipath)

while True:
    ret, frame = cap.read()
    # 检查是否成功读取帧
    if not ret:
        break
    frame_count += 1

    # 修正颜色转换参数
    prepared_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    prepared_frame = cv.GaussianBlur(src=prepared_frame, ksize=(5,5), sigmaX=0)

    if frame_count == 1:
        previous_frame = prepared_frame
        continue
                
    diff_frame = cv.absdiff(src1=previous_frame, src2=prepared_frame)
    previous_frame = prepared_frame
            

    kernel = np.ones((5, 5))
    diff_frame = cv.dilate(diff_frame, kernel, 1)

    thresh_frame = cv.threshold(src=diff_frame, thresh=20, maxval=255, type=cv.THRESH_BINARY)[1]

    # 适配OpenCV4的返回值
    contours, hierarchy = cv.findContours(image=thresh_frame, mode=cv.RETR_EXTERNAL, method=cv.CHAIN_APPROX_SIMPLE)

内容的提问来源于stack exchange,提问作者Bristle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:38:15