OpenCV Python: cv2.findContours - ValueError: 解包值过多

88 投票
9 回答
125746 浏览
提问于 2025-04-18 18:34

我正在写一个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 个回答

5

你需要做的就是在你不使用的变量前加上'_',原本的代码是:

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

6

我正在使用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)
15

你需要修改这一行:

image, contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
50

这个方法在所有cv2 版本中都有效:

contours, hierarchy = cv2.findContours(
    skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2:]

解释:使用 [-2:] 的意思是我们从 cv2.findContours 返回的 tuple 中取最后两个值。因为在某些版本中,它返回的是 (image, contours, hierarchy),而在其他版本中,它返回的是 (contours, hierarchy),所以 contourshierarchy 始终是最后两个值。

160

我在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。

撰写回答