2

我最近一直在研究从安卓设备相机拍摄的图像中的对象检测/识别。

我要检测的对象是各种看起来像这样的按钮:

按钮图片

到目前为止,我一直在尝试使用 OpenCV 以及 metaio SDK。结果:

OpenCV总是检测到一些东西,但给出了很多错误的命中。此外,收集我所想的所有图片也太费力了。我用 OpenCV 尝试了三种方法:

  1. FeatureDetection(SURF、ORB 等)-> 太慢了,我的对象没有足够的特征。
  2. 模板匹配-> 似乎仅在模板完全是场景图像的一部分时才有效
  3. 训练分类器->这是迄今为止效果最好的,但对于我的目标来说工作量太大,而且仍然给出了太多的错误检测。

当我从上面显示的图片中取出参考图像(每个按钮的图标部分)时,metaioSDK工作正常,然后打印完整图像并将我的 android 设备相机对准打印的图片。但是当我尝试使用真正的按钮(不是它们的图片)时,几乎没有检测到任何东西。在 metaio 文档中,据说参考图像需要有很多特征和颜色差异,并且不应仅由白色文本组成。好吧,正如您所见,我的参考图像与它们应有的完全相反。但这就是按钮的外观;)

所以,我的问题是:当我将我的安卓相机对准这些按钮时,你们中是否有人建议我还能尝试检测和识别每个按钮?

4

1 回答 1

0

作为建议,您可以尝试以下方法: 用于对象检测的类特定霍夫森林, 它们提供了 C 代码实现。编译并运行它并查看结果,然后根据以下规则将正负训练图像替换为您拥有的训练图像:

在汽车中,您需要定义以下 3 个区域:

  1. 目标区域(您提供的图像很好地代表了目标区域)
  2. 附近的工作区域(这个区域有关于你目标相对位置的信息)我会建议:区域是目标区域的 3-5 倍,在目标周围,可以是一个很好的工作区域
  3. 上述以外的一切都可以用作负片

然后,

  1. 在不同的视角(-30 - +30 度)和不同的距离使用“许多”正图像(100-1000)。

您必须假设您的用户将在哪些视角和距离上使用该应用程序。它们越严格,您将获得更好的性能。一个简单的“提示”相机覆盖可以让人们了解您期望的工作区域是什么。

  1. 使用几次(3-5)次不同的负图像集,其中包括可能在相机中但不应提供任何目标位置信息的事物的图片。

  2. 不要使用大图像,大约 100-300 像素的宽度就足够了

组装数据库,修改代码自带的配置文件。运行程序,看看性能是否满足您的需求。

该程序将返回您正在寻找的对象的投票地图云。为其添加高斯模糊,并对其应用一些阈值(您必须对该阈值做出另一个假设)。

提取的蒙版将定义您正在寻找的区域。遮罩区域的大小可以很好地估计对象的比例。有了这些信息,选择合适的模板和执行模板匹配会容易得多。

(还有一些想法)您还可以尝试通过使用 goodFeaturesToTrack 函数和您获得的掩码来做一个小技巧,以获取一组位置并将它们与模板上的相应位置进行比较。构建 SSD 并通过最小化对齐误差来解决旋转、缩放和过渡参数(但不确定这种方法是否有效)

于 2013-09-13T16:47:10.843 回答