一家之言,仅作分享,如有不合理或需要改进的地方,欢迎各位讨论。
RANSAC(RANdom SAmple Consensus随机抽样一致),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。
从上述对RANSAC思想的解释,可以提取出以下几个关键点:
- 要求解的是一个数学模型的参数;
- 求解方式是迭代取最优;
- 最优的评断的标准是计算出的数学模型可以满足更多的被观测数据;
- 被观测数据集包含了内群点和离群点,离群点产生的原因是极端的噪声或错误解释有关数据的测量或不正确的假设等。
解决步骤
- 从数据集中随机选取三个点确定初始的平面参数;
- 计算点集中其他点到该平面的距离,若小于一定阈值d,则计入内群点;
- 若内群点数量大于阈值M,则该平面参数有效;反之,重新选取三点确定新的平面参数,重复步骤,直到模型参数满足内群点数量大于M或达到迭代次数;
三维点云平面拟合流程图
伪代码
输入:
data ------ 被观测数据集
model ------ 初始数学模型
n ------ 适用于模型的最少内群数据个数
k ------ 迭代次数
d ------ 用于决定数据是否适应于模型的阀值
M ------ 用于决定模型是否有效的内群数据数目阈值
输出:
best_model ------ 数据残差最小的最优模型(如果没有找到好的模型,返回null)
best_consensus_set ------ 估计出模型的数据点
best_error ------ 跟数据相关的估计出的模型错误(例如数据残差和)
iterations = 0
best_model = null
best_consensus_set = null
best_error = 无穷大
while ( iterations < k )
{
maybe_inliers = 从数据集中随机选择n个点
maybe_model = 适合于maybe_inliers的模型参数
consensus_set = maybe_inliers
for ( 每个数据集中不属于maybe_inliers的点 )
{
if ( 如果点适合于maybe_model,且错误小于d )
将点添加到consensus_set
if ( consensus_set中的元素数目大于d )
{
已经找到了好的模型,现在测试该模型到底有多好
better_model = 适合于consensus_set中所有点的模型参数
this_error = better_model究竟如何适合这些点的度量
if ( this_error < best_error )
{
我们发现了比以前好的模型,保存该模型直到更好的模型出现
best_model = better_model
best_consensus_set = consensus_set
best_error = this_error
}
}
}
增加迭代次数
}
返回 best_model, best_consensus_set, best_error