如何使用OpenCV在没有人工交互的情况下分割图像中的对象

时间:2017-05-24 05:19:36

标签: opencv computer-vision image-segmentation

我想使用OpenCv方法来分割图像。我遇到了Grabcut算法,但这仍然需要人工交互,比如绘制一个框来圈出一个对象。 所以我的问题是如何使用OpenCv自动进行分割?非常感谢C ++或Java中的建议和代码片段。

更新:我正试图从盘子和桌子上分割食物。

1 个答案:

答案 0 :(得分:2)

是的,grabCut需要人工交互,但我们可以将其最小化,就像我个人使用grabCut算法来分割给定图像中的面部一样,所以它基本上涉及:

  • 使用haar cascade

  • 检测给定图像中的面部
  • 生成概率模板,可帮助您生成细分所需的标记。

第一部分要求您使用预先制作的haar cascadecreate your own,提供足够的培训示例。

一旦你有一个工作的haar级联,你可以使用它来获得每个输入图像的ROI。你可以扩展ROI尺寸以包括对象周围的更多空间。

所以现在在这一步你必须能够从给定的输入图像裁剪你需要的对象,这会减少搜索域。现在你可以创建一个概率掩码,它可以指示给定ROI的对象的可能位置,前面的步骤是规范化输入图像所必需的。现在我们可以假设输入总是被标准化,因此对象位置与ROI有些一致。以下是男性人发的概率模板掩码:

enter image description here

现在您选择4个阈值来为grabcut创建掩码:

  
      
  • if(pix> 220):mask = cv :: GC_FGD
  •   
  • else if(pix> 170):mask = cv :: GC_PR_FGD
  •   
  • else if(pix> 50):mask = cv :: GC_PR_BGD
  •   
  • else:mask = cv :: GC_BGD
  •   

然后您可以将其作为掩码传递以执行抓取分割。

然而semantic segmentation最近有一些进步,它使用CRF作为RNN技术来分割给定图像中的对象,它不需要归一化,但由于它对GPU的依赖性有效运行时,它不适合移动或低端计算机应用。