6. Выделение контуров
http://howto.nicubunu.ro/gears/gears_16.png
http://cvpr.uni-muenster.de/research/rack/index.html
Понятие контура
Если дано изображение, на котором надо выделить контуры,
но нет ни разбиения на области, ни 3d-модели,
то возникают неоднозначности определения, что такое контур,
связанные с
- масштабом (насколько мелкие интересуют объекты)
- текстурой (являются ли элементы текстуры контурами)
- семантикой (иногда линии на изображении являются просто нарисованными на
объекте, и не отражают изгибов его формы)
Контур на изображении - это линия, вдоль которой наблюдается скачок по яркости или
цвету.
2. Проведение измерений
Mat binary;
threshold( contImg, binary, 0.7, 1.0, CV_THRESH_BINARY );
Фильтр Собела
Пример, продолжение
Другие фильтры подчеркивания
точек контура
1. Scharr() ,
2. Laplacian(),
3. разность двух Гауссианов (см. в лекции про сглаживание).
- сглаживание и прореживание.
- модификация (поворот, растяжение).
- сопоставление, анализ и распознавание объектов по их
контурам.
Трассировка контуров
void findContours(const Mat& image, //Входное изображение,
//1-канальное, 8-битное
//трактуется как бинарное (0 и не 0)
vector<vector<Point> >& contours, //Найденные контуры
int mode, //Режим поиска контуров
int method, //Способ аппроксимации контуров
Point offset=Point() //Сдвиг всех результрующих контуров
)
Значения mode:
CV_RETR_EXTERNAL - только внешние контуры,
CV_RETR_LIST - список всех контуров
Используется другая форма функции, см. документацию:
CV_RETR_CCOMP - 2-уровневая иерархия - внешние границы и границы дырок,
CV_RETR_TREE - стоит дерево вложенных контуров,
Значения method:
CV_CHAIN_APPROX_NONE - без аппроксимации
CV_CHAIN_APPROX_SIMPLE - выбрасявает горизонтальные и вертикальные точки внутри отрезков
CV_CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS - аппроксимация методом Teh-Chin
Трассировка контуров
Пример
vector<vector<Point> > contours;
findContours( edges, contours, CV_RETR_LIST, CV_CHAIN_APPROX_TC89_L1 );
Проблемы