findContours返回具有重复点的轮廓

时间:2019-06-04 12:58:56

标签: python opencv opencv-contour

OpenCV的findContours有时会返回不良结果

代码段尝试在边缘图像中找到最大的轮廓。

在“错误”示例中,似乎轮廓的大多数顶点都是不必要的重复。这将导致随后出现错误的contourArea和pointPolygonTest行为。

import cv2
import imutils
from scipy import misc

edges = misc.imread('edges3.png')

cnts = cv2.findContours(edges.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
sorted_cnts = sorted(cnts, key = lambda c:cv2.arcLength(c,True), reverse = True)
largest_cnt = sorted_cnts[0]

print("Largest contour area",cv2.contourArea(largest_cnt))
print("Largest contour arc length",cv2.arcLength(largest_cnt,True))
print("Largest contour num of vertx",len(largest_cnt))

enter image description here

错误代码输出:

Largest contour area 14.0
Largest contour arc length 2639.200133085251
Largest contour num of vertx 667

enter image description here

良好代码输出:

Largest contour area 95534.0
Largest contour arc length 1321.8721450567245
Largest contour num of vertx 340

随附的两张照片几乎相同,应该返回相似的结果。但是,第一个返回的轮廓面积很小,与第二个相比,弧长和顶点数增加了一倍。

1 个答案:

答案 0 :(得分:1)

我无法在评论中上传图片。您的边缘检测是否可能有故障并且存在一些较小的开口?结果是顶部在计算边缘附近的区域并通过打开断开。底部正在计算整个图像吗?蓝色区域表示实际计数的区域。由于边缘检测出现中断,因此该区域实际上很小。边缘在某些点上部分失效是很常见的。

如果假设存在某些像素中断(您的行不连续),则此假设的结果符合您的描述

A。很小的区域

B。弧长和顶点数加倍

C。由于某些点在同一条线上,因此它们被复制。

enter image description here

要解决此问题,请使用形态膨胀或凸包来缩小间隙。