使用 OpenCV 触摸和选择对象

Posted

技术标签:

【中文标题】使用 OpenCV 触摸和选择对象【英文标题】:Using OpenCV to touch and select object 【发布时间】:2016-06-22 23:59:17 【问题描述】:

我在 ios Xcode objc 中使用OpenCV framework,有没有一种方法可以处理来自摄像机的图像输入并允许用户触摸屏幕上的对象,然后我们使用 OpenCV 中的一些功能来突出显示它。

这就是我的意思。第一张图片显示了用户可能在视频源中看到的示例:

然后,当他们点击 ipad 上的屏幕时,我想使用 OpenCV 功能/对象检测来处理他们点击的区域以突出显示该区域。如果他们点击 ipad,会看起来像这样:

关于如何在 objc OpenCV 中实现这一点的任何想法?

我可以很容易地看到我们如何使用经过训练的 iPad 模板来实现这一点,以使用 OpenCV 算法匹配它,但我想尝试让它动态化,这样用户就可以触摸屏幕上的任何东西,我们将从那里?

【问题讨论】:

为此,您需要检测图像中的所有对象(在上图中,它们是 iPad、铅笔、圆珠笔等)。然后当用户触摸屏幕时,从所有检测到的对象中检查哪个对象用户已经触摸了。然后就显示出来了。 是否也可以选择使用用户制作的涂鸦而不是单击? 我不排除任何 ibezito。你有什么建议? @Matt 我用我的建议添加了答案 【参考方案1】:

说明:我们为什么要使用分段方法

据我了解,您尝试解决的任务是对象的分割,无论其身份如何

对象识别方法是一种方法。但它有两个主要缺点:

    它要求您训练一个对象分类器,并收集一个数据集,其中包含大量您想识别的对象示例。如果您选择使用已经过训练的分类器 - 它不一定适用于您想要检测的任何类型的对象。 大多数对象识别解决方案会在已识别对象周围找到一个边界框,但它们不会对其进行完整分割。分割部分需要额外的努力。

因此,我认为最适合您的情况的方法是使用图像分割算法。更准确地说,我们将使用GrabCut segmentation algorithm。

GrabCut 算法

这是一个有两个阶段的迭代算法:

    初始阶段 - 用户指定对象周围的边界框。 给定这个边界框,算法通过使用 GMM 估计前景(对象)和背景的颜色分布,然后进行图形切割优化以找到前景和背景之间的最佳边界。

    在下一阶段,如果需要,用户可以通过提供前景和背景的涂鸦来纠正分割。该算法相应地修复模型并根据更新的信息执行新的分割。

使用这种方法有利有弊。 优点:

    分割算法很容易用 openCV 实现。 它使用户能够在需要时修复分段错误。 它不依赖于收集数据集和训练分类器。

主要的缺点是除了在屏幕上单击之外,您还需要用户提供额外的信息来源。此信息将是对象周围的边界框,并且在某些情况下 - 需要额外的涂鸦来纠正分割。

代码

幸运的是,这个算法在 OpenCV 中有一个实现。用户Itseez 为使用 OpenCV 的 GrabCut 算法创建了一个简单易用的示例,可以在这里找到:https://github.com/Itseez/opencv/blob/master/samples/cpp/grabcut.cpp

应用使用:

应用程序接收图像文件的路径作为命令行参数输入。它将图像渲染到屏幕上,用户需要提供一个初始边界矩形。

用户可以按“n”来执行当前迭代的分割,或者按“r”来恢复他的操作。

选择一个矩形后,计算分割。如果用户想更正它,他可以选择添加前景或背景涂鸦,相应地按 shift+left 和 Ctrl+left。

示例

对 iPod 进行细分:

分割笔:

【讨论】:

我猜问题的作者在每个对象周围都没有一个矩形。他需要从图像中找到分割,而不是从图像和对象矩形中。 @taarras,作者在 cmets 中说他不排除任何事情。生成矩形需要用户在屏幕上点按两次,最终结果会更准确。 嗨 ibezito。棒极了。一个问题,有没有一种方法可以在没有边界矩形的情况下使用抓取方法? IE。如果您要在 iPad 等对象上捕捉触摸事件,那么 grabcut 会找到您触摸的对象的边缘。 @Matt 如果你想从一个点移动到一个对象的边缘,你会得到类似 Adob​​e Photoshop 的魔术棒工具。你可以在这里看到你可以从这个方法中得到的结果:youtube.com/watch?v=qjTGmw45e2Y【参考方案2】:

您可以通过使用 opencv Haar 分类器训练 Ipad 图像分类器然后在给定帧中检测 Ipad 图像来实现。

现在根据触摸坐标检查该区域是否与检测到的 Ipad 图像区域重叠。如果它在检测到的 Object.Means 上绘制边界框,您可以继续处理检测到的 ipad 图像。

对要检测的对象数量重复上述过程。

【讨论】:

您好 Abhishek,感谢您的回复。这只是一个示例对象。我想在没有任何对象检测培训的情况下做到这一点。选择的对象可以是任何东西。我希望因为我在对象上有接触点,所以我可以计算出所选对象的边缘并动态突出显示它。 我不知道任何其他方法可能是您可以在 Caffe 深度学习框架中搜索经过训练的图像模型,例如 imagenet,它是在各种类上训练的。【参考方案3】:

您要解决的任务是“对象提议”。它的工作不是很准确,而且这个结果是非常新的。 这两篇文章为您提供了一个很好的概述方法: https://pdollar.wordpress.com/2013/12/10/a-seismic-shift-in-object-detection/ https://pdollar.wordpress.com/2013/12/22/generating-object-proposals/

要获得最先进的结果,请查找有关对象提案的最新 CVPR 论文。他们经常有可供测试的代码。

【讨论】:

以上是关于使用 OpenCV 触摸和选择对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

opencv:使用 cout 和 Mat 对象抛出异常

[OpenCV实战]7 使用YOLOv3和OpenCV进行基于深度学习的目标检测

android如何在 java opencv 中查找最大轮廓

OpenCV-C++选择提取感兴趣区域(ROI区域)附用鼠标选取ROI区域的代码

OpenCV入门教程-Mat类之选取图像局部区域