我正在使用OpenCV 2.4.3 c ++界面来查找两个图像之间的匹配点。第一次尝试是使用SURF。唯一的问题是消耗时间,所以我尝试了新的FREAK提取器。使用SURF进行检测和FREAK进行描述,我意识到FREAK将关键点的数量减少到几乎检测到的一半,并且得到的匹配不够。这就是原因,我尝试了FAST以获得更多关键点。结果:
之后,我使用了ORBFeatureDetector,它获得了与FAST相同数量的关键点,但在FREAK提取器之后,每个图像的结果关键点为0。难道我做错了什么? ORB关键点是否与从FAST获得的关键点不同? 也许我可以为此开另一个问题,但我有最后一个问题。检测器/提取器的最佳组合是什么才能获得与使用SURF的第一次实验相同的结果,但缩短处理时间?因为当我获得更多关键点时,提取器部分也更耗时,尽管我使用FREAK。
答案 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。