十四讲中第九讲中的3D-2D(参考帧的3D、当前帧的2D)计算变换矩阵过程:
Mat rvec, tvec, inliers;
cv::solvePnPRansac(pts3d, pts2d, K, Mat(), rvec, tvec, false, 100, 4.0,0.99, inliers);
参数列表分别为:
pts3d:一个vector(由多个三维点组成),这些三维点都是已经经过筛选后的匹配距离较小的点
pts2d:一个vector(由多个二维点组成),这些二维点都是已经经过筛选后的匹配距离较小的点
注意:上面的筛选出来的距离较小的点并不代表这些点就完全是正确的匹配,很有可能有误匹配在里面!
因此,需要使用RANSC算法进行筛选,去掉那些外点,然后用内点进行PnP的计算。
下面对RANSAC算法进行介绍,主要摘自https://blog.csdn.net/robinhjwy/article/details/79174914
RANSAC的全称是:Random Sample Consensus(随机抽样一致)。
该算法的核心宗旨在于:它可以从一组包含“外点”(outliers,外点也可以叫做离群点、噪声点)的观测数据集(data set)中,通过迭代的方式估计数学模型的参数。该算法是一种不确定的算法,即有一定的概率得出合理的结果,为了提高这个概率必须提高迭代的次数。
通俗点叙述这个算法的宗旨:从一堆数据里挑选出最心仪的数据。当然心仪当然是个标准(心仪的标准:满足直线方程还是满足圆的方程、以及能容忍的误差e),平面中确定一条直线需要2个点,确定一个圆需要3个点。下面是通俗的过程(以直线为例):
1. 平面中随机找2个点,拟合一条直线,并且计算在容忍误差e中有多少点满足这条直线。
2. 重新随机找2个点,拟合直线,看看这条直线是不是能容忍更多的点,如果是的话,就暂时记这条直线为结果。如果不是,结果还是原先的直线。
3. 重复2(即循环迭代)。
4. 迭代次数到达就输出结果。
RANSAC算法的优缺点:
优点 | 只要这个模型在直观上存在,算法就有一定的概率找到它;噪声点可以任意分布,噪声点数量可以远远大于内点 |
---|---|
缺点 | 必须先指定一个合适的容忍误差e;必须指定迭代次数来作为收敛条件,该迭代次数下得到的结果有可能不是最优结果,甚至不是正确结果;只能从特定的数据集中估计出一个模型,如果存在多个模型,RANSAC找不出别的模型 |
RANSAC算法的输入输出:
输入:
data set :一组观测数据集
model :适用于数据的模型(即上面说的心仪的标准)
n :适用于模型的最少数据个数(比如,直线模型需要2个点;圆模型需要3个点)
k :算法的迭代次数
t :用于决定数据是否适应于模型的阈值(上面说的可容忍的误差e)
d :判定模型是否适用于数据集的数据数目(就是说假设随机出来了一条直线,有10个点到该直线的距离在e范围内,那我们就认为此直线模型参数符合预期,如果此时迭代结束,就将此模型参数输出,如果总是不够10个点,那么就表示没有找到模型参数)
输出:
best_model:与数据集最匹配的模型的参数(如果是模型是直线y=ax+b,那么输出参数就是a、b。如果没找到更好的模型,返回null)
best_consensus_set:估计出模型的参数点
best_error:跟数据集相关的估计出的模型错误
--------------------------------------------------------------------