RANSAC算法

参考链接:
SLAM RANSAC算法理解:https://blog.csdn.net/robinhjwy/article/details/79174914
RANSAC算法详解:https://blog.csdn.net/laobai1015/article/details/51682596
opencv特征匹配–RANSAC算法原理与源码解析:https://blog.csdn.net/luoshixian099/article/details/50217655

作用
用于处理SLAM中误匹配的筛选,opencv中滤除误匹配对采用RANSAC寻找一个最佳单应矩阵,找到最有的参数矩阵使得满足该矩阵的数据点个数最多.


RANSAC算法:RANdom SAmple consensus(随机抽样一致),从一组包含离群的被观测数据中估算出数学模型的参数。与最小二乘法不同,它有一定的概率得出一个合理的结果,为了提高概率必须提高迭代次数
RANSAC只使用局内点
最小二乘法尽可能去适应包括局外点在内的所有点

基本假设:样本中包含正确数据(inliers,偏差不大的数据,可以描述模型),也包括异常数据(outliers,偏离正常范围很远,无法适应数学模型的数据)即数据集中包含噪声,异常数据可能是由于错误的测量,错误的假设,错误的计算等造成的,同时,假设存在可以计算出符合正确数据的模型参数的方法。

综上, RANSAC的基本假设是:

  1. “内群”数据可以通过几组模型的参数分别叙述,而“离群”数据则是不适合模型化的数据
  2. 数据会受噪声影响,噪声指的是离群点,例如从极端的噪声或者错误解释有关数据的测量或者不正确的假设
  3. 给定一组内群,存在一个程序,可以估算最佳解释或者最适用于这一数据模型的参数

RANSAC算法步骤

  1. 随机从数据集中抽出4个样本数据(此4个数据之间不能共线),计算出单应矩阵H,记模型为M;
  2. 计算数据集中所有数据与模型M的投影误差,若误差小于阈值,加入内点集I
  3. 如果当前内点集I元素个数大于最优内点集I_best,则更新I_best=I,同时更新迭代次数k;
  4. 如果迭代次数大于k,则退出;否则迭代次数加1,并重复上述步骤。

Note:迭代次数在不大于最大迭代次数的情况下,是在不断更新的而不是固定的: k = log ⁡ 1 − p l o g ( 1 − w m ) k=\frac{\log{1-p}}{log(1-w^m)} k=log(1wm)log1p 其中p为置信度,一般取0.995;w为“内点”的比例;m为计算模型所需的最小样本数
代价函数

\sum_{i=0}^n(x_i'-\frac{h_{11}x_i+h_{12}y_i+h_{13}}{h_{31}x_i+h_{32}y_i+h_{33}})^2+(y_i'-\frac{h_{21}x_i+h_{22}y_i+h_{23}}{h_{31}x_i+h_{32}y_i+h_{33}})^2
 /**
     * 函数原型:
     * CV_EXPORTS_W bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
                                  InputArray cameraMatrix, InputArray distCoeffs,
                                  OutputArray rvec, OutputArray tvec,
                                  bool useExtrinsicGuess = false, int iterationsCount = 100,
                                  float reprojectionError = 8.0, double confidence = 0.99,
                                  OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE);
     * 参数:
     * objectPoints,要匹配的3d空间点数组
     * objectPoints,要匹配的2d图像点数组
     * cameraMatrix,相机内参矩阵
     * distCoeffs,相机畸变矩阵
     * rvec,旋转向量输出承接数组
     * tvec,平移向量输出承接数组
     * 后面的参数跟ransac算法有关。倒是都有默认值
     * useExtrinsicGuess,迭代初始值是否定为提供的rvec和tvec值,这里没有提供,所以用false
     * iterationsCount,迭代次数,ransac算法所必须的迭代次数
     * reprojectionError,重投影误差。ransac算法迭代时也必须要规定的误差阀值,来确定是否为内点。
     * confidence,置信度。ransac算法每次用于更新迭代次数的参数。一般固定选为0.995
     * inliers,内点输出承接数组
     * flags, Method for solving a PnP problem。
     */
    cv::solvePnPRansac ( pts3d, pts2d, K, Mat(), rvec, tvec, false, 100, 4.0, 0.99, inliers );
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值