OpenCV Python: cv2.findContours - ValueError: 解包值过多
我正在写一个opencv程序,发现了另一个StackOverflow问题上的一个脚本: 计算机视觉:给人手打遮罩
当我运行这个脚本时,出现了以下错误:
Traceback (most recent call last):
File "skinimagecontour.py", line 13, in <module>
contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
ValueError: too many values to unpack
代码如下:
import sys
import numpy
import cv2
im = cv2.imread('Photos/test.jpg')
im_ycrcb = cv2.cvtColor(im, cv2.COLOR_BGR2YCR_CB)
skin_ycrcb_mint = numpy.array((0, 133, 77))
skin_ycrcb_maxt = numpy.array((255, 173, 127))
skin_ycrcb = cv2.inRange(im_ycrcb, skin_ycrcb_mint, skin_ycrcb_maxt)
cv2.imwrite('Photos/output2.jpg', skin_ycrcb) # Second image
contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for i, c in enumerate(contours):
area = cv2.contourArea(c)
if area > 1000:
cv2.drawContours(im, contours, i, (255, 0, 0), 3)
cv2.imwrite('Photos/output3.jpg', im)
任何帮助都非常感谢!
9 个回答
你需要做的就是在你不使用的变量前加上'_',原本的代码是:
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
改成:
_ , contours, _ = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
这里有原始文档的链接:
https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html
我正在使用python3.x和opencv 4.1.0。
我在下面的代码中遇到了错误:
cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
ERROR : too many values to Unpack
然后我发现上面的代码是用于python2.x的。
所以我在最左边加了一个'_',把上面的代码替换成了下面的代码(在python3.x中)。你看看:
_,cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
你需要修改这一行:
image, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
这个方法在所有的 cv2
版本中都有效:
contours, hierarchy = cv2.findContours(
skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]
解释:使用 [-2:]
的意思是我们从 cv2.findContours
返回的 tuple
中取最后两个值。因为在某些版本中,它返回的是 (image, contours, hierarchy)
,而在其他版本中,它返回的是 (contours, hierarchy)
,所以 contours
和 hierarchy
始终是最后两个值。
我在OpenCV的Stack Exchange网站上找到了答案。答案链接
答案是:
我敢打赌你正在使用当前的OpenCV主分支:在这里,返回的结果发生了变化,具体可以查看这个链接 http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=findcontours。
所以,你需要把相关的代码行改成:
_, contours, _= cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
或者:因为现在的版本还不稳定,你可能会遇到更多问题,所以建议你使用OpenCV的当前稳定版本2.4.9。