18

我正在使用 OpenCV 2.4.3 c++ 接口来查找两个图像之间的匹配点。第一次尝试是使用 SURF。唯一的问题是耗时,所以我尝试了新的 FREAK 提取器。使用 SURF 进行检测,使用 FREAK 进行描述,我意识到 FREAK 将关键点的数量减少到几乎检测到的一半,并且结果匹配还不够。这就是原因,我尝试 FAST 来获得更多的关键点。结果:

  1. SURF 检测器,SURF 提取器,BFMatcher crosscheck true,RANSAC:第一个图像 70 个关键点,第二个图像 50 个关键点,200 毫秒。250 毫秒。15 毫秒。15 毫秒。
  2. SURF 检测器,FREAK 提取器,BFMatcher 交叉检查为真,RANSAC:第一个图像 39 个关键点,第二个图像 30 个关键点(在 FREAK 之后),200 毫秒,50 毫秒。, 0 毫秒, 0 毫秒。结果是好的匹配太少了。
  3. FAST 检测器、FREAK 提取器、BFMatcher crosscheck true、RANSAC:120 个关键点、90 个关键点(FREAK 之后的 69 和 48 个关键点)、10 毫秒、450 毫秒、15 毫秒、10 毫秒。

之后,我使用了 ORBFeatureDetector,它获得的关键点数量与 FAST 相同,但在 FREAK 提取器之后,每个图像的结果关键点为 0。难道我做错了什么?ORB 关键点与从 FAST 获得的关键点不同吗?也许我可以为此提出另一个问题,但我有最后一个问题。什么是检测器/提取器的最佳组合,以获得与我使用 SURF 的第一次实验相同的结果,但减少了处理时间?因为当我获得更多关键点时,提取器部分也更耗时,尽管我使用 FREAK。

4

4 回答 4

12

如果 FREAK 无法为其生成描述符,则 FREAK 会删除点,这种情况很多时候发生在图像的边界,因为如果它超出边界图像,它就无法生成描述符。我通过在提取之前应用 ROI 来避免这个问题。

我也将 FAST 与 FREAK 结合使用,我得到了最好的结果,但我仍然有减少提取时间的问题,这对我来说太高了。

于 2013-02-06T12:25:57.073 回答
3

实际上,您使用了参数 cross check = true。这也是你很多积分被淘汰的原因。从计算的角度来看,这个参数如果为真,则代价高昂。它用于避免在匹配过程中不完全匹配的描述符对。

如果您有两组描述符 D1 和 D2,则此参数仅允许在 D1-> D2 和 D2->D1 匹配方向上通常匹配的对。

那么,这一切都取决于您的应用程序,也许您不需要那么高的匹配精度......

最好的祝福。

亚历克斯

于 2013-12-02T20:57:59.233 回答
3

除了删除边界点,正如 Jav_Rock 所建议的那样,点的巨大(不一致?!)减少实际上取决于您存储在 keyPoint 中的大小参数。即使您将 scaleNormalized 设置为 false,如果大小参数的浮点值接近零,FREAK 也会丢弃此关键点。(但我似乎无法弄清楚为什么,因为 keyPoint 的大小参数仅在 scaleNormalized 为真时使用:source

因此,如果您不使用 scaleNormalization,请务必将 size 参数设置为大于零(例如一)的值。
并将其作为单位“像素大小”的值(使用 scaleNormalization 时)。
顺便提一句。默认情况下,最小关键点大小为 7 。

希望这可以帮助...

于 2014-03-24T11:07:38.503 回答
1

FAST 只是一个关键点检测器(没有描述符)。如果您结合 FAST 和用于描述(多尺度)BRIEF,您将获得 ORB。

于 2013-01-26T14:52:44.317 回答