findContours 返回的层次结构如下:
hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}
CV_RETR_CCOMP,返回外部轮廓和孔的层次结构。
这意味着hierarchy[idx] 的元素 2 和 3 最多有一个不等于 -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 );
}
}
}