SURF声称比SIFT更快更强大,但我在测试中发现这不是真的。具有中等图像(600 * 400)的SIFT与SURF的速度相同,它可以很好地识别物体(甚至可能比SURF更好)。
我做错了吗?
[编辑]
请注意an article解释了如何通过对opencv代码进行一些更改来提高SURF的速度。
如果你认识一些活跃的opencv开发者,请让他看看。
答案 0 :(得分:28)
当它被设计时它意图更快,但实际上差异与标准相机的实时应用无关。顺便说一句,FAST探测器更快,实际上非常强大。
我正在为手机上的实时增强现实编程,我们在应用程序执行期间使用SIFT(初始化)和FAST(金字塔FAST进行实时特征检测)的组合。 FAST实际上更快,它在OpenCV中实现,所以如果你不想坚持使用SURF试一试。我没有看到最近的实时使用SURF的论文,但我看到了SIFT的修改版本,描述符和其他类型的修改的像素更少,所以看起来SURF是一个很好的想法,没有得到据我所知。无论如何,这只是我的意见。
答案 1 :(得分:16)
OpenCV没有最佳的SURF实现速度或稳定性。如果你计算两个写得很好的实现的FLOPS,那么SURF基本上比SIFT更快。 SIFT通过使用大型高斯核对图像进行多次卷积来计算图像金字塔,而SURF使用积分图像完成近似。
要查看SURF的几个实现的比较,请在此处查看我的页面:
http://boofcv.org/index.php?title=Performance:SURF
不幸的是,由于跨平台问题,OpenCV拒绝了与舍入相关的补丁。也许这个补丁会被调整并重新提交。在我自己的工作中,我注意到通用round()非常慢,并用自定义函数替换它。
至于Jav_Rock提到的FAST探测器,我只把它作为最后的手段。探测器的稳定性远远低于其他任何东西,但它确实很快。
答案 2 :(得分:5)
SURF应该更快,而SIFT更强大。阿斯特说600 * 400是今天标准的小图片是正确的;虽然。
也就是说,SURF应该比SIFT快许多个数量级。
答案 3 :(得分:3)
如果你在OPENCV中应用SIFT和SURF似乎比SURF更快,但没有任何变化,但事实并非如此。为了证明我已经在393 * 387像素图像上测试了它们。在运行相同的特征提取100次并获得其平均时间后,结果为
SIFT:0.0983946(s)
SURF:0.183372(s)
然而,关键点的数量有很大差异, SIFT:kpsize = 671 d-row = 671 d-col = 128
SURF:kpsize = 1156 d-row = 1156 d-col = 64
SURF的返回值几乎是SIFT关键点的两倍,所以说SIFT比SURF更快是不公平的。
当我们使用Fast作为检测器时,然后应用SIFT,SURF:
SIFT:0.199448(s) SURF:0.0613682(s)
SIFT:kpsize = 2362 d-row = 2362 d-col = 64
SURF:kpsize = 2362 d-row = 2362 d-col = 64
这里,SURF比SIFT快三倍。
答案 4 :(得分:2)
请使用the original implementation of SURF进行测试。打开简历比较慢。
在比较SIFT和SURF的原始实现时,you will get much faster results with SURF。通过调整参数,您可以更快地达到一个数量级。但是,稳健性可能会受到影响。这一切都取决于您的使用案例。
通常,SURF与SIFT一样健壮。根据数据集,您可能得到不同的结果,但 en gros ,在稳健性方面它们是相同的。
还有GPU implementations of SURF比我原来的实施速度快得多。
答案 5 :(得分:1)
我的冲浪功能检测器的速度提高了,不是每帧都应用,而是每隔6帧,我的应用程序就可以了。 做一个反击我, 如果(i%6 == 0),则发出if语句, 把你的代码放在这个if语句下,速度会增加