Python+OpenCV报错:cv2.findContours解包期望3值仅得2值求助
解决cv2.findContours触发的ValueError问题
问题根源
你遇到的not enough values to unpack (expected 3, got 2)错误,核心原因是OpenCV版本差异导致cv2.findContours的返回值数量不同:
- OpenCV 3.x 版本返回3个值:
图像副本, 轮廓列表, 层级信息 - OpenCV 4.x 及以上版本仅返回2个值:
轮廓列表, 层级信息
你代码中应该是按照3.x的写法去解包4.x的返回结果,因此触发了解包数量不匹配的错误。
修复方法
方法1:跨版本兼容写法
直接忽略3.x版本返回的无意义图像副本,用以下写法适配所有OpenCV版本:
# 兼容所有版本的写法 _, contours, hierarchy = cv2.findContours(your_threshold_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
如果不需要层级信息,也可以简化为:
contours, _ = cv2.findContours(your_threshold_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
方法2:对应版本调整写法
先运行以下代码确认你的OpenCV版本:
import cv2 print(cv2.__version__)
- 若为3.x版本:保持3个值的解包写法即可
- 若为4.x+版本:改为2个值的解包格式:
contours, hierarchy = cv2.findContours(your_threshold_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
额外说明
你已确认detect_ball函数返回三个有效值,说明错误确实仅出在cv2.findContours的解包环节,调整上述代码后即可解决问题。如果仍有异常,可以补充detect_ball函数中cv2.findContours的具体调用代码,方便进一步排查。
内容的提问来源于stack exchange,提问作者Narayanan R
相关产品推荐
相关产品推荐

