为什么opencv FREAK提取器会删除这么多关键点,特别是使用ORB检测器

时间:2013-01-21 11:52:31

标签: opencv orb extractor feature-descriptor freak

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

  1. SURF检测器,SURF提取器,BFMatcher交叉检查true,RANSAC:70关键第一图像,50关键点第二图像,200ms。 250毫秒。为15ms。为15ms。
  2. SURF检测器,FREAK提取器,BFMatcher交叉检查true,RANSAC:39个关键点第一个图像,30个关键点第二个图像(FREAK之后),200ms。,50 ms。 ,0ms。,0ms。结果是匹配得太少了。
  3. FAST检测器,FREAK提取器,BFMatcher交叉检查true,RANSAC:120个关键点,90个关键点,(FREAK后69和48个关键点),10ms。,450 ms。,15 ms。,10 ms。
  4. 之后,我使用了ORBFeatureDetector,它获得了与FAST相同数量的关键点,但在FREAK提取器之后,每个图像的结果关键点为0。难道我做错了什么? ORB关键点是否与从FAST获得的关键点不同? 也许我可以为此开另一个问题,但我有最后一个问题。检测器/提取器的最佳组合是什么才能获得与使用SURF的第一次实验相同的结果,但缩短处理时间?因为当我获得更多关键点时,提取器部分也更耗时,尽管我使用FREAK。

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:3)

实际上,您使用参数cross check = true。这也是为什么你的积分被消除的原因。当为真时,该参数从计算的角度来看是昂贵的。它用于避免在匹配过程中不完全匹配的成对描述符。

如果你有两组描述符D1和D2,那么,这个参数只允许在D1->中通常匹配的对。 D2和D2-> D1匹配方向。

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

最好的问候。

亚历

答案 2 :(得分:3)

除了删除边界点之外,正如Jav_Rock建议的那样,点数的巨大(不一致?!)减少实际上取决于你存储在keyPoint中的size-parameter。即使您将scaleNormalized设置为false,size参数的浮点值接近零,FREAK也会丢弃此keyPoint。 (但我似乎无法弄清楚原因,因为只有当scaleNormalized为true时才使用keyPoint的size-parameter:source

因此,如果您没有使用scaleNormalization,请务必将size参数设置为大于零的值(例如一个)。
并将其作为一个值与单位' pixelsize' (使用scaleNormalization时) 顺便说一句。 default的最小关键点大小为7。

希望这会有所帮助......

答案 3 :(得分:1)

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