Иерархия, возвращаемая 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 );
}
}
}