【问题标题】:Step by step object detection with ORB使用 ORB 逐步进行对象检测
【发布时间】:2015-02-03 01:51:17
【问题描述】:

我必须创建一个 Android 应用来识别摄像头中的一些对象(汽车方向盘、车轮)。我尝试使用 Haar 分类器,但没有成功,而且我的时间不多了(这是一个学校项目)。所以我决定另辟蹊径。我为我的目标找到了一些其他方法 - ORB。我在this answer 中找到了我应该做什么。我的问题是我脑子里的事情搞砸了。您能否逐步回答我如何执行我给出的链接中问题的答案:

从提取特征点到训练 KD 树并将其用于相机的每一帧。

额外问题: 你能给出特征点的定义吗?这是我无法完全理解的事情。 使用 ORB 检测会慢吗?我知道 OpenCV 可以在原生 android 中使用,那不是让事情变得更快吗?

我需要尽快创建这个应用程序。请帮忙!

【问题讨论】:

  • 特征点是某种“兴趣点”,en.wikipedia.org/wiki/… - 在您的情况下可能相当于“像素”。
  • 此外,this question 的答案提供了对描述符、匹配器等的很好的总结。如果您想尝试 ORB 以外的其他东西,它还会为您提供一些不错的组合。

标签: android opencv kdtree orb opencv4android


【解决方案1】:

我目前正在开发一个类似的应用程序。我建议首先使用单个参考图像进行处理,原因如下:

  1. 如果您刚刚开始,则更容易操作和理解,并且您可以稍后进行更改。
  2. 对于 Android 应用程序,您的处理能力有限,因此更多的图像 = 更低的 fps。

你应该看看OpenCV tutorials 这很有帮助。一旦您通过“OpenCV for Android SDK”部分并理解了这三个教程,您就可以很容易地添加允许您分析视频源的功能。

在制作应用程序时我建议遵循的基本逻辑路径是:

  1. 读入参考图像。
  2. 创建和使用您的 FeatureDetector、DescriptorExtractor 和 DescriptorMatcher。
  3. 使用上述方法检测关键点,然后描述关键点(前两个,不要忘记将其转换为垫子,然后再转换为灰度)。
  4. 每次从相机中获取帧时,重复步骤 3。然后比较图像中的关键点(与 2 的第三部分。)。
  5. 使用结果来确定是否有匹配项(如果有则在其周围画一个框或其他东西)。
  6. 获取新框架。

尝试使其适用于单个对象,然后再添加其他对象。您可以添加的另一件事是在开始时允许用户选择他们想要搜索的内容。

ORB 也相当快,尤其是与 SIFT 和 SURF 相比。我在 HTC One 上获得了大约 3fps 的单一参考图像。

【讨论】:

  • 非常感谢您的详细解答。我不得不问是不是3 fps的帧率太低了?另外,如果我用native写代码,你能给出答案吗?不是更快吗?
  • 这不是很好,但如果你只是为学校项目做它应该足够了。另请注意,这是我获得的最低帧速率,并且已达到 20 fps 左右。这在很大程度上取决于您设备的处理能力和检测到的功能数量(如果没有很多功能,它真的很快)。 RE 用本机写作:我没有对此进行任何类型的实验,所以我不能肯定地说,但我想它可能会(尽管我不知道多少)。
  • 谢谢。我还有一个问题。如何区分方向盘和汽车轮胎?你知道方向盘是不同的,我能检测到大部分吗?我只需要打电话给它是否是方向盘、汽车轮胎。 youtube.com/watch?v=h2KHje-Pf10这里的这个人可以检测到不同的面孔,这些面孔并没有太大的不同,所以这给了我们希望。请您(如果可以)告诉我如何区分我的对象?
  • 我以前从未真正尝试过拾取所有特定类型的对象,只有特定的对象。我认为我在上面提供的链接中的人脸检测示例代码可能搜索任何人脸,然后查看找到的任何人脸是否已知但我不记得了。因此,您也许可以这样做,或者通过为方向盘和轮胎创建一个示例图像库,并为它们中的每一个执行步骤 3-5。我从来没有尝试过,但this) 似乎可以很好地引导您完成它。
  • 对不起,我一直在问,但我对这些东西很陌生。我可以将提取的特征与 orb 一起使用来训练 SVM,然后使用 SVM 检测我的对象吗?您是否有任何参考资料可以分享,因为我一直在搜索但没有找到好的解释?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2016-03-13
  • 2019-12-26
  • 2020-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多