使用 FLANN 进行特征匹配
在本教程中,你将学到如何:
- 使用 cv::FlannBasedMatcher 接口,借助 flann 模块完成快速、高效的匹配。
\warning 你需要 OpenCV contrib 模块 才能使用 SURF 特征 (替代方案有 ORB、KAZE 等特征)。
经典的特征描述子(SIFT、SURF 等)通常使用欧氏距离(或 L2 范数)进行比较与匹配。 由于 SIFT 与 SURF 的描述子表示的是邻域内方向梯度直方图(SURF 则是 Haar 小波响应的直方图), 因此欧氏距离的替代方案是基于直方图的度量(、推土机距离(Earth Mover’s Distance,EMD)等)。
Arandjelovic 等人在 [Arandjelovic:2012:TTE:2354409.2355123] 中提出将其扩展为 RootSIFT 描述子:
用平方根(Hellinger)核代替标准的欧氏距离来度量 SIFT 描述子之间的相似度, 能够在流水线的各个阶段带来显著的性能提升。
二值描述子(ORB、BRISK 等)使用汉明距离进行匹配。 该距离等价于统计两个二值串中不同元素的个数(即对二者做异或(XOR)运算后进行人口计数):
为了过滤匹配,Lowe 在 [Lowe04] 中提出使用距离比率测试(distance ratio test)来尝试剔除错误匹配。 具体做法是计算某个关键点的两个最近匹配之间的距离比率,当该值低于某个阈值时即视为一次好的匹配。 事实上,该比率有助于区分歧义匹配(两个最近邻之间的距离比率接近 1)与区分度良好的匹配。 下面这张来自 SIFT 论文的图展示了基于最近邻距离比率测试时,匹配正确的概率。
其他的或附加的过滤测试包括:
- 交叉验证测试(cross check test:当特征 是 中与 的最佳匹配, 且特征 是 中与 的最佳匹配时,才认为匹配 是好的)
- 几何测试(剔除不符合某个几何模型的匹配,例如对平面物体使用 RANSAC 或鲁棒单应性矩阵估计)

本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例
- 下面是使用距离比率测试进行 SURF 特征匹配的结果:
