Поиск контуров после обнаружения хитрых краев

Я хочу извлечь контуры из бинарного краевого изображения.

Исходное изображение:

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

После применения cvCanny() и cvDilate() я получаю следующее изображение:

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

Мне нужно, чтобы закрывающая коробка (вся синяя коробка) определялась как контур. Я применяю cvFindContours() и извлекаю контур с наибольшей площадью. Однако, когда я применяю cvFindContours(), он изменяет вышеприведенное хитроумное изображение следующим образом:

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

что я не собираюсь делать. Затем он выводит самый большой контур, который будет знаком почтового ящика внутри синего прямоугольника.

Что происходит не так? Изменяет ли cvFindContours() входное изображение? Что нужно сделать, чтобы получить только вложенную синюю коробку?

Спасибо.


person Hrishikesh_Pardeshi    schedule 23.10.2013    source источник


Ответы (1)


Да, findContours действительно изменяет изображения. Если вам все еще нужно исходное изображение, используйте findContours для копии вашего изображения.

Вместо:

findContours(image, contours, mode, method);

Использовать:

findContours(image.clone(), contours, mode, method);

*Изменить (ответить на комментарий): *

Это зависит от того, что вы определяете как «самый большой». Если вы используете область, это может быть проблематично, потому что вызов findContours на карте ребер может привести к очень длинным, но очень тонким контурам. Лучшее определение «наибольшего» - это контур, ограничивающий прямоугольник которого имеет наибольшую площадь. Вы можете использовать функцию boundingRect, чтобы найти его. И если вы хотите найти ограничивающую рамку всех полигонов, используйте оператор ИЛИ между всеми ограничивающими рамками:

Rect bbox = boundingRect(contours[0]);
for(i=1; i<contours.size(); i++)
    bbox = bbox | boundingRect(contours[i]);
person Michael Burdinov    schedule 23.10.2013
comment
Спасибо. Но как мне найти крайнюю синюю коробку? Разве это не должен быть самый большой контур? - person Hrishikesh_Pardeshi; 23.10.2013
comment
Небольшой апдейт из будущего. Начиная с OpenCV 3.2, findContours() больше не изменяет исходное изображение, а возвращает измененное изображение в качестве первого из трех возвращаемых параметров. А с 4.0.0 уже не возвращает модифицированный образ. - person Nicolas Abril; 04.09.2019