5

运行我的代码后,我收到错误消息 contours tuple must have length 2 或 3,否则 opencv 再次更改了它们的返回签名。我目前正在运行 3.4.3.18 版的 opencv。当我抓取运行 imutils 版本 0.5.2 的轮廓时会出现问题

代码找到计数并返回在进行一些边缘检测后找到的轮廓。然后该算法使用 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

3 回答 3

1

根据 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]
于 2019-05-15T23:12:24.527 回答
0

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

contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
于 2020-04-28T17:35:42.470 回答
0

这样做

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)
于 2020-04-28T14:50:58.277 回答