OpenCV python:ValueError:要解压缩的值太多

时间:2014-08-26 11:39:34

标签: python opencv image-processing

我正在编写一个opencv程序,我在另一个stackoverflow问题上找到了一个脚本:Computer Vision: Masking a human hand

当我运行脚本答案时,我收到以下错误:

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)

感谢任何帮助!

8 个答案:

答案 0 :(得分:121)

我从OpenCV Stack Exchange网站得到了答案。 Answer

回答:

  

我打赌你正在使用当前的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。

答案 1 :(得分:15)

你必须改变这一行;

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

答案 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)

答案 3 :(得分:4)

你需要做的就是添加&#39; _&#39;你没有使用所需的var,最初由:

给出

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

答案 4 :(得分:2)

蟒蛇是对的。
你不能从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)

答案 5 :(得分:0)

这适用于所有@string版本:

cv2

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

如果错误是:

<块引用>

没有足够的值来解包(预期为 3,得到 2)

然后使用:

ctrs,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

代替

_,ctrs,hier=cv2.findContours(im_th.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)