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()
关键修改说明
- 将
c的初始值改为None,避免初始类型不匹配; - 把
cv2.drawContours移至if len(contours) > 0分支内,确保仅在有有效轮廓时执行绘制; - 用
[c]将单个轮廓包装为列表序列,满足drawContours的参数要求; - 优化方向判断条件为
elif,简化逻辑并提升效率。
内容的提问来源于stack exchange,提问作者Imon
相关产品推荐
相关产品推荐

