为什么使用ORB检测器时,opencv FREAK特征提取器会移除这么多关键点?

18
我正在使用OpenCV 2.4.3的C ++接口在两张图片之间查找匹配点。首次尝试使用SURF算法,唯一的问题是耗时较长,因此我尝试了新的FREAK特征提取器。使用SURF进行检测和FREAK进行描述后,我发现FREAK将关键点数量减少了近一半,导致匹配结果不足。因此,我尝试使用FAST算法来获取更多的关键点。以下是结果:
  1. SURF检测器,SURF提取器,BFMatcher交叉检查为true,RANSAC: 第一张图片70个关键点,第二张图片50个关键点,200毫秒,250毫秒,15毫秒,15毫秒。
  2. SURF检测器,FREAK提取器,BFMatcher交叉检查为true,RANSAC: 第一张图片39个关键点,第二张图片30个关键点(经过FREAK处理后),200毫秒,50毫秒,0毫秒,0毫秒。结果是匹配不够好。
  3. FAST检测器,FREAK提取器,BFMatcher交叉检查为true,RANSAC: 120个关键点,90个关键点(经过FREAK处理后分别为69和48个关键点),10毫秒,450毫秒,15毫秒,10毫秒。
之后,我使用ORBFeatureDetector检测器,它获得的关键点数与FAST相同,但经过FREAK提取器处理后,每张图片的结果都是0。我做错了什么吗?ORB的关键点与FAST获得的关键点不同吗? 也许我可以为此打开另一个问题,但这是我的最后一个问题。哪种检测器/提取器的组合能够获得与我第一次实验使用SURF相同的结果,同时缩短处理时间?因为随着我获得更多的关键点,提取器部分也变得更加耗时,尽管我使用FREAK。

我喜欢使用BRISK检测器和FREAK描述符。它的效果相当不错。 - Jean-Philippe Jodoin
4个回答

12

FREAK会在不能生成关键点描述符时删除这些点。由于超出图像边界的点无法生成描述符,因此这种情况经常发生在图像的边缘处。我通过在提取前应用ROI来避免这个问题。

我还使用FAST结合FREAK,并获得了最佳结果,但我仍然面临着减少提取器时间的问题,因为它对我来说太高了。


但在某些情况下,关键点的数量会减少,例如从800个到84个。这对于边界来说不太多吗? - min.yong.yoon
这取决于关键点的大小,与patternScale参数有关。但是,确实很多。 - Jav_Rock
Pfff. PatternScale. 我无法理解这个FREAK描述符,也不能获得任何好的结果。谢谢Jav - min.yong.yoon
是的,patternScale有点棘手,我给作者发了邮件,但仍未得到回复。无论如何,我得到了非常好的结果,这是调整参数、调整匹配器等问题,有点复杂。信息很少,需要一些经验才能成功。 - Jav_Rock
我会再试一次。还有一个问题。有关使用kmeans对FREAK进行聚类的线索吗?我的意思是,使用汉明距离创建BOW词汇? - min.yong.yoon
你说你在提取之前通过应用ROI来避免这个问题。你能具体告诉我你在做什么吗?我的意思是,例如,我需要从找到的所有关键点中提取特征。我应该如何设置ROI? - guneykayim

3
除了像Jav_Rock建议的去除边界点外,点数的巨大(不一致?)减少实际上取决于您在keyPoint中存储的size-parameter的大小参数。即使将scaleNormalized设置为false,如果size-parameter的浮点值接近于零,FREAK也会丢弃该keyPoint。(但我似乎无法弄清楚为什么,因为只有在scaleNormalized为true时才使用keyPoint的size-parameter:source
因此,如果您不使用scaleNormalization,请务必将大小参数设置为大于零的值(例如1)。并将其解释为具有“pixelsize”单位的值(在使用scaleNormalization时)。
顺便说一句,默认情况下最小关键点大小为7:default
希望这可以帮助到您...

3
实际上,您使用了参数交叉检查= true。这也是许多点被删除的原因之一。这个参数在计算方面是昂贵的。它用于避免匹配过程中不完全匹配的描述符对。
如果您有两组描述符D1和D2,则此参数仅允许在D1-> D2和D2-> D1匹配方向上通常匹配的对。
然后,这完全取决于您的应用程序,也许您不需要那么多的匹配精度...
最好的问候。 Alex

我确实需要精度,这就是我使用交叉检查的原因。无论如何,还是谢谢。 - min.yong.yoon

1

FAST只是一个关键点检测器(没有描述符)。如果你将FAST和用于描述(多尺度)的BRIEF结合起来,你就会得到ORB。


也许我没有解释清楚。问题是,在关键点检测之后,我尝试使用FREAK进行描述,但是这个描述符会减少描述后检测到的关键点数量。特别是当我使用ORB时,描述后得到的关键点为0。在调试FAST和ORB后得到的关键点时,我注意到使用ORB时,每个关键点的响应是一个非常小的浮点值。 - min.yong.yoon
请展示一些代码片段。对我来说,它完美地工作。 - user2011909
1
我无法复制我遇到的问题。 - min.yong.yoon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接