调用 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:解包的值太多
Tensorboard - ValueError:解包的值太多(预期 2)