OpenCV python:ValueError:太多值无法解包


77

我正在编写一个opencv程序,并且在另一个stackoverflow问题上找到了一个脚本:Computer Vision:遮盖人的手

运行脚本化答案时,出现以下错误:

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)

任何帮助表示赞赏!


请参阅我在下面的解决方案中发布的答案。
ahmadux 2014年

Answers:


146

我从OpenCV Stack Exchange网站获得了答案。回答

答案:

我敢打赌,您正在使用当前的OpenCV的master分支:此处的return语句已更改,请参阅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。


我不知道该如何解决?
grep

1
@grep有第三个return语句。比较有问题的人和答案行
伊甸园

26

这适用于所有 cv2版本:

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

说明:通过使用[-2:],我们基本上是从tuple返回的最后两个值cv2.findContours。由于在某些版本中它返回,(image, contours, hierarchy)而在其他版本中它返回(contours, hierarchy)contours, hierarchy始终是最后两个值。


1
AHH-maz​​innnnnnn

1
也为我工作。
艾哈迈德·

2
令人赞叹的
骇客-TechAJ

16

您必须更改此行;

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

3
欢迎来到StackOverflow!尽管人们总是很乐于回答,但这个问题是2年前提出的,并且已经有了公认的解决方案。而且,您不必告诉他将线更改为的必要条件。请尝试通过提供答案来避免在顶部出现“颠簸”的问题,除非尚未将问题标记为已解决,或者您找到了一种解决该问题的更好的替代方法:)
黑曜石时代

5

我正在使用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中使用的,所以我只是在最左侧添加了一个'_'来替换了下面的一个代码(IN python3.x)

_,cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

最简单的解决方案


2

python是正确的。
您无法从turple中解压3个值并将它们放在两个turple中 contours, _ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

采用

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


0

没什么大不了的,只是您可能正在使用open-cv 3.something,它在错误时返回3个值,并且您必须只捕获2个,只需在轮廓变量之前添加任何随机变量-

_,contours,_ = cv2.findContours(skin_ycrcb, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.