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

标签 c++ image list image-processing opencv

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

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

最佳答案

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

CV_RETR_CCOMP,返回外部轮廓和孔的层次结构。 这意味着 hierarchy[idx] 的元素 2 和 3 最多有一个不等于 -1:也就是说,每个元素要么没有父级或子级,要么有父级但没有子级,或者一个 child ,但没有 parent 。

具有父元素但没有子元素的元素将成为孔的边界。

这意味着你基本上通过 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 );
        }
    }
}

关于c++ - 在 OpenCV 的 findContours() 中使用层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8461612/

相关文章:

c++ - template<class = enable_if_t<...>> 做什么?

c# - 编写方法 ByteSwap 但未按计划工作

c++ - 无法在C++中的main中定义结构

android - 图像识别框架/指南-增强现实

java - 修改 ""类,以便 toString 方法对列表进行排序

c++ - 哪个系统软件负责运行时检查

python - 使用 OpenCV 检查图像是否全为白色像素

image - Windows Phone 7 : How to create a picture album for depositing images from app?

java - 获取java中数组列表中分组属性的大小

python - 列表 append 在 Pandas 单元格中