我遇到了很多AR库/ SDK / API,所有这些都是基于标记的,直到我找到this video,从描述和注释中看起来他正在使用SIFT来检测对象并跟着它。
我需要为Android做到这一点,所以我需要在纯Java中完全实现SIFT。
我愿意这样做,但我需要先了解SIFT如何用于增强现实。
我可以使用您提供的任何信息。
答案 0 :(得分:10)
在我看来,尝试为便携式设备实现SIFT是疯狂的。 SIFT是一种图像特征提取算法,包括复杂的数学运算,当然需要大量的计算能力。 SIFT也获得了专利。
但是,如果你确实想要完成这项任务,你应该先做一些研究。您需要检查以下内容:
为何选择Android NDK?因为通过在Java应用程序使用的C库中实现该算法,您可能会获得更显着的性能提升。
在开始任何事情之前,请确保你做了那项研究,因为半途而废的图像特征提取算法对Android手机来说太过分了。实现这样一种算法可以提供良好的结果并在可接受的时间内运行,更不用说使用它来创建AR应用程序了。
就像你如何将它用于AR一样,我想你在图像上运行算法得到的描述符必须与保存在中央数据库中的数据相匹配。然后可以向用户显示结果。从SURF收集的图像的特征应该描述它,例如它可以使用那些来识别。我在这方面并不是很有经验,但网上总是有资源。您可能想要开始使用Object Recognition这样的通用内容。
祝你好运:)
答案 1 :(得分:2)
如果我在哪里,我会研究SIFT功能的工作原理(以及原因)(正如所说,它的维基百科页面提供了一个很好的cochise解释,有关详细信息,请查看科学论文(链接到在维基百科)),然后建立适合自己口味的自己的变种;即在您的应用程序所需的性能和CPU负载之间保持最佳平衡。
例如,我认为高斯平滑可能会被一些更快速的平滑方式所取代。
此外,当您构建自己的变体时,您与专利没有任何关系(已经有很多变体,如GLOH)。
答案 2 :(得分:2)
我已经尝试过用于330Mhz Symbian手机的SURF,即使使用所有优化和查找表,它仍然太慢了。 SIFT应该更慢。每个人现在都在使用FAST手机。无论如何,特征提取不是最大的问题。通信和清除误报比较困难。 快速链接 http://svr-www.eng.cam.ac.uk/~er258/work/fast.html
答案 3 :(得分:1)
我建议您首先查看已在OpenCV库中实现的功能,包括SURF,MSER和其他功能:
http://opencv.willowgarage.com/documentation/cpp/feature_detection.html
这可能足以满足您的应用需求,并且比SIFT更快。如上所述,SIFT获得专利。
此外,首先在移动平台上进行性能测试,只需在每一帧中提取功能,这样您就可以了解哪些功能可以实时运行。
答案 4 :(得分:1)
您是否在Android端口尝试过OpenCV的FAST实现?我已经对它进行了测试,并且运行得非常快。
您还可以围绕检测到的FAST关键点计算缩减的直方图描述符。我听说过3x3而不是标准的4x4 SIFT。如果您使用NEON指令进行大量优化,那么它有可能实时工作。否则,我会推荐一些快速而简单的东西,比如关键点周围的补丁的平方或绝对差值的总和非常快。
SIFT不是灵丹妙药。对于实时视频应用,它通常是矫枉过正的。
答案 5 :(得分:0)
与往常一样,维基百科是一个很好的起点:http://en.wikipedia.org/wiki/Scale-invariant_feature_transform,但请注意SIFT已获得专利。