【问题标题】:How to get separate contours (and fill them) in OpenCV?如何在 OpenCV 中获得单独的轮廓(并填充它们)?
【发布时间】:2013-04-06 09:09:37
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: c opencv


    【解决方案1】:

    您需要将传递给函数的最后一个参数(当前为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,则所有轮廓跟随且所有轮廓为 1 低于等高线的水平被绘制,依此类推。 如果值为 负数,该函数不绘制后面的轮廓 轮廓,但绘制轮廓的子轮廓直到 $|\texttt{最大级别}|-1$级别。

    编辑:

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

    thickness – 绘制轮廓线的粗细。如果是 负数(例如,=CV_FILLED),绘制轮廓内部。

    【讨论】:

    • 非常感谢,就是这样,我没有注意到那个参数。现在我只需要填充它们,有什么功能吗?如果没有,我该怎么办?也许分水岭适用于封闭的,但有时也有开放的轮廓。
    • 对厚度参数使用负值。如果这对您不起作用,也许其中之一会有所帮助:stackoverflow.com/questions/12929197/…stackoverflow.com/questions/1716274/fill-the-holes-in-opencv
    • 再次感谢,使用负厚度可以完美解决问题。
    • Gerardo,投票并接受这个答案,如果它对你有用。
    猜你喜欢
    • 2014-11-26
    • 2013-12-22
    • 2013-10-13
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2014-04-05
    • 2022-01-10
    相关资源
    最近更新 更多