AKAZE 局部特征匹配
在本教程中,我们将学习如何使用 AKAZE [ANB13] 局部特征来检测并匹配两幅图像上的关键点。 我们将利用给定的单应性矩阵在一对图像上寻找关键点,对其进行匹配,并统计内点(inliers)的数量(即符合给定单应性矩阵的匹配)。
你可以在此处找到本示例的扩展版本: https://github.com/pablofdezalc/test_kaze_akaze_opencv
我们将使用 牛津数据集 中 Graffiti 序列的第 1 张和第 3 张图像。
单应性矩阵由一个 3×3 矩阵给出:
7.6285898e-01 -2.9922929e-01 2.2567123e+023.3443473e-01 1.0143901e+00 -7.6999973e+013.4663091e-04 -1.4364524e-05 1.0000000e+00
你可以在 opencv/samples/data/ 中找到这些图像(graf1.png、graf3.png)与单应性矩阵(H1to3p.xml)。

- 载入图像与单应性矩阵
这里我们载入的是灰度图像。单应性矩阵存储在用 FileStorage 创建的 xml 文件中。
- 使用 AKAZE 检测关键点并计算描述子
我们创建 AKAZE,并检测、计算 AKAZE 的关键点与描述子。由于我们不需要 mask 参数,因此使用 noArray()。
- 使用暴力匹配器寻找 2-NN 匹配
我们使用汉明距离(Hamming distance),因为 AKAZE 默认使用二值描述子。
-
使用 2-NN 匹配和比率准则筛选正确的关键点匹配 如果最近匹配的距离显著小于次近匹配的距离,则该匹配是正确的(即匹配不存在歧义)。
-
检查匹配是否符合单应性模型
如果第一个关键点的投影到第二个关键点的距离小于阈值,则它符合单应性模型。
我们为内点创建了一组新的匹配,因为绘图函数需要这样做。
- 输出结果
这里我们保存结果图像并打印一些统计信息。
根据你所用的 OpenCV 版本,得到的结果应与以下数据一致:
Keypoints 1: 2943 Keypoints 2: 3511 Matches: 447 Inliers: 308 Inlier Ratio: 0.689038