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

如何使用OpenCV在无人机交互的情况下分割图像中的对象,opencv,computer-vision,image-segmentation,Opencv,Computer Vision,Image Segmentation,我想使用OpenCv方法分割图像。我遇到过Grabcut算法,但这仍然需要人机交互,比如画一个框来圈出一个对象。 所以我的问题是如何使用OpenCv自动进行分割?C++或java中的建议和代码片段都很受欢迎。 更新:我正在尝试从盘子和桌子上分割食物 是的,grabCut需要人工交互,但我们可以将其最小化,就像我个人使用grabCut算法从给定图像分割人脸一样,因此它基本上包括: 基于haar级联的人脸检测 生成概率掩码,这将帮助您生成分割所需的标记 第一部分要求您要么使用预制的,要么提供足够

我想使用OpenCv方法分割图像。我遇到过Grabcut算法,但这仍然需要人机交互,比如画一个框来圈出一个对象。 所以我的问题是如何使用OpenCv自动进行分割?C++或java中的建议和代码片段都很受欢迎。
更新:我正在尝试从盘子和桌子上分割食物

是的,grabCut需要人工交互,但我们可以将其最小化,就像我个人使用grabCut算法从给定图像分割人脸一样,因此它基本上包括:

  • 基于haar级联的人脸检测

  • 生成概率掩码,这将帮助您生成分割所需的标记

第一部分要求您要么使用预制的,要么提供足够的培训示例

一旦有了一个工作的haar级联,就可以使用它来获得每个输入图像的ROI,您可以扩展ROI维度,以包含对象周围的更多空间

因此,在这一步中,你必须能够从给定的输入图像中裁剪出你所需的对象,这减少了搜索范围,现在你可以创建一个概率掩码,它将指示给定ROI中对象的可能位置,前面的步骤对于规范化输入图像是必要的,现在我们可以假设输入总是标准化的,因此对象位置在一定程度上与w.r.t ROI保持一致。以下是男性头发的概率面具示例:

现在选择4个阈值为grabcut创建遮罩,如下所示:

  • 如果(pix>220):掩码=cv::GC\U
  • else if(pix>170):mask=cv::GC\u PR\u FGD
  • 否则如果(pix>50):掩码=cv::GC\U PR\U BGD
  • else:mask=cv::GC\u BGD
然后您可以将此作为掩码传递以执行grabcut分割


然而,最近出现了一些进展,使用CRF作为RNN技术分割给定图像中的对象,它不需要标准化,但由于它依赖GPU高效运行,因此不适合移动或低端计算机应用。

您能告诉我们要分割的图像类型吗?使用openCV切割对象的方法有很多种,但方法取决于对象的类型、对比度等。我更新了我的问题。你最好给我们展示你想要的实际图像,否则将无法帮助你,但基本原则是:如果你有彩色图像,你的食物可能与你的盘子和桌子的颜色不同(比如说,你想在木桌上的白色盘子上找到一个西红柿和胡萝卜)。在这种情况下,要选择对象,使用颜色分类可能是最简单的方法。如果你只有灰度图像,你需要在图像上有足够的对比度来检测物体的边缘(基本上你的眼睛是这样做的)。然后可以使用OpenCV提供的几种算法提取这些边。例如,您可以尝试使用sobel过滤器获取边缘。这是否适用于将食物从盘子和桌子中分割出来?我刚刚读了一些关于haar cascade的文章,它似乎用于人脸检测。如果我错了,请纠正我。我已经知道你在搜索与人脸无关的haar cascade,这就是为什么我在答案中附加了这个,你需要为此目的训练你自己的cascade,或者如果有人已经创建了一个,在web上搜索。