Ответ 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 );
}
}
}