2013-01-21 39 views
17

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

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

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

+0

我喜欢用BRREF检测器和FREAK描述符。它工作得很好。 –

回答

11

FREAK删除点,如果它不能产生一个描述它,很多时候,这发生在图像的边界,如果它掉下来的边界图像的它不能产生一个描述符。我在提取之前应用ROI来避免此问题。

我也FREAK使用快速结合,我得到的最好的结果,但我仍然有减少提取时间,这是太高了我的问题。

+0

但是在某些情况下,关键点的数量从800减少到84。边界不是太多吗? –

+0

它取决于与patternScale参数相关的关键点大小。但是,这是相当多的。 –

+0

Pfff。 PatternScale。我无法理解这个FREAK描述符,也没有获得任何好的结果。谢谢Jav –

1

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

+0

也许我没有解释清楚。问题在于,在检测关键点之后,我尝试使用FREAK进行描述,但是此描述符减少了描述之后检测到的关键点的数量。特别是当我使用ORB时,描述后得到的关键点为0.我注意到在FAST和ORB之后调试结果关键点的一点是,使用ORB时,每个关键点上的响应都是非常小的浮点值。 –

+0

请给我们展示一些代码片段。对我来说,它完美的作品。 – user2011909

+1

我无法重现我的问题。 –

3

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

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

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

最好的问候。

亚历

+0

我确实需要精确度,这就是我使用交叉检查的原因。不管怎么说,还是要谢谢你。 –

3
从拆除的边界点

除此之外,作为Jav_Rock表明,点的巨大(不一致?)下降真的取决于你存储在关键点的尺寸参数。即使将scaleNormalized设置为false,size-parameter的浮点值接近于零,FREAK也会放弃此keyPoint。(但我似乎无法弄清楚为什么,因为keyPoint的大小参数仅在scaleNormalized为真时使用:source

所以一定要将大小参数设置为大于零的值(如一个),如果你没有使用scaleNormalization。
并将其作为单位'像素大小'进行插值(当使用scaleNormalization时)。
Btw。最小关键点大小为7×default

希望这有助于...

相关问题