OpenCV: количество вложенных контуров

Это мой первый вопрос здесь, спасибо, что прочитали его.

Я пытаюсь подсчитать количество внутренних контуров внутри контура.

Я нашел хороший учебник, показывающий, как использовать h_next и v_next.

http://jmpelletier.com/a-simple-opencv-tutorial/

Проблема в том, что я использую Mat, а не IplImage.

Я попытался преобразовать его с помощью:

Мат *oimg; IplImage img = *oimg;

Но я получаю сообщение об ошибке при вызове cvFindContours.

Я также пробовал использовать findContours, который создан для работы с Mat,

пройдя через иерархию, но это не сработало.

Я использую C++ и OpenCV2.0

Большое спасибо,

Тамир.


person Tamir    schedule 09.07.2011    source источник
comment
Использование литья: матовая матрица; ipimage* p; p = &((ipimage)матрица)   -  person DanielHsH    schedule 09.07.2011


Ответы (1)


Вместо преобразования cv::Mat в IplImage для использования C API я предлагаю напрямую использовать C++ версию cvFindContours(): cv::findContours(). Вместо того, чтобы строить настоящую древовидную структуру данных, она выравнивается и хранится в двух векторах:

cv::Mat image = // ...
std::vector<std::vector<cv::Point> > contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);

См. документацию C++ API, чтобы получить инструкции по интерпретации hierarchy (выделено мной):

hiararchy — необязательный выходной вектор, который будет содержать информацию о топологии изображения. В нем будет столько элементов, сколько контуров. Для каждого контура контуры[i] , иерархия элементов[i][0] , иерархияi , hiearchy[i][2] , hiearchy[i][3] будут установлены индексы, отсчитываемые от 0, в контурах следующего и предыдущего контуров на том же иерархическом уровне, первый дочерний контур и родительский контур соответственно. Если для некоторого контура i нет следующего, предыдущего, родительского или вложенного контуров, соответствующие элементы иерархии[i] будут отрицательными

Переключение между C и C++ API в одной кодовой базе действительно ухудшает читабельность. Я предлагаю использовать C API только в том случае, если необходимая вам функциональность отсутствует в C++ API.

person Michael Koval    schedule 09.07.2011