PCL学习:点云分割-平面模型分割

pcl::SACSegmentation< PointT >

类 SACSegmentation

PCL学习:点云分割-平面模型分割_第1张图片

关键成员函数 :

  SACSegmentation ()
  空的构造函数
 
  ~SACSegmentation ()
  空的析构函数
 
void  setModelType (int model)
 

设置随机采样一致性所构造的几何模型的类型〈用户给定的参数) , model 为指定的模型类型参数,本章节中涉及的模型类型如下:

SACMODEL_PLANE:定义平面模型,共设置四个参数[normal_x normal_y  normal_z d],其中(normal_x normal_y  normal_x)为 Hessian范式中法向量的坐标及常量值d,ax+by+cz+d=0,熊点云中粉葛提取的内点都处在估计参数对应的平面上或者与平面距离在一定范围内。

SACMODEL_LINE:定义为直线模型 ,共设置 6 个参数 [ point_ on_line. x point_on_line. y point_on_line. z line_direction. x line_direction. y line_direction. z], 其中( point_on_line. x, point_on_line. y, poin t_on_line . 。为直线上一点的三维坐标,
Oine_direction. x, line_direction. y, line_direction. z)为直线方向向量的三维坐标,从点云中分割提取的内点都处在估计参数对应直线 上 或与直线的距离在一定范围内 。

SACMODEL_CIRCLE2D:定义为二维圆的圆周模型,共设置 3 个参数[ center. x center. y radius] ,其中( center. x, center. y)为圆周中心点的二维坐标, radius 为圆周半径,从点云中分割提取的内点都处在估计参数对应的圆周上或距离圆
周边线的距离在一定范围内 。

SACMODEL_CIRCLE3D:

SACMODEL_SPHERE:定义为三维球体模型,共设置 4 个参数[center. x center. y c·enter. z radius] ,其中( center. x, center. y, center. z)为球体中心的三维坐标, radius 为球体半径,从点云中分割提取的内点都处在估计参数对应的球体上或距离球体边线的距离在一定范围内 。

SACMODEL_CYLINDER:定义为圆柱体模型 , 共设置 7 个参数[ point_on_axis. x point_on_axis. y point_on_axis. z axis_direction. x axis_direction. y axis_direction. z radius] ,其中,( point_on_axis. x, point_on_axis. y, point_on_axis. 。为轴线上点的三维坐标,( direction. x ,axis_d让ection. y, axis_direction. 。为轴线方向向量的三维坐标, radius 为圆柱体半径,从点云中分割提取的内点都处在估计参数对应的圆柱体上或距离圆柱体表面的距离在一定范围内 。

SACMODEL_CONE:定义为圆锥模型,尚未实现。

SACMODEL_TORUS:定义为圆环面模型,尚未实现。

SACMODEL_PARALLEL_LINE:定义为有条件限制的直线模型,在规定的最大角度偏差限制下,直线模型与给定轴线平行,其参数设置参见 SACMODEL_LINE 模型。

SACMODEL_PERPENDICULAR_PLANE:定义为有条件限制的平面模型,在规定的最大角度偏差限制下,平面模型与给定轴线垂直,参数设置参见 SACMODEL_PLANE 模型 。

SACMODEL_PARALLEL_LINES:

SACMODEL_NORMAL_PLANE:定义为有条件限制的平面模型,在规定的最大角度偏差限制下,每一个局内点的法线必须与估计的平面模型的法线平行,参数设置参见 SACMODEL_PLANE 模型 。

SACMODEL_NORMAL_SPHERE:

SACMODEL_REGISTRATION:

SACMODEL_REGISTRATION_2D:

SACMODEL_PARALLEL_PLANE:定义为有条件限制的平面模型,在规定的最大角度偏差限制下,平面模型与给定的轴线平行,参数设置参见 SACMODEL_PLANE 模型。

SACMODEL_NORMAL_PARALLEL_PLANE:定义为有条件限制的平面模型,在法线约束下, 三维平面模型必须与用户设定的轴线平行,参数设置参见SACMODEL_PLANE 模型。

SACMODEL_STICK:

 
void  setMethodType (int method)
  设置使用采样一致性方法的类型(用户给定参数〉,采样一致性方法的类型有SAC_RANSAC 、 SAC_ LMEDS 、 SAC_MSAC 、 SAC_RRANSAC 、 SAC_RRANSAC 、SAC_MLESAC 、 SAC_PROSAC,具体算法描述详见随机采样一致性这章 。
 
void  setDistanceThreshold (double threshold)
  该函数配合用户指定的模型,设置点到模型的距离阔值 threshold (用户给定参数) ,如果点到模型的距离不超过这个距离阑值,认为该点为局内点,否则认为是局外点,被剔除。
 
void  setMaxIterations (int max_iterations)
  设置迭代次数的上限 max_iterations.
 
void  setProbability (double probability)
  设置每次从数据集中选取至少一个局内点的概率 probability 。
 
void  setOptimizeCoefficients (bool optimize)
  设置是否对估计的模型参数进行优化, optimize 为 true 时进行优化,否则不进行优化。
 
void  setRadiusLimits (const double &min_radius, const double &max_radius)
  该函数配合,当用户设定带有半径参数的模型类型时,设置模型半径参数的最大最小半径阑值 max_radius 、min_radius.
 
void  setSamplesMaxDist (const double &radius, SearchPtr search)
  设置随机采样时搜索所用的最大半径 Radius.
 
void  setAxis (const Eigen::Vector3f &ax)
  该函数配合,当用户设定与轴线平行或垂直有关的模型类型时,设置垂直或平行于所要建立模型的轴线 。
 
void  setEpsAngle (double ea)
  该函数配合,当用户设定有平行或垂直限定有关的模型类型时,设置判断是否平行或垂直时的角度阑值, ea 是最大角度差,采用弧度制。
 
virtual void  segment (PointIndices &inliers, ModelCoefficients &model_coefficients)
  对通过 setlnputCloud ( ) 和 setlndices ( )共同指定的输人点云进行聚类分割,参数 inliers 是基于模型分割所得到的点集合索引, model_coefficients 是估计得到的模型系数。
 

测试示例:

用一组点云数据做简单的平面的分割。

 


#include 
#include 
#include 
#include 
#include    //随机参数估计方法头文件
#include    //模型定义头文件
#include    //基于采样一致性分割的类的头文件

int
main(int argc, char** argv)
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud);

	// 填充点云
	cloud->width = 15;
	cloud->height = 1;
	cloud->points.resize(cloud->width * cloud->height);

	// 生成数据,采用随机数填充点云的x,y坐标,都处于z为1的平面上
	for (size_t i = 0; i < cloud->points.size(); ++i)
	{
		cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
		cloud->points[i].z = 1.0;
	}

	// 设置几个局外点,即重新设置几个点的z值,使其偏离z为1的平面
	cloud->points[0].z = 2.0;
	cloud->points[3].z = -2.0;
	cloud->points[6].z = 4.0;

	std::cerr << "Point cloud data: " << cloud->points.size() << " points" << std::endl;  //打印
	for (size_t i = 0; i < cloud->points.size(); ++i)
		std::cerr << "    " << cloud->points[i].x << " "
		<< cloud->points[i].y << " "
		<< cloud->points[i].z << std::endl;
	//创建分割时所需要的模型系数对象,coefficients及存储内点的点索引集合对象inliers
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
	// 创建分割对象
	pcl::SACSegmentation seg;
	// 可选择配置,设置模型系数需要优化
	seg.setOptimizeCoefficients(true);
	// 必要的配置,设置分割的模型类型,所用的随机参数估计方法,距离阀值,输入点云
	seg.setModelType(pcl::SACMODEL_PLANE);   //设置模型类型
	seg.setMethodType(pcl::SAC_RANSAC);      //设置随机采样一致性方法类型
	seg.setDistanceThreshold(0.01);          //设定距离阀值,距离阀值决定了点被认为是局内点是必须满足的条件,表示点到估计模型的距离最大值,

	seg.setInputCloud(cloud);
	//引发分割实现,存储分割结果到点几何inliers及存储平面模型的系数coefficients
	seg.segment(*inliers, *coefficients);

	if (inliers->indices.size() == 0)
	{
		PCL_ERROR("Could not estimate a planar model for the given dataset.");
		return (-1);
	}

	//打印出平面模型
	std::cerr << "Model coefficients: " << coefficients->values[0] << " "
		<< coefficients->values[1] << " "
		<< coefficients->values[2] << " "
		<< coefficients->values[3] << std::endl;

	std::cerr << "Model inliers: " << inliers->indices.size() << std::endl;
	for (size_t i = 0; i < inliers->indices.size(); ++i)
		std::cerr << inliers->indices[i] << "    " << cloud->points[inliers->indices[i]].x << " "
		<< cloud->points[inliers->indices[i]].y << " "
		<< cloud->points[inliers->indices[i]].z << std::endl;

	return (0);
}

执行命令:.\planar_segmentation

打印信息:

开始打印的数据为手动添加的点云数据,并非都处于z为1的平面上,通过分割对象的处理后提取所有内点,即过滤掉z不等于1的点集;

Point cloud data: 15 points
    1.28125 577.094 2
    197.938 828.125 1
    599.031 491.375 1
    358.688 917.438 -2
    842.563 764.5 1
    178.281 879.531 1
    727.531 525.844 4
    311.281 15.3438 1
    93.5938 373.188 1
    150.844 169.875 1
    1012.22 456.375 1
    121.938 4.78125 1
    9.125 386.938 1
    544.406 584.875 1
    616.188 621.719 1
Model coefficients: 0 0 1 -1
Model inliers: 12
1    197.938 828.125 1
2    599.031 491.375 1
4    842.563 764.5 1
5    178.281 879.531 1
7    311.281 15.3438 1
8    93.5938 373.188 1
9    150.844 169.875 1
10    1012.22 456.375 1
11    121.938 4.78125 1
12    9.125 386.938 1
13    544.406 584.875 1
14    616.188 621.719 1

 

你可能感兴趣的:(PCL,点云库PCL从入门到精通)