基于PCL的点云平面分割

本文介绍了如何利用RANSAC算法进行点云平面分割,并在PCL库中实现这一过程。详细阐述了RANSAC算法的基本原理,包括迭代和模型参数估算,以及PCL中RANSAC的实现细节。通过源代码示例,展示了如何从点云数据中提取平面,并提供了源代码下载链接。
摘要由CSDN通过智能技术生成

1、RANSAC算法

提取点云中的平面常用的算法是RANSAC,即Random Sample Consensus随机采样一致算法,简单来说,它就是从一堆数据中挑选出子集最心仪的数据,比如挑选一条直线等。看网上博客,有一个解释挺有趣的说法。
通俗解释RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。
具体可以参考RANSAC
根据我的理解,RANSAC 算法主要就是:

  1. 迭代
  2. 从一组包含据外点的观测数据中估算出已知数学模型的参数。
    它的输入是一组观察的数据,输出是模型的参数。比如本次分割出平面,平面参数方程为ax+by+cz+d=0,故得出的是平面参数。

2、PCL中RANSAC算法

PCL中的RANSAC在模块pcl::segmentation中,具体代码如下所示。

	//创建提取平面的分割对象
	pcl::SACSegmentation <pcl::PointXYZ> seg;
	seg.setOptimizeCoefficients(true);    //设置模型系数需要优化
	seg.setModelType(pcl::SACMODEL_PLANE);     //设置为平面模型
	seg.setMethodType(pcl::SAC_RANSAC);       //设置采用RANSAC算法进行分割
	seg.setDistanceThreshold(0.01);           //设置距离阈值为0.01m
	seg.setMaxIterations (1000);

分割函数返回的是分割平面的索引和模型参数,需要通过ExtractIndices从点云中提取出子集。

	while(cloud_filtered_removaled->points.size() > 0.3*nr_points)
	{
   
		
		seg.setInputCloud(cloud_filtered_removaled);
		seg.segment(*inliers,*coefficients);      //保存分割后点云的索引和模型参数
		
		pcl::ExtractIndices<pcl::PointXYZ> extract;
		extract.setInputCloud(cloud_filtered_removaled);
		extract.setIndices(inliers);
		extract.setNegative (false);
		extract
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值