RANSAC算法的步骤:
1.从样本集M中随机选取一个样本初始化模型,解出模型参数
2.按照阈值,找出M中满足阈值的样本子集M
3.如果超过样本总数的那部分内点的数量超过了阈值,那么用所有确定的内点重新估计模型参数
4.否则,重复1到3的步骤N次。
RANSAC算法的输入为:需要处理的点集;以及可能符合的函数模型, 选择的模型决定了需要计算模型参数的点的个数。
RANSAC算法的输出为:满足某种关系的过滤点集 ;函数模型的参数。
RANSAC算法的实现步骤:
1. 根据你设定的函数模型,选定足够的点
2. 使用选定的点,计算得到函数模型参数
3. 判定其他点是否符合该函数,并统计满足的点的个数
4. 反复1-3步,最后,具有最多点满足的函数为求取的函数,满足该函数的点为inlier,反之,不满足该函数的点为outlier。
RANSAC算法及其消除错配应用:
一、RANSAC算法介绍模型参数估计方法,如经典的最小二乘法,可以根据某种给定的目标方程估计并优化模型参数以使其最大程度适应于所有给定的数据集。这些方法都没有包含检测并排除异常数据的方法,他们都基于平滑假设:忽略给定的数据集的大小,总有足够多的准确数据值来消除异常数据的影响。但是在很多实际情况下,平滑假设无法成立,数据中可能包含无法得到补偿的严重错误数据,这时候此类模型参数估计方法将无法使用。
RANSAC为RANDOM SAMPLE CONSENSUS的缩写,它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。它于1981年由Fischler和Bolles最先提出。RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(Outliers,偏离正常范围很远、无法适应数学模型的数据),即数据集中含有噪声。这些异常数据可能是由于错误的测量、错误的假设、错误的计算等产生的。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。RANSAC基本思想描述如下:①考虑一个最小抽样集的势为n的模型(n为初始化模型参数所需的最小样本数)和一个样本集P,集合P的样本数#(P)>n,从P中随机抽取包含n个样本的P的子集S初始化模型M;②余集SC=P/S中与模型M的误差小于某一设定阈值t的样本集以及S构成S*。S*认为是内点集,它们构成S的一致集(Consensus Set);③若#(S*)≥N,认为得到正确的模型参数,并利用集S*(内点inliers)采用最小二乘等方法重新计算新的模型M*;重新随机抽取新的S,重复以上过程。④在完成一定的抽样次数后,若为找到一致集则算法失败,否则选取抽样后得到的最大一致集判断内外点,算法结束。由上可知存在两个可能的算法优化策略。①如果在选取子集S时可以根据某些已知的样本特性等采用特定的选取方案或有约束的随机选取来代替原来的完全随机选取;②当通过一致集S*计算出模型M*后,可以将P中所有与模
型M*的误差小于t的样本加入S*,然后重新计算M*。RANSAC算法包括了3个输入的参数:①判断样本是否满足模型的误差容忍度t。t可以看作为对内点噪声均方差的假设,对于不同的输入数据需要采用人工干预的方式预设合适的门限,且该参数对RANSAC性能有很大的影响;②随机抽取样本集S的次数。该参数直接影响SC中样本参与模型参数的检验次数,从而影响算法的效率,因为大部分随机抽样都受到外点的影响;③表征得到正确模型时,一致集S*的大小N。为了确保得到表征数据集P的正确模型,一般要求一致集足够大;另外,足够多的一致样本使得重新估计的模型参数更精确。RANSAC算法经常用于计算机视觉中。例如,在立体视觉领域中同时解决一对相机的匹配点问题及基本矩阵的计算。
二、RANSAC在消除错配中的应用在特征点配对中,模型即为从一个平面上的特征点到另外一平面上的特征点的射影关系,反应为射影矩阵H。H是一个包含8个自由度的3*3矩阵,它最少可以由两平面中的4对匹配点计算出,但同一平面上的3个点必须不共面。
用RANSAC方法计算基本矩阵:
函数形式
int cvFindFundamentalMat( const CvMat* points1, const CvMat* points2, CvMat* fundamental_matrix, int method=CV_FM_RANSAC, double param1=1., double param2=0.99, CvMat* status=NULL);
参数:
points1:第一幅图像点的数组,大小为2xN/Nx2 或 3xN/Nx3 (N 点的个数),多通道的
1xN或Nx1也可以。点坐标应该是浮点数(双精度或单精度)。
points2:
第二副图像的点的数组,格式、大小与第一幅图像相同。
fundamental_matrix:输出的基本矩阵。大小是 3x3 或者 9x3 ,(7-点法最多可返回三个矩阵).
Method:计算基本矩阵的方法
CV_FM_7POINT – 7-点算法,点数目= 7
CV_FM_8POINT – 8-点算法,点数目 >= 8
CV_FM_RANSAC – RANSAC 算法,点数目 >= 8
CV_FM_LMEDS - LMedS 算法,点数目 >= 8
param1:这个参数只用于方法RANSAC 或 LMedS 。它是点到对极线的最大距离,超过这个值的点将被舍弃,不用于后面的计算。通常这个值的设定是0.5 or 1.0 。
param2:这个参数只用于方法RANSAC 或 LMedS 。 它表示矩阵正确的可信度。例如可以被设为0.99 。
Status:具有N个元素的输出数组,在计算过程中没有被舍弃的点,元素被被置为1;
否则置为0。这个数组只可以在方法RANSAC and LMedS 情况下使用;在其它方法的情况下,status一律被置为1。这个参数是可选参数。
说明:函数 FindFundamentalMat 利用上面列出的四种方法之一计算基本矩阵,并返回基本矩阵的值:没有找到矩阵,返回0,找到一个矩阵返回1,多个矩阵返回3。 计算出的基本矩阵可以传递给函数cvComputeCorrespondEpilines来计算指定点的对极线。