在运行我的代码之后,我得到错误消息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]
4条答案
按热度按时间kdfy810k1#
根据OpenCV版本的不同,
findContours()
具有不同的返回签名。在OpenCV 3.4.X中,
findContours()
返回3个项目在OpenCV 4.1.X中,
findContours()
返回2个项目要在不使用imutils的情况下手动获取等值线,可以检查返回的元组中的项目数量
ss2ws0br2#
这样做
相反
a7qyws3x3#
我从Python/OpenCV中的@nathancy学到了这种方法,它兼顾了两种方法。
unftdfkk4#
findContours返回一个元组,这个元组可以包含2个值或者3个值,这取决于你安装的cv 2的版本。(正如@nathancy提到的)
顾名思义,grab_contours从该元组中获取轮廓值,但由于您已经将元组解压缩为三个变量(image、contours、hier),因此没有什么可获取的。
为了让这个方法工作,不要解压缩你的元组。
现在你得到了一个元组中的返回值,其中一个返回值实际上是轮廓,所以现在你可以使用你的grab_contours方法从元组中检索轮廓。
现在你的cnts变量包含了你的轮廓值,你可以继续对它们进行排序了。
如果你使用PyCharm作为你的IDE,你可以通过选择你想看的方法并在Mac上按“命令+B”来查看源代码。这将帮助你更好地理解代码。
希望有帮助。干杯。