Python OpenCV调用cv2.contourArea返回断言错误如何解决
错误原因
触发该断言报错的核心原因是传入cv2.contourArea的参数不符合输入要求,最常见的诱因是OpenCV版本差异导致cv2.findContours返回值接收错误,小概率是输入图像不满足轮廓检测要求:
- 版本兼容问题:
- OpenCV 3.x 版本中,
cv2.findContours共返回3个值,顺序为处理后的输入图像, 检测到的轮廓列表, 轮廓层级关系数组 - OpenCV 4.x 及以上版本中,
cv2.findContours共返回2个值,顺序为检测到的轮廓列表, 轮廓层级关系数组
原代码写的_,contours = cv2.findContours(...)在OpenCV 3.x环境下运行时,实际赋值给contours变量的是轮廓层级关系数组,而非存储轮廓点坐标的列表,数据结构、数值类型完全不满足cv2.contourArea的输入要求,直接触发断言。
- OpenCV 3.x 版本中,
- 其他可能诱因:
- 传入
findContours的图像不是单通道8位二值图(比如直接传入彩色图、浮点型数值的图),导致轮廓检测返回结果格式异常 - 图像中未检测到任何有效轮廓时,没有做边界判断直接访问未初始化的轮廓变量
- 传入
修改方案
首先做跨版本的返回值兼容处理,同时增加空轮廓边界判断,修正后的可运行代码如下:
import cv2 import numpy as np def find_biggest_contour(image): # 复制图像避免修改原数据 image = image.copy() # 自动兼容不同OpenCV版本的返回值顺序,固定取到轮廓列表和层级 contours, hierarchy = cv2.findContours(image, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[-2:] # 未检测到轮廓时直接返回同尺寸空掩膜 if not contours: return np.zeros(image.shape, np.uint8) # 遍历计算轮廓面积,筛选最大轮廓 max_area = -1 biggest_contour = None for cnt in contours: area = cv2.contourArea(cnt) if area > max_area: biggest_contour = cnt max_area = area # 创建空掩膜绘制最大轮廓 mask = np.zeros(image.shape, np.uint8) cv2.drawContours(mask, [biggest_contour], -1, 255, -1) return mask
关键修改点说明:
- 对
findContours的返回值做[-2:]切片处理,无论OpenCV版本是3.x还是4.x,都能准确拿到轮廓列表,从根源解决返回值拿错的问题 - 增加空轮廓判断逻辑,避免图像中无有效轮廓时触发变量未定义、传入空值的报错
- 提前初始化
biggest_contour变量,规避极端场景下的变量引用错误 - 调用该函数前需保证传入的图像是经过阈值处理的单通道8位二值图,不可直接传入彩色BGR图像。
内容的提问来源于stack exchange,提问作者Miller
相关产品推荐
相关产品推荐

