Skip to content

使用 FLANN 进行特征匹配

在本教程中,你将学到如何:

  • 使用 cv::FlannBasedMatcher 接口,借助 flann 模块完成快速、高效的匹配。

\warning 你需要 OpenCV contrib 模块 才能使用 SURF 特征 (替代方案有 ORB、KAZE 等特征)。

经典的特征描述子(SIFT、SURF 等)通常使用欧氏距离(或 L2 范数)进行比较与匹配。 由于 SIFT 与 SURF 的描述子表示的是邻域内方向梯度直方图(SURF 则是 Haar 小波响应的直方图), 因此欧氏距离的替代方案是基于直方图的度量(χ2\chi^{2}、推土机距离(Earth Mover’s Distance,EMD)等)。

Arandjelovic 等人在 [Arandjelovic:2012:TTE:2354409.2355123] 中提出将其扩展为 RootSIFT 描述子:

用平方根(Hellinger)核代替标准的欧氏距离来度量 SIFT 描述子之间的相似度, 能够在流水线的各个阶段带来显著的性能提升。

二值描述子(ORB、BRISK 等)使用汉明距离进行匹配。 该距离等价于统计两个二值串中不同元素的个数(即对二者做异或(XOR)运算后进行人口计数): dhamming(a,b)=∑i=0n−1(ai⊕bi)d_{hamming} \left ( a,b \right ) = \sum_{i=0}^{n-1} \left ( a_i \oplus b_i \right )

为了过滤匹配,Lowe 在 [Lowe04] 中提出使用距离比率测试(distance ratio test)来尝试剔除错误匹配。 具体做法是计算某个关键点的两个最近匹配之间的距离比率,当该值低于某个阈值时即视为一次好的匹配。 事实上,该比率有助于区分歧义匹配(两个最近邻之间的距离比率接近 1)与区分度良好的匹配。 下面这张来自 SIFT 论文的图展示了基于最近邻距离比率测试时,匹配正确的概率。

其他的或附加的过滤测试包括:

  • 交叉验证测试(cross check test:当特征 fbf_b 是 IbI_b 中与 faf_a 的最佳匹配, 且特征 faf_a 是 IaI_a 中与 fbf_b 的最佳匹配时,才认为匹配 (fa,fb)\left( f_a, f_b \right) 是好的)
  • 几何测试(剔除不符合某个几何模型的匹配,例如对平面物体使用 RANSAC 或鲁棒单应性矩阵估计)

Feature_FlannMatcher_Lowe_ratio_test.png

本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例

  • 下面是使用距离比率测试进行 SURF 特征匹配的结果:

Feature_FlannMatcher_Result_ratio_test.jpg