调用cv2.findContours报ValueError解包值不足(期望3得2)是什么原因?
问题排查:ValueError: not enough values to unpack (expected 3, got 2)
该报错由OpenCV版本迭代导致的cv2.findContours返回值数量变化引发:
- OpenCV 3.x 版本中,
cv2.findContours返回3个参数,顺序为「处理后的图像、轮廓列表、轮廓层级信息」,你当前使用的_, contours, _ =写法是适配3.x版本的语法。 - OpenCV 4.x 及以上版本中,官方移除了第一个返回的图像参数,该函数仅返回2个参数:「轮廓列表、轮廓层级信息」,用3个变量接收就会触发解包数量不匹配的错误。
解决方法
方法1:适配高版本OpenCV(4.x及以上)
直接修改解包代码,用2个变量接收返回值即可:
import cv2 import numpy as np contours, _ = cv2.findContours(Nucleus_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) pad_del = np.zeros_like(Nucleus_img)
方法2:兼容多版本OpenCV
如果需要代码同时适配3.x和4.x版本的OpenCV,可以用索引取固定位置的返回值,不受返回数量影响:
import cv2 import numpy as np contour_res = cv2.findContours(Nucleus_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 无论返回2个还是3个值,轮廓列表都在倒数第二位 contours = contour_res[-2] pad_del = np.zeros_like(Nucleus_img)
内容的提问来源于stack exchange,提问作者Jacqueline Rose Alipo-on
相关产品推荐
相关产品推荐

