【问题标题】:OpenCV python: ValueError: too many values to unpackOpenCV python:ValueError:解包的值太多
【发布时间】:2014-10-19 17:28:44
【问题描述】:

我正在编写一个 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)

感谢任何帮助!

【问题讨论】:

  • 查看我在下面发布的解决方案的答案。

标签: python opencv image-processing


【解决方案1】:

这适用于所有 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 总是最后两个值。

【讨论】:

  • 啊-mazinnnnnnn
  • 也为我工作。
  • 这是惊人的黑客攻击
【解决方案2】:

如果错误是:

没有足够的值来解包(预期 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)

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 最简单的解决方案
      【解决方案5】:

      你需要做的只是在你没有使用所需的 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

      【讨论】:

        【解决方案6】:

        python 是对的。
        你不能从 turple 中解压 3 个值并将它们放在一个 2 的 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)

        【讨论】:

          【解决方案7】:

          你必须改变这一行;

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

          【讨论】:

          • 欢迎来到 StackOverflow!虽然答案总是很受欢迎,但这个问题是 2 年前提出的,并且已经有了一个公认的解决方案。在那,你不会告诉他他必须将行 更改为。请尝试通过提供答案来避免将问题“颠倒”到顶部,除非该问题尚未标记为已解决,或者您找到了解决该问题的更好的替代方法:)
          【解决方案8】:

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

          答案:

          我打赌你正在使用当前 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 有第三个返回语句。比较有问题的和答案行
          猜你喜欢
          • 2022-07-05
          • 1970-01-01
          • 2018-09-17
          • 2015-03-15
          • 2021-07-31
          • 2017-08-09
          • 1970-01-01
          • 2018-07-15
          • 2017-11-25
          相关资源
          最近更新 更多