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

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

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

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

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

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

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

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

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

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

Благодарю.

0

Решение

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

Вместо:

findContours(image, contours, mode, method);

Использование:

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

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

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

Rect bbox = boundingRect(contours[0]);
for(i=1; i<contours.size(); i++)
bbox = bbox | boundingRect(contours[i]);
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]