Использование иерархии в findContours () в OpenCV? - PullRequest
31 голосов
/ 11 декабря 2011

При поиске контуров я использовал аргумент CV_RETR_CCOMP. Это должно создать двухуровневую иерархию - первый уровень предназначен для внешних контуров, второй уровень - для границ отверстий. Однако я никогда раньше не использовал иерархию, поэтому я не знаком с этим.

Может ли кто-нибудь проинструктировать меня о том, как получить доступ только к границам дыр? Я хочу не обращать внимания на внешние контуры и рисовать только границы отверстий. Примеры кода будут оценены. Я использую интерфейс C ++, а не C, поэтому, пожалуйста, не предлагайте функции C (т.е. используйте findContours () вместо cvFindContours ()).

Ответы [ 2 ]

41 голосов
/ 12 декабря 2011

Иерархия, возвращаемая findContours, имеет следующую форму: hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}

CV_RETR_CCOMP, возвращает иерархию внешних контуров и отверстий. Это означает, что элементы 2 и 3 из hierarchy[idx] имеют самое большее одно из них, не равное -1: каждый элемент не имеет ни родителя, ни потомка, ни родителя, но потомка, либо потомка, но не родителя. *

Элемент с родителем, но без дочернего, будет границей отверстия.

Это означает, что вы в основном проходите hierarchy[idx] и рисуете что-нибудь с помощью hierarchy[idx][3]>-1.

Нечто подобное (работает в Python, но еще не тестировал C ++. Хотя идея в порядке.):

findContours( image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

if ( !contours.empty() && !hierarchy.empty() ) {

    // loop through the contours/hierarchy
    for ( int i=0; i<contours.size(); i++ ) {

        // look for hierarchy[i][3]!=-1, ie hole boundaries
        if ( hierarchy[i][3] != -1 ) {
            // random colour
            Scalar colour( (rand()&255), (rand()&255), (rand()&255) );
            drawContours( outImage, contours, i, colour );
        }
    }
}
4 голосов
/ 11 сентября 2013

AFAIK при использовании CV_RETR_CCOMP, все отверстия находятся на одном уровне.

int firstHoleIndex = hierarchy[0][2];
for (int i = firstHoleIndex; i >= 0 ; i = hierarchy[i][0])
// contours.at(i) is a hole. Do something with it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...