在OpenCV中的findContours()中使用层次结构?
c++
image
image-processing
opencv
5
0

查找轮廓时,我使用了CV_RETR_CCOMP参数。假定这将创建一个两级层次结构-第一个层次用于外部轮廓,第二个层次用于孔的边界。但是,我之前从未使用过层次结构,因此我对此并不熟悉。

有人可以指导我如何仅进入孔的边界吗?我想忽略外部轮廓,只绘制孔边界。代码示例将不胜感激。我使用的是C ++接口而不是C,所以请不要建议使用C函数(即使用findContours()而不是cvFindContours())。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

使用CV_RETR_CCOMP时的AFAIK,所有孔都在同一水平线上。

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.
收藏
评论

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 );
        }
    }
}
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号