SURF 声称比 SIFT 更快、更健壮,但我在测试中发现这不是真的。中等图像 (600*400) 的 SIFT 与 SURF 的速度相同,并且可以很好地识别物体(甚至可能比 SURF 更好)。
难道我做错了什么?
[编辑]
请注意,有一篇文章解释了如何通过对 opencv 代码进行一些更改来更快地实现 SURF。
如果你认识一些活跃的 opencv 开发者,请让他看看。
当它被设计时,它的目的是更快,但实际上,这些差异与标准相机的实时应用无关。顺便说一句,FAST 检测器速度更快,而且相当稳健。我正在为手机上的实时增强现实编程,我们在应用程序执行期间结合使用 SIFT(初始化)和 FAST(用于实时特征检测的金字塔 FAST)。FAST 速度更快,而且它是在 OpenCV 中实现的,所以如果您不想坚持使用 SURF,可以尝试一下。我还没有看到最近使用 SURF 进行实时的论文,但我看到了 SIFT 的修改版本,描述符和其他类型的修改的像素更少,所以看起来 SURF 是一个没有得到的好主意据认为。无论如何,这只是我的意见。
OpenCV 在速度或稳定性方面没有最好的 SURF 实现。如果要计算两个编写良好的实现的 FLOPS,SURF 基本上比 SIFT 快得多。SIFT 通过使用大的高斯核对图像进行多次卷积来计算图像金字塔,而 SURF 使用积分图像来完成近似。
要查看几种 SURF 实现的比较,请查看我的页面:
http://boofcv.org/index.php?title=性能:冲浪
不幸的是,OpenCV 由于跨平台问题拒绝了与舍入相关的补丁。也许补丁会被调整并重新提交。在我自己的工作中,我注意到通用的 round() 非常慢,并用自定义函数代替了它。
至于 Jav_Rock 提到的 FAST 检测器,我只将其用作最后的手段。它的检测器比其他任何东西都不稳定,但它确实很快。
SURF 应该更快,而 SIFT 更健壮。Astor 说 600*400 在今天的标准下是一个小图像是正确的;尽管。
也就是说,SURF 应该比 SIFT 快很多数量级。
请使用SURF 的原始实现进行测试。打开 CV 速度较慢。
在比较 SIFT 和 SURF 的原始实现时,您将使用 SURF 获得更快的结果。通过调整参数,您可以更快地提高一个数量级。但是,稳健性可能会受到影响。这一切都取决于您的用例。
一般来说,SURF 和 SIFT 一样健壮。根据数据集的不同,您可能会得到不同的结果,但总体而言,它们在鲁棒性方面是相同的。
还有一些SURF 的 GPU 实现比我原来的实现要快得多。
没有任何改变,如果你在 OPENCV 中应用 SIFT 和 SURF,SIFT 似乎比 SURF 快,但事实并非如此。为了证明我已经在 393*387 像素的图像上测试了它们。在运行相同的特征提取 100 次并获得它们的平均时间后,结果是
SIFT: 0.0983946(s)
冲浪:0.183372(s)
但是关键点的个数有很大的区别, SIFT:kpsize = 671 d-row = 671 d-col = 128
冲浪: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
冲浪:kpsize = 2362 d-row = 2362 d-col = 64
在这里,SURF 比 SIFT 快三倍。
我提高了我的 Surf 特征检测器的速度,不是在每一帧上都应用它,而是在每 6 帧上应用它,这对我的应用程序来说没问题。做一个计数器i,做一个if语句if(i%6==0),把你的代码放在这个if语句下面,速度会提高