c/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的每次迭代中只取一个轮廓,而不是所有剩余的轮廓?

谢谢。

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

    根据文档( ),该函数具有以下签名:

     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),则绘制轮廓内部。

      以上就是c/c++开发分享如何在OpenCV中获得单独的轮廓(并填充它们)?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545886.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注