OpenCV python:ValueError:解包的值太多
Posted
技术标签:
【中文标题】OpenCV python:ValueError:解包的值太多【英文标题】:OpenCV python: ValueError: too many values to unpack 【发布时间】:2014-10-19 17:28:44 【问题描述】:我正在编写一个 opencv 程序,并在另一个 *** 问题上找到了一个脚本: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)
感谢任何帮助!
【问题讨论】:
查看我在下面发布的解决方案的答案。 【参考方案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)
【讨论】:
欢迎来到 ***!虽然答案总是很受欢迎,但这个问题是 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 有第三个返回语句。比较有问题的和答案行以上是关于OpenCV python:ValueError:解包的值太多的主要内容,如果未能解决你的问题,请参考以下文章
python调用cv2.findContours时报错:ValueError: not enough values to unpack (expected 3, got 2)
Python:使用 OpenCV 从左上角到右下角对项目进行排序