我使用OpenCV 2.4.3 c++接口来查找两个图像之间的匹配点。第一次尝试是使用SURF。唯一的问题是耗时,所以我尝试了新的FREAK提取器。使用SURF进行检测,使用FREAK进行描述,我意识到FREAK将关键点的数量减少到几乎检测到的一半,并且结果匹配不够。这就是为什么我尝试FAST来获得更多的关键点。结果:
- SURF检测器,SURF提取器,BFMatcher交叉检查true, RANSAC:第一张图像70关键点,第二张图像50关键点,200ms。250 ms。15毫秒。15 ms。
- SURF检测器,FREAK提取器,BFMatcher交叉检查true, RANSAC:第一张图像39个关键点,第二张图像(FREAK之后)30个关键点,200ms。, 50毫秒,50毫秒。, 0 ms。结果是好的匹配太少了。
- FAST检测器,畸形提取器,BFMatcher交叉检查true, RANSAC: 120个关键点,90个关键点,(畸形后69和48个关键点),10ms。, 450 ms, 15 ms, 10 ms.
之后,我使用了ORBFeatureDetector,它获得的关键点数量与FAST相同,但在FREAK提取之后,每个图像的关键点都是0。我做错了什么吗?ORB关键点与FAST获得的关键点不同吗?也许我可以再问一个问题,但我还有最后一个问题。什么是检测器/提取器的最佳组合,以获得与我使用SURF的第一次实验相同的结果,但减少处理时间?因为当我获得更多的关键点时,提取器部分也更耗时,尽管我使用了FREAK。
FREAK会在无法生成描述符的情况下移除点,很多时候这种情况发生在图像的边界,因为如果它落在边界图像之外,它就无法生成描述符。我通过在提取之前应用ROI来避免这个问题。
我也使用FAST结合FREAK,我得到了最好的结果,但我仍然有减少提取时间的问题,这对我来说太高了。
实际上,您使用了参数cross check = true。这也是为什么你的很多分数会被取消的原因。当此参数为true时,从计算的角度来看是昂贵的。它用于避免在匹配过程中不完全匹配的描述符对。
如果你有两组描述符D1和D2,那么,这个参数只允许在D1-> D2和D2->D1匹配方向上通常匹配的对。
那么,这完全取决于你的应用程序,也许你不需要那么高的匹配精度…
致以最亲切的问候。亚历克斯
除了边界点的移除,正如Jav_Rock所建议的那样,点的巨大(不一致?!)减少实际上取决于存储在keyPoint中的size参数。即使您将scalnormalize设置为false,并且size参数的float值接近于零,FREAK也会丢弃这个keyPoint。(但我似乎无法弄清楚为什么,因为keyPoint的大小参数只有在scalnormalize为真时才使用:source)
因此,如果你不使用scalnormalize,请确保将size参数设置为大于0的值(例如1)。
并将其作为单位"pixelsize"的值进行干预(当使用scalnormalize时)。
顺便说一句。默认最小关键点大小为7。
FAST只是一个关键点检测器(没有描述符)。如果您将FAST和use for description (multi-scale) BRIEF结合起来,您将得到ORB。