如何解决OpenCV Python中Contours(轮廓)相关报错问题?
OpenCV轮廓处理报错解决方案
错误原因
错误出在for contour in contours:这一行。cv2.findContours在OpenCV 4.x版本中的返回值为**(contours, hierarchy)**:
contours是轮廓列表,每个元素是单个轮廓的坐标数组,可直接用于cv2.boundingRect等轮廓处理函数hierarchy是轮廓的层级关系数据,并非轮廓坐标集合
你的代码直接遍历cv2.findContours的完整返回值(包含轮廓列表和层级数据),当循环到hierarchy时,cv2.boundingRect无法解析非轮廓格式的数据,因此触发参数错误。
修正后的代码
# 正确接收OpenCV4.x版本的findContours返回值 contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cnts = contours screenCnt = 0 # 遍历轮廓列表(而非完整返回值) for contour in cnts: # 获取轮廓的外接矩形 x,y,w,h = cv2.boundingRect(contour) # 可选:添加绘制矩形的代码 # cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,255), 2) ##### 新增代码..用于阈值处理 for c in cnts: # 逼近轮廓 peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.02 * peri, True) # 若逼近后的轮廓有四个点,则认为找到目标区域 if len(approx) == 4: screenCnt = approx break
兼容OpenCV3.x版本的补充
如果使用OpenCV 3.x,cv2.findContours返回值为**(image, contours, hierarchy)**,需修改接收代码:
_, contours, hierarchy = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
内容的提问来源于stack exchange,提问作者GaneshSai_239
相关产品推荐
相关产品推荐

