FindContours OpenCV иногда возвращает плохие результаты
Фрагмент кода пытается найти самый большой контур в краевых изображениях.
В «плохом» примере кажется, что большинство вершин контура дублируются без необходимости. Это приводит к последующему неправильному поведению контура и 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
Две прикрепленные фотографии почти идентичны и должны дать похожие результаты. Однако первый возвращает контур с очень маленькой площадью, удвоенной длиной дуги и числом вершин по сравнению со вторым.