31

我正在使用SURFSIFT测试一些对象检测。

SURF 声称比 SIFT 更快、更健壮,但我在测试中发现这不是真的。中等图像 (600*400) 的 SIFT 与 SURF 的速度相同,并且可以很好地识别物体(甚至可能比 SURF 更好)。

难道我做错了什么?

[编辑]

请注意,有一篇文章解释了如何通过对 opencv 代码进行一些更改来更快地实现 SURF。

如果你认识一些活跃的 opencv 开发者,请让他看看。

4

6 回答 6

31

当它被设计时,它的目的是更快,但实际上,这些差异与标准相机的实时应用无关。顺便说一句,FAST 检测器速度更快,而且相当稳健。我正在为手机上的实时增强现实编程,我们在应用程序执行期间结合使用 SIFT(初始化)和 FAST(用于实时特征检测的金字塔 FAST)。FAST 速度更快,而且它是在 OpenCV 中实现的,所以如果您不想坚持使用 SURF,可以尝试一下。我还没有看到最近使用 SURF 进行实时的论文,但我看到了 SIFT 的修改版本,描述符和其他类型的修改的像素更少,所以看起来 SURF 是一个没有得到的好主意据认为。无论如何,这只是我的意见。

于 2012-07-02T21:02:28.887 回答
17

OpenCV 在速度或稳定性方面没有最好的 SURF 实现。如果要计算两个编写良好的实现的 FLOPS,SURF 基本上比 SIFT 快得多。SIFT 通过使用大的高斯核对图像进行多次卷积来计算图像金字塔,而 SURF 使用积分图像来完成近似。

要查看几种 SURF 实现的比较,请查看我的页面:

http://boofcv.org/index.php?title=性能:冲浪

不幸的是,OpenCV 由于跨平台问题拒绝了与舍入相关的补丁。也许补丁会被调整并重新提交。在我自己的工作中,我注意到通用的 round() 非常慢,并用自定义函数代替了它。

至于 Jav_Rock 提到的 FAST 检测器,我只将其用作最后的手段。它的检测器比其他任何东西都不稳定,但它确实很快。

于 2012-12-02T18:21:38.187 回答
5

SURF 应该更快,而 SIFT 更健壮。Astor 说 600*400 在今天的标准下是一个小图像是正确的;尽管。

也就是说,SURF 应该比 SIFT 快很多数量级。

于 2012-06-23T19:45:53.790 回答
5

请使用SURF 的原始实现进行测试。打开 CV 速度较慢。

在比较 SIFT 和 SURF 的原始实现时,您将使用 SURF 获得更快的结果。通过调整参数,您可以更快地提高一个数量级。但是,稳健性可能会受到影响。这一切都取决于您的用例。

一般来说,SURF 和 SIFT 一样健壮。根据数据集的不同,您可能会得到不同的结果,但总体而言,它们在鲁棒性方面是相同的。

还有一些SURF 的 GPU 实现比我原来的实现要快得多。

于 2017-04-12T21:36:46.717 回答
4

没有任何改变,如果你在 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 快三倍。

于 2014-12-10T10:06:54.310 回答
1

我提高了我的 Surf 特征检测器的速度,不是在每一帧上都应用它,而是在每 6 帧上应用它,这对我的应用程序来说没问题。做一个计数器i,做一个if语句if(i%6==0),把你的代码放在这个if语句下面,速度会提高

于 2015-08-14T14:48:46.577 回答