调用cv2.findContours绘制图像轮廓时出现too many values to unpack (expected 2)报错
报错触发原因
该问题是OpenCV 版本差异导致的函数返回值结构不匹配:
- OpenCV 3.x及更早版本中,
cv2.findContours共返回3个值:被函数原生修改的二值图、轮廓列表、轮廓层级关系 - OpenCV 4.0及以上版本中,
cv2.findContours移除了返回二值图的逻辑,仅返回2个值:轮廓列表、轮廓层级关系
当前运行代码的环境搭载的是3.x及更早版本的OpenCV,但代码按照4.x版本的规则编写了2个值的解包逻辑,因此触发解包数量不匹配的报错。
解决方案
任选一种方式修复即可:
- 适配当前本地环境的老版本OpenCV:修改函数调用行的解包逻辑,用下划线占位忽略不需要的首个返回值,修改后的代码行:
_, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) - 升级本地OpenCV到4.0及以上版本,升级后原本编写的两值解包代码可以正常运行,无需额外修改。
附带提示
代码中有一处和当前报错无关的小问题:在单通道的灰度图imgray上使用三通道格式的绿色(0, 255, 0)绘制轮廓时,OpenCV仅会取该颜色的第一个分量作为单通道图的绘制值,最终画出的轮廓是黑色而非预期的绿色。如果需要在灰度图上显示高对比度的轮廓,可以将该位置的绘制颜色改为单通道灰度值,比如255(纯白色)。
内容的提问来源于stack exchange,提问作者zma
相关产品推荐
相关产品推荐

