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

Using hierarchy in findContours () in OpenCV?

本文关键字:层次结构 OpenCV findContours      更新时间:2023-10-16

当找到轮廓时,我使用CV_RETR_CCOMP参数。这应该创建一个两层的层次结构-第一层是外部轮廓,第二层是孔的边界。但是,我以前从未使用过层次结构,所以我对它不熟悉。

有人能告诉我如何只访问洞的边界吗?我想忽略外部轮廓,只画洞的边界。代码示例将受到赞赏。我使用的是c++接口而不是C,所以请不要建议使用C函数(即使用findContours()而不是cvFindContours())。

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

我敢说,当使用CV_RETR_CCOMP时,所有的洞都在同一水平上。

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.