findContours возвращает контур с повторяющимися точками

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

Две прикрепленные фотографии почти идентичны и должны дать похожие результаты. Однако первый возвращает контур с очень маленькой площадью, удвоенной длиной дуги и числом вершин по сравнению со вторым.


person sas    schedule 04.06.2019    source источник
comment
Вы можете опубликовать свой результат и то, чего вы хотите достичь в ручном рисовании? чтобы другие могли вам помочь?   -  person Dr Yuan Shenghai    schedule 04.06.2019
comment
это выглядит разумным числом. Вы думаете, что это слишком много для самой большой прямоугольной штуки? Вы должны иметь в виду, что контур представляет собой вектор точек для максимально точного приближения. если вам нужно минимальное представление, вы можете использовать выпуклую оболочку (угадайте, что она может получить 4‹вертики‹20) или min rect (4 вершины) для наибольшего контура.   -  person Dr Yuan Shenghai    schedule 04.06.2019
comment
Основная проблема это площадь, которая составляет 14 вместо 100 000. Основной основной причиной неправильного чтения являются дублированные вершины.   -  person sas    schedule 04.06.2019
comment
Похоже на ошибку при работе со сложной формой. Функция области контура вызывает github.com/barak/ opencv/blob/master/modules/imgproc/src/ icvContourArea, который построчно подсчитывает начало и конец фигуры. он же dxy. Нужно сделать больше тестов, чтобы дать вам действительное исправление исходного кода. Между тем, можете ли вы использовать выходной вектор выпуклой оболочки‹точка› в качестве источника области контура? для простого случая не должно быть проблем. Дополнительная информация. какую версию opencv вы используете.   -  person Dr Yuan Shenghai    schedule 04.06.2019


Ответы (1)


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

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

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

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

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

введите здесь описание изображения

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

person Dr Yuan Shenghai    schedule 04.06.2019
comment
Это сработало для меня: я использовал kernel = np.ones((2,2), np.uint8) edges = cv2.dilate(edges,kernel,iterations = 1) для расширения краев - person sas; 04.06.2019
comment
Конграз, продолжай. думаю, вам нужно сделать что-то с этим номером для проекта. - person Dr Yuan Shenghai; 04.06.2019