Contours元组的长度必须为2或3,否则opencv再次更改其cv.findcontours签名

bpzcxfmw  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(215)

在运行我的代码之后,我得到错误消息contours tuple must have length 2 or 3,否则opencv再次更改了它们的返回签名。我当前运行的是opencv的3.4.3.18版本。当我运行imutils ver 0. 5. 2获取contours时,出现了这个问题
这段代码找到了轮廓线,并在做了一些边缘检测后返回找到的轮廓线。然后算法使用imutils来获取轮廓线。这是正确的方法吗?或者有什么最新的方法可以代替imutils来获取轮廓线?
请参见以下示例:

image, contours, hier = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

cnts = imutils.grab_contours(contours)

cnts = sorted(contours, key = cv.contourArea, reverse = True)[:5]
kdfy810k

kdfy810k1#

根据OpenCV版本的不同,findContours()具有不同的返回签名。
在OpenCV 3.4.X中,findContours()返回3个项目

image, contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

在OpenCV 4.1.X中,findContours()返回2个项目

contours, hierarchy = cv.findContours(image, mode, method[, contours[, hierarchy[, offset]]])

要在不使用imutils的情况下手动获取等值线,可以检查返回的元组中的项目数量

items = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
contours = items[0] if len(items) == 2 else items[1]
ss2ws0br

ss2ws0br2#

这样做

items = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(items)

相反

image, contours, hier = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(contours)
a7qyws3x

a7qyws3x3#

我从Python/OpenCV中的@nathancy学到了这种方法,它兼顾了两种方法。

contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
unftdfkk

unftdfkk4#

findContours返回一个元组,这个元组可以包含2个值或者3个值,这取决于你安装的cv 2的版本。(正如@nathancy提到的)
顾名思义,grab_contours从该元组中获取轮廓值,但由于您已经将元组解压缩为三个变量(image、contours、hier),因此没有什么可获取的。
为了让这个方法工作,不要解压缩你的元组。

cnt = cv.findContours(edged.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)

现在你得到了一个元组中的返回值,其中一个返回值实际上是轮廓,所以现在你可以使用你的grab_contours方法从元组中检索轮廓。

cnts = imutils.grab_contours(cnt)

现在你的cnts变量包含了你的轮廓值,你可以继续对它们进行排序了。
如果你使用PyCharm作为你的IDE,你可以通过选择你想看的方法并在Mac上按“命令+B”来查看源代码。这将帮助你更好地理解代码。
希望有帮助。干杯。

相关问题