ransac算法(随机抽样一致性)
特征匹配要是遇到误匹配时,如何筛选处理?
答案就是用ransac算法进行过滤。
RANSAC算法背后的核心思想是:支撑集越大,所计算矩阵正确的
如果一个(或多个)随机选取的匹配项是错误的,那么计算得到的基础矩
的支撑集肯定会很小。反复执行这个过程,最后留下支撑集最大的矩阵作
因此我们的任务就是随机选取8个匹配项,重复多次,最后得到8个
大的支撑集。如果整个数据集中错误匹配项的比例不同,那么选取到8
各不相同。但是我们知道,选取的次数越多,在这些选项中至少有一组优
更准确地说,假设匹配项中局内项(优质匹配项)的比例是w,那么选
率就是w。因此,在一次选取中至少包含一个错误匹配项的概率是(1-w
那么只选取到优质匹配项的概率是1-(1-w2)x。
这就是置信概率,标为c。要得到正确的基础矩阵,就需要至少一个
率越大越好。所以在运行 RANSAC算法时,我们需要确定得到特定可信等级所需的选取次数k
详见函数(ransactest)(位于robustmatcher类)
上述代码有些长,因为关键点必须在计算基础矩阵前转换为cv::Point2f。在使用含有
CV::EM_RANSAC标志的函数cv:finaFundamentalMat时,会提供两个附加参数。第一个参
数是可信度等级,它决定了执行选代的次数(默认值是0.99)。第二个参数是点到对极线的最大
距离,小于这个距离的点被视为局内点。如果匹配对中有一个点到对极线的距离超过这个值,就
现这个匹配对为局外项。这个函数返回字符值的std:vector,表示对应的输入匹配项被标记
为局外项(0)或局内项(1)。因此,代码最后的循环可以从原始匹配项中提取出优质的匹配项
匹配集中的优质匹配项越多,RANSAC算法得到正确基础矩阵的概率就越大。因此我们在
配特征点时使用了交叉检查过滤器。你还可以使用上一节介绍的比率测试,进一步提高最终匹
集的质量。这是一个互相权衡的问题,要考虑这三点:计算复杂度、最终匹配项数量、要得到
包含准确匹配项的匹配集所需的可信度等级。
改进:
2.改进匹配项
在双视图系统中,每个点肯定位于与它对应的点的对极线上。这就是基础矩阵表示的极线约束。因此,如果已经有了很准确的基础矩阵,就可以利用极线约束来更正得到的匹配项,具体做法是将强制匹配项置于它们的对极线上。使用 OpenCV函数 cv: correctMatches可以很方便地实现这个功能
std: vector<cv: Point2f> newPoints1, newPoints2:/改进匹配项 //基础矩阵 correctMatches(fundamental //原始位置 points1, points2//老位置 newPoints1, newPoints2);/新位置