在 OpenCV 的 findContours () 中使用层次结构?

在查找轮廓时,我使用了 CV_RETR_CCOMP 参数.这应该创建一个两级层次结构 - 第一级用于外轮廓,第二级用于孔的边界.然而,我之前从未使用过层次结构,所以我对此并不熟悉.

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

liu12390 回答:在 OpenCV 的 findContours () 中使用层次结构?

findContours 返回的层次结构具有以下形式:hierarchy[idx][{0,1,2,3}]={下一个轮廓(同级),前一个轮廓(同级),子轮廓,父轮廓}

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

这篇关于在 OpenCV 的 findContours () 中使用层次结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持前端之家!

本文链接:https://www.f2er.com/3187863.html

大家都在问