调用 cv2.findContours 解包的值太多

Posted

技术标签:

【中文标题】调用 cv2.findContours 解包的值太多【英文标题】:too many values to unpack calling cv2.findContours 【发布时间】:2017-10-13 02:28:39 【问题描述】:

我是 python 初学者。我试图运行这段代码:

#applying closing function 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(th3, cv2.MORPH_CLOSE, kernel)

#finding_contours 
(cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in cnts:
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    cv2.drawContours(frame, [approx], -1, (0, 255, 0), 2)

当我召唤 mask.py 时,我得到了这个 ValueError :

Traceback (most recent call last):
  File "mask.py", line 22, in <module>
    (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
ValueError: too many values to unpack

这段代码有什么问题?

【问题讨论】:

你试过去掉括号吗? cnts, heir = cv2.findContours(close.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) OpenCV 的哪个版本?我假设您使用的是 3.x,但编写的是用于 2.x 分支的代码。有一些 API 更改——其中之一是 findContours 返回 3,而不是原来的 2 值。阅读文档! ***.com/questions/39598724/…的可能重复 compatibility issue with contourArea in openCV 3的可能重复 【参考方案1】:

您在编写用于 2.x 分支的代码时,似乎使用的是 OpenCV 3.x 版。这两个分支之间有一些 API 更改。由于您使用的是 Python,因此您可以获得方便的帮助 - 确保与文档一起使用它。

OpenCV 2.x:

>>> import cv2
>>> help(cv2.findContours)
Help on built-in function findContours in module cv2:

findContours(...)
    findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy

OpenCV 3.x:

>>> import cv2
>>> help(cv2.findContours)
Help on built-in function findContours:

findContours(...)
    findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> image, contours, hierarchy

这意味着在您的脚本中,使用 OpenCV 3.x 时调用 findContours 的正确方法类似于

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

更新(2018 年 12 月)

在 OpenCV 4.x 中,findContours 仅返回 2 个值。

>>> help(cv2.findContours)
Help on built-in function findContours:

findContours(...)
    findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
    .   @brief Finds contours in a binary image.

【讨论】:

以上是关于调用 cv2.findContours 解包的值太多的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV python:ValueError:解包的值太多

ValueError:解包的值太多(Python 2.7)

Python:解包的值太多(字典)

Tensorboard - ValueError:解包的值太多(预期 2)

异常类型:ValueError 异常值:解包的值太多 - Django

syncdb - ValueError:解包的值太多