Подтвердить что ты не робот

Использование иерархии в findContours() в OpenCV?

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

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

4b9b3361

Ответ 1

Иерархия, возвращаемая 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, но не проверял С++. Идея в порядке.):

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 );
        }
    }
}

Ответ 2

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.