我正在尝试开发一个AR android应用程序。
它应该检测和识别相机捕获的物体,我使用OpenCV用于此目的,但我对AR领域移动设备的物体识别不是很熟悉。
我有两个问题:
1-哪个算法更好(在精度和速度的意义上)SIFT, SURF, FAST, ORB,还是其他?
2-我想知道检测和跟踪的过程是否会像这样:
取一个相机帧,检测其关键点,计算其描述符,然后将其与数据库中可用的每个图像(Mat of descriptors)进行匹配,以找到它属于哪一个。
我觉得上面提到的步骤计算量很大,特别是如果每一帧都要重复这些步骤来跟踪对象。
请给我提供一些关于算法的细节和最适合我目标的步骤。
提前感谢
FAST只是一个检测器,而SIFT, SURF, ORB和BRISK是检测器和描述符。
你的问题很笼统。
- SIFT描述符是一种经典的方法,也是"原始的"稍后提出的大多数描述符的灵感。缺点它在数学上很复杂,计算量很大。
- SURF探测器被公认为是更有效的替代筛选。它有一个基于黑森的检测器和一个基于分布的检测器描述符生成器。
- SIFT和SURF基于梯度直方图。也就是说,需要计算patch中每个像素的梯度。这些计算耗费时间。尽管SURF加快了计算速度使用积分图像,这对某些人来说仍然不够快应用
SIFT和SURF是最精确的,但它们受专利保护,未经购买不能使用。
- FAST是一个独立的特征检测器,它不是一个描述符发电机。它的设计是非常有效的,适合任何复杂的实时应用。
- BRIEF描述符是一个轻量级的、易于实现的描述符基于二进制字符串。简要描述符的目标是低功耗装置,并补偿了它的一些鲁棒性和准确性效率。
二进制描述符是许多现代应用程序的一个有吸引力的解决方案,特别是对于计算和内存资源有限的移动平台。
在我看来,我更喜欢ORB,因为它是基于二进制的描述符。与BRISK相比,它需要更少的计算量和更少的内存需求。
在定稿之前,你必须对所有这些可用的描述符做一项研究。
我知道这是一个老问题,但我觉得它能帮助别人。
有一个很好的教程,它是使用Android, OpenCV和OpenGL ES 3.0与Android studio使用NDK构建一个小型AR应用程序。它有很好的解释和一个Github repo来检查代码。
http://www.anandmuralidhar.com/blog/android/simple-ar/它使用ORB特征来检测/匹配标记以在场景中生成3D对象。关于第二点,本教程可以让您了解该过程是如何工作的。