Я хочу извлечь контуры из двоичного изображения края.
Исходное изображение:
После применения cvCanny () и cvDlate () я получаю следующее изображение:
Мне нужно, чтобы вмещающий прямоугольник (весь синий прямоугольник) был определен как контур. Я применяю cvFindContours () и извлекаю контур с наибольшей площадью. Однако, когда я применяю cvFindContours (), он изменяет вышеприведенное хитрое изображение следующим образом:
это не то, что я намерен сделать. Затем он выводит наибольший контур, который должен быть знаком почтового ящика внутри синего ящика.
Что не так? CvFindContours () изменяет входное изображение? Что нужно сделать, чтобы получить только вмещающую синюю коробку?
Благодарю.
Да, 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]);
Других решений пока нет …