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);/新位置
原文地址:https://www.cnblogs.com/KAVEI/p/14762333.html