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

OpenCV黑色线条检测报错:无法解析'contours'参数求助

解决OpenCV drawContours报错:Can't parse 'contours'

错误根源

cv2.drawContours的第二个参数必须是轮廓的序列(列表或numpy数组),你的代码存在两个核心问题:

  • 初始状态下c = 0,当画面中没有检测到黑色轮廓时,直接把整数0传入drawContours,完全不符合参数类型要求;
  • 即使检测到轮廓,c = max(contours, key=cv2.contourArea)得到的是单个轮廓对象,不是序列类型,传入后依然会触发参数错误。

修复方案

把drawContours的调用放到检测到轮廓的分支内部,同时确保传入的参数是轮廓序列。以下是修复后的完整代码:

import cv2
import numpy as np

cap = cv2.VideoCapture(0)
cap.set(3, 160)
cap.set(4, 120)
c = None  # 初始化为None,避免用0这种错误类型

while True:
    ret, frame = cap.read()
    low_b = np.uint8([5,5,5])
    high_b = np.uint8([0,0,0])
    mask = cv2.inRange(frame, high_b, low_b)
    contours, hierarchy = cv2.findContours(mask, 1, cv2.CHAIN_APPROX_NONE)
    
    if len(contours) > 0:
        c = max(contours, key=cv2.contourArea)
        M = cv2.moments(c)
        if M["m00"] !=0:
            cx = int(M['m10']/M['m00'])
            cy = int(M['m01']/M['m00'])
            print(f"CX : {cx}  CY : {cy}")
            if cx >= 120:
                print("Left")
            elif 40 < cx < 120:
                print("On Track!!")
            elif cx <= 40:
                print("Right")
            cv2.circle(frame,(cx,cy),5,(255,255,255),-1)
        
        # 仅当存在有效轮廓时绘制,用[c]将单个轮廓包装为序列
        cv2.drawContours(frame, [c], -1, (0,255,0), 1)
    else:
        # 无轮廓时可添加提示逻辑,或直接跳过绘制
        pass

    cv2.imshow("Mask",mask)
    cv2.imshow("Frame",frame)
    if cv2.waitKey(1) & 0xff == ord('q'):
       break

cap.release()
cv2.destroyAllWindows()

关键修改说明

  1. 将c的初始值改为None,避免初始类型不匹配;
  2. 把cv2.drawContours移至if len(contours) > 0分支内,确保仅在有有效轮廓时执行绘制;
  3. 用[c]将单个轮廓包装为列表序列,满足drawContours的参数要求;
  4. 优化方向判断条件为elif,简化逻辑并提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:34:59