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

Ger*_*rza 7 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

如果我用它填充大部分屏幕cvFillConvexPoly功能(尽管我写这个,我意识到一个凸多边形不会为我工作,我需要填写刚刚insideof轮廓)

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

谢谢.

mad*_*tya 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)
Run Code Online (Sandbox Code Playgroud)

从相同的文档,max_level有以下目的(最适用的部分是粗体):

max_level - 绘制轮廓的最大级别.如果为0,则仅绘制轮廓.如果为1,则绘制轮廓以及在同一水平面上跟随它的所有轮廓.如果为2,则绘制轮廓下方的所有轮廓以及所有轮廓,等等.如果值为负,则该函数不会在轮廓之后绘制轮廓,而是将轮廓的子轮廓绘制到$ |\texttt {max_ level} | -1 $级别.

编辑:

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

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