OpenCV: количество вложенных контуров - PullRequest
1 голос
/ 09 июля 2011

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

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

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

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

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

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

коврик * oimg; IplImage img = * oimg;

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

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

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

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

Спасибо,

Тамир.

1 Ответ

3 голосов
/ 09 июля 2011

Вместо преобразования 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] [0], hiearchy i , hiearchy [i] [2], hiearchy [i] [3] будет установлен в 0 индексы в контурах следующего и предыдущие контуры в том же иерархический уровень, первый ребенок контур и родительский контур, соответственно. Если для некоторого контура я нет следующего, предыдущего, родительского или вложенные контуры, соответствующие элементы иерархии [i] будут отрицательный

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...