如何在OpenCV中获得单独的轮廓(并填充它们)?

时间:2013-04-14 02:26:15

标签: c opencv

我正在尝试分离图像的轮廓(为了找到统一的区域),所以我应用了cvCanny然后cvFindContours,然后我每次按一个键时使用以下代码绘制1个轮廓:

for( ; contours2 != 0; contours2 = contours2->h_next ){
        cvSet(img6, cvScalar(0,0,0));
        CvScalar color = CV_RGB( rand()&255, rand()&255, rand()&255 );
        cvDrawContours(img6, contours2, color, cvScalarAll(255), 100);
        //cvFillConvexPoly(img6,(CvPoint *)contours2,sizeof (contours2),color);
        area=cvContourArea(contours2);
        cvShowImage("3",img6);
        printf(" %d", area);
        cvWaitKey();
    }

但是在第一次迭代中它绘制了所有轮廓,在第二次迭代中它绘制了除了一个之外的所有轮廓,第三次绘制除了两个之外的所有轮廓,依此类推。

如果我使用cvFillConvexPoly函数,它会填充大部分屏幕(虽然在我写这篇文章时我意识到凸多边形对我来说不起作用,我只需填充轮廓内部)

那么,我怎样才能在for的每次迭代中只取一个轮廓,而不是所有剩余的轮廓?

感谢。

1 个答案:

答案 0 :(得分:13)

您需要将传递给函数的最后一个参数(当前为100)更改为0或负值,具体取决于您是否要绘制子项。

根据文件(http://opencv.willowgarage.com/documentation/drawing_functions.html#drawcontours), 该函数具有以下签名:

void cvDrawContours(CvArr *img, CvSeq* contour, CvScalar external_color,
CvScalar hole_color, int max_level, int thickness=1, int lineType=8)

在相同的文档中,max_level具有以下目的(大多数适用部分以粗体显示):

  

max_level - 绘制轮廓的最大级别。 如果为0,则只有轮廓   绘制即可。如果1,轮廓和跟随它的所有轮廓相同   水平被绘制。如果2,所有轮廓跟随和所有轮廓之一   绘制轮廓以下的等级,等等。 如果值是   否定,该功能不会在之后绘制轮廓   轮廓但绘制轮廓的儿童轮廓直到   $ | \ texttt {max_ level} | -1 $ level。

编辑:

要填充轮廓,请使用thickness参数的负值:

  

厚度 - 绘制轮廓线条的粗细。如果是   负(例如,= CV_FILLED),绘制轮廓内部。