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
две прикрепленные фотографии практически идентичны и должны давать похожие результаты.Однако первый возвращает контур с очень небольшой площадью и удваивает длину дуги и номер вершины по сравнению со вторым.