Skip to content

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+02
3.3443473e-01 1.0143901e+00 -7.6999973e+01
3.4663091e-04 -1.4364524e-05 1.0000000e+00

res.png

你可以在 opencv/samples/data/ 中找到这些图像(graf1.png、graf3.png)与单应性矩阵(H1to3p.xml)。

graf.png

  • 可下载的代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载的代码:点击 这里

  • 代码一览: 代码见下方示例

  • 可下载的代码:点击 这里

  • 代码一览: 代码见下方示例

  • 载入图像与单应性矩阵

这里我们载入的是灰度图像。单应性矩阵存储在用 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