OpenCV中用filter过滤小面积轮廓报错,求正确实现方法
问题根源
你遇到的错误是因为filter()函数返回的是迭代器对象,而cv2.drawContours()要求传入的轮廓参数必须是列表、元组这类支持序列协议的结构,迭代器不满足这个要求,所以触发了参数错误。
正确的过滤方法
只需要把filter()的结果转换成列表即可,有两种常用写法:
方法1:用list()转换filter结果
修改你的drawCnts函数:
def drawCnts(img, cnts): # 把filter返回的迭代器转成列表 cnts = list(filter(lambda cnt: cv2.contourArea(cnt)> 400, cnts)) cv2.drawContours(img, cnts, -1, (0, 255, 0), 3) imshow(img)
方法2:用列表推导式(更直观的Python写法)
这种写法可读性更强,也不会有迭代器的问题:
def drawCnts(img, cnts): # 直接用列表推导式筛选面积大于400的轮廓 cnts = [cnt for cnt in cnts if cv2.contourArea(cnt) > 400] cv2.drawContours(img, cnts, -1, (0, 255, 0), 3) imshow(img)
两种写法都能解决问题,列表推导式在实际项目中更常用,因为代码逻辑更清晰,调试也更方便。
内容的提问来源于stack exchange,提问作者test tes
相关产品推荐
相关产品推荐

