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))
错误代码输出:
Largest contour area 14.0 Largest contour arc length 2639.200133085251 Largest contour num of vertx 667
良好代码输出:
Largest contour area 95534.0 Largest contour arc length 1321.8721450567245 Largest contour num of vertx 340
随附的两张照片几乎相同,应该返回相似的结果。但是,第一个返回的轮廓面积很小,与第二个相比,弧长和顶点数增加了一倍。