findContours возвращает контур с дублирующимися точками - PullRequest
0 голосов
/ 04 июня 2019

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 Ответ

1 голос
/ 04 июня 2019

Я не могу загрузить изображение в комментарии.Возможно ли, что в вашем обнаружении кромки есть какая-то ошибка и есть небольшое отверстие?Получившийся верх подсчитывает площадь рядом с краем и ломается при открытии.А снизу идет отсчет всего изображения?Синяя область обозначает фактическую подсчитанную площадь.Из-за разрыва в обнаружении края область фактически довольно мала.Обычно ребро частично терпит неудачу в нескольких точках.

если предположение, что есть некоторый разрыв пикселя (ваша линия не является непрерывной), результат из этого предположения соответствует вашему описанию

A.очень маленькая площадь,

B.удвоить длину дуги и номер вершины

C.Некоторые точки дублируются, так как они находятся на одной линии.

enter image description here

Чтобы справиться с этим отверстием, используйте морфологическое расширение или выпуклый корпус, чтобы закрыть зазор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...