点云操作中,平面的分割是经常遇到的问题,下面的例子就是如何利用PCL库提拟合出的参数,之后就可以过滤掉在平面附近的点云。
#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/ModelCoefficients.h> #include <pcl/filters/extract_indices.h> #include <pcl/sample_consensus/method_types.h> //随机参数估计方法头文件 #include <pcl/sample_consensus/model_types.h> //模型定义头文件 #include <pcl/segmentation/sac_segmentation.h> //基于采样一致性分割的类的头文件 //过滤之后的点云数据 //创建分割对象 -- 检测平面参数 /*pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); //存储输出的模型的系数 pcl::PointIndices::Ptr inliers(new pcl::PointIndices); //存储内点,使用的点 pcl::SACSegmentation<pcl::PointXYZ> seg; //可选设置 seg.setOptimizeCoefficients(true); //必须设置 seg.setModelType(pcl::SACMODEL_PLANE); //设置模型类型,检测平面 seg.setMethodType(pcl::SAC_RANSAC); //设置方法【聚类或随机样本一致性】 seg.setMaxIterations(1000); seg.setDistanceThreshold(0.01); seg.setInputCloud(cloud_ptr_gridfilter); seg.segment(*inliers, *coefficients); //分割操作 //显示模型的系数 std::cerr << "Model coefficients: " << coefficients->values[0] << " " << coefficients->values[1] << " " << coefficients->values[2] << " " << coefficients->values[3] << std::endl; // Extract the planar inliers from the input cloud pcl::ExtractIndices<pcl::PointXYZ> extract; extract.setInputCloud(cloud_ptr_gridfilter); extract.setIndices(inliers); //除去平面之外的数据 extract.setNegative(true); extract.filter(*cloud_filtered); //进一步可利用点和平面的相对位置关系,进行筛选过滤掉平面附近的点