文章目录
一、单应性矩阵
OpenCV在通过特征描述子完成描述子匹配之后,会得到一些关键点对,我们会把这些关键点对分别添加到两个vector对象中,作为输入参数,调用单应性矩阵发现函数来发现一个变换矩阵H,函数 findHomography 就完成了这样的功能,有了变换矩阵H之后,我们就可以根据输入图像四点坐标,从场景图像上得到特征匹配图像的四点坐标。
调用单应性矩阵发现函数 findHomography
最小二乘方法在描述子匹配输出的点对质量很好,理想情况下是图像没有噪声污染与像素迁移与光线恒定,但是实际情况下图像特别容易受到光线、噪声导致像素迁移,从而产生额外的多余描述子匹配,这些点对可以分为outlier跟inlier两类。
RANSAC(Random Sample Consensus)可以很好的过滤掉outlier点对,使用合法的点对得到最终的变换矩阵H,基本思想是,它会从给定的数据中随机选取一部分进行模型参数计算,然后使用全部点对进行计算结果评价,不断迭代,直到选取的数据计算出来的错误是最小,比如低于0.5%即可。
注意有时候RANSAC方法不会收敛,导致图像对齐或者配准失败,原因在于RANSAC是一种全随机的数据选取方式,完全没有考虑到数据质量不同。
1 选择求解模型要求的最少要求的随机点对
2 根据选择随机点对求解/拟合模型得到参数
3 根据模型参数,对所有点对做评估,分为outlier跟inlier
4 如果所有inlier的数目超过预定义的阈值,则使用所有inlier重新评估模型参数,停止迭代
5 如果不符合条件则继续1~4循环。
PROSAC(Progressive Sampling Consensus)(RANSAC算法的改进算法)即渐近样本一致性,该方法采用半随机方法,对所有点对进行质量评价计算Q值,然后根据Q值降序排列,每次只在高质量点对中经验模型假设与验证,这样就大大降低了计算量,在RANSAC无法收敛的情况下,PROSAC依然可以取得良好的结果。OpenCV中的RHO方法就是基于PROSAC估算。
LMEDS最小中值方法拟合,该方法可以看成是最小二乘法的改进,原因在于计算机视觉的输入数据是图像,一般都是各自噪声,这种情况下最小二乘往往无法正确拟合数据,所以采用最小中值方法可以更好实现拟合,排除outlier数据。但是它是对高斯噪声敏感算法。
1 随机选取很多个子集从整个数据集中
2 根据各个子集数据计算参数模型
3 使用计算出来的参数对整个数据集计算中值平方残差
4 最终最小残差所对应的参数即为拟合参数。
二、FLANN匹配
在上篇文章中介绍了暴力匹配BFMatcher,相对暴力匹配BFMatcher来讲,FLANN匹配算法比较准确、快速和使用方便。FLANN具有一种内部机制,可以根据数据本身选择最合适的算法来处理数据集。值得注意的是,FLANN匹配器只能使用SURF和SIFT算法来检测角点。
2.1 FLANN介绍
FLANN (Fast_Library_for_Approximate_Nearest_Neighbors)快速最近邻搜索包。
它是一个对大数据集和高维特征进行最近邻搜索的算法的集合,而且这些算法都已经被优化过了。在面对大数据集时它的效果要好于 BFMatcher。
-
indexparams = dict(algorithm =FLANN_INDEX_KDTREE, trees = 5)
-
searchparams = dict(checks = 100)
指定递归遍历的次数checks 。值越高结果越准确, 但是消耗的时间也越多。
首先我们定义一个需要查询的图像,在其中找到一些特征点(关键点),然后再在另一幅图像中也找到了一些特征点,最后对这两幅图像之间的特征点进行匹配。
整个匹配过程如下:
- 使用 calib3d 模块中的cv2.findHomography() 函数。如果将这两幅图像中的特征点集传给这个函数,他就会找到这个对象的透视图变换。然后就可以使用函数cv2.perspectiveTransform() 找到这个对象了。至少要 4 个正确的点才能找到这种变换。
- 在匹配过程可能会有一些错误,而这些错误会影响最终结果。为了解决这个问题,算法使用RANSAC 和 LEAST_MEDIAN(可以通过参数来设定)。
好的匹配提供的正确的估计被称为 inliers,剩下的被称为outliers。cv2.findHomography() 返回一个掩模,这个掩模确定了 inlier 和outlier 点。
用比值判别法(ratio test)删除离群点:
检测出的匹配点可能有一些是错误正例(false positives)。
以为这里使用过的kNN匹配的k值为2(在训练集中找两个点),第一个匹配的是最近邻,第二个匹配的是次近邻。直觉上,一个正确的匹配会更接近第一个邻居。
换句话说,一个不正确的匹配,两个邻居的距离是相似的。因此,我们可以通过查看二者距离的不同来评判距匹配程度的好坏。比值检测认为第一个匹配和第二个匹配的比值小于一个给定的值(一般是0.5),这里是0.7。
FLANN实现方式如下:
2.2 FLANN的单应性匹配
单应性是一个条件,该条件表面当两幅图像中的一副出像投影畸变时,他们还能匹配。
实现代码如下:
又测试了一组照片如下:
2.3 FLANN特征保存与匹配
在实际中,我们根据一张图片在众多的图片中查找匹配率最高的图片。如果按照上面的例子,也可以实现,但每次匹配时都需要重新检测图片的特征数据,这样会导致程序运行效率。
因此,我们可以将图片的特征数据进行保存,每次匹配时,只需读取特征数据进行匹配即可。
实现代码如下:
保存图片的特征数据
加载图片的特征数据,对需要匹配的数据集进行匹配
图片模板与批量寻找
当然你也可以对需要寻找的图片制作几个通用模板,方便批量寻找图片(该算法有个很大的缺点,请自行体会)。
参考与鸣谢