8

我试图分离图像的轮廓(为了找到统一的区域),所以我应用了 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 个轮廓,而不是所有剩余的轮廓?

谢谢。

4

1 回答 1

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$ 级别。

编辑:

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

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

于 2013-04-14T03:50:22.247 回答