RANSAC思想解决平面拟合问题

一家之言,仅作分享,如有不合理或需要改进的地方,欢迎各位讨论。
RANSAC(RANdom SAmple Consensus随机抽样一致),采用迭代的方式从一组包含离群的被观测数据估算出数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。
从上述对RANSAC思想的解释,可以提取出以下几个关键点:

  1. 要求解的是一个数学模型的参数;
  2. 求解方式是迭代取最优;
  3. 最优的评断的标准是计算出的数学模型可以满足更多的被观测数据;
  4. 被观测数据集包含了内群点和离群点,离群点产生的原因是极端的噪声或错误解释有关数据的测量或不正确的假设等。

解决步骤

  1. 从数据集中随机选取三个点确定初始的平面参数;
  2. 计算点集中其他点到该平面的距离,若小于一定阈值d,则计入内群点;
  3. 若内群点数量大于阈值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
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值