如何填写OpenCV中的复杂计数

时间:2016-05-07 16:53:39

标签: opencv image-processing contour opencv-drawcontour

  

情景

我正在编写一个检测皮肤毛发的程序。到目前为止,我已经做到了......

  1. 已加载的源图像和已应用的抓取以删除背景
  2. enter image description here

    1. 应用皮肤检测以获取皮肤
    2. enter image description here

      1. 执行ANDing以获取头发以及其他区域
      2. enter image description here

        1. 进行轮廓检测以获得最大尺寸的轮廓
        2. enter image description here

          Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),1);
          
            

          问题

          当我尝试使用代码

          运行findContour来填充我的掩码时
          Imgproc.drawContours(mask, contours, maxAreaIndex, new Scalar(255,255,255),Core.FILLED);
          

          它像

          一样填充轮廓

          enter image description here

          现在,我不能将它用作掩码,因为它会产生我的结果

          enter image description here

          这不是我想要的。

          任何人都可以建议我如何为这个问题实现填充轮廓?

1 个答案:

答案 0 :(得分:0)

在提取轮廓之前,您可以应用一些扩张 - 侵蚀(闭合)过滤,以确保获得完整的轮廓。从本质上讲,扩张侵蚀所做的是通过扩展它们以使它们相交来关闭通常彼此靠近的轮廓区域,然后将现在相交的轮廓向下缩小以使其保持正确缩放。有关此主题的更多信息,请查看here

但是,此方法假定您已检测到图像中的大部分头发。你所做的不同;你已经在你的照片中检测到了NOT SKIN,并假设头发是最大的轮廓。通过这样做,当你关闭轮廓时,特别是在人物衬衫较高的图像上,你可能会遇到一些你正在检测衬衫和头发的问题。我会在您的管道中添加一个额外的步骤,在您尝试在应用此过滤之前将人的衬衫分割出去。

祝你好运!