#include<pcl/filters/passthrough.h>
滤波代码实例:
1 // Create the filtering object 2 pcl::PassThrough<pcl::PointXYZ> pass; // 声明直通滤波 3 pass.setInputCloud(cloud); // 传入点云数据 4 pass.setFilterFieldName("z"); // 设置操作的坐标轴 5 pass.setFilterLimits(0.0, 3.0); // 设置坐标范围 6 pass.setFilterLimitsNegative(true); // 保留数据函数 7 pass.filter(*cloud_filtered); // 进行滤波输出
1、创建待处理点云对象,以及存储点云处理完成后的点云对象。 2、设置点云的容量:宽+高+长×宽; 3、设置点云内所有点的xyz坐标; 4、创建PassThroughFilter对象,并设置其滤波参数。 5、将待处理点云对象作为filter的输入进行滤波; 6、得到结果:在filter对象设置的x,y,z的范围之内的点将被保留,范围之外的点将被舍弃,实现直通滤波的功能
#include <pcl/filters/voxel_grid.h>
滤波代码示例:
1 cout << "->正在体素下采样..." << endl; 2 pcl::VoxelGrid<pcl::PointXYZ> vg; //创建滤波器对象 3 vg.setInputCloud(cloud); //设置待滤波点云 4 vg.setLeafSize(0.05f, 0.05f, 0.05f); //设置体素大小 5 vg.filter(*cloud_filtered); //执行滤波,保存滤波结果于cloud_filtered
使用步骤:
读入点云→创建滤波器对象→设置体素大小→执行滤波→保存滤波点云
#include <pcl/keypoints/uniform_sampling.h>
滤波代码实例:
cout << "->正在均匀采样..." << endl; pcl::UniformSampling<pcl::PointXYZ> us; //创建滤波器对象 us.setInputCloud(cloud); //设置待滤波点云 us.setRadiusSearch(0.05f); //设置滤波球体半径 us.filter(*cloud_filtered); //执行滤波,保存滤波结果于cloud_filtered
#include <pcl/filters/statistical_outlier_removal.h>
滤波代码实例:
cout << "->正在进行统计滤波..." << endl; pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; //创建滤波器对象 sor.setInputCloud(cloud); //设置待滤波点云 sor.setMeanK(50); //设置查询点近邻点的个数 sor.setStddevMulThresh(1.0); //设置标准差乘数,来计算是否为离群点的阈值 //sor.setNegative(true); //默认false,保存内点;true,保存滤掉的离群点 sor.filter(*cloud_filtered); //执行滤波,保存滤波结果于cloud_filtered
#include <pcl/filters/radius_outlier_removal.h>
滤波代码示例:
cout << "->正在进行半径滤波..." << endl; pcl::RadiusOutlierRemoval<pcl::PointXYZ> ror; //创建滤波器对象 ror.setInputCloud(cloud); //设置待滤波点云 ror.setRadiusSearch(0.02); //设置查询点的半径范围 ror.setMinNeighborsInRadius(5); //设置判断是否为离群点的阈值,即半径内至少包括的点数 //ror.setNegative(true); //默认false,保存内点;true,保存滤掉的外点 ror.filter(*cloud_filtered); //执行滤波,保存滤波结果于cloud_filtered
使用步骤:
读入点云→创建半径滤波器对象→设置离群点阈值→执行下采样→保存采样结果
#include <pcl/filters/conditional_removal.h>
滤波代码为:
cout << "->正在进行条件滤波..." << endl; /*创建条件限定下的滤波器*/ pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());//创建条件定义对象range_cond //为条件定义对象添加比较算子 range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::GT, -0.1)));//添加在x字段上大于 -0.1 的比较算子 range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new pcl::FieldComparison<pcl::PointXYZ>("x", pcl::ComparisonOps::LT, 1.0)));//添加在x字段上小于 1.0 的比较算子 pcl::ConditionalRemoval<pcl::PointXYZ> cr; //创建滤波器对象 cr.setCondition(range_cond); //用条件定义对象初始化 cr.setInputCloud(cloud); //设置待滤波点云 //cr.setKeepOrganized(true); //设置保持点云的结构 //cr.setUserFilterValue(5); //将过滤掉的点用(5,5,5)代替 cr.filter(*cloud_filtered); //执行滤波,保存滤波结果于cloud_filtered
#include <pcl/filters/extract_indices.h>
滤波代码实例:
cout << "->正在进行点云平面子集提取..." << endl; pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); //创建分割时所需要的模型系数对象coefficients pcl::PointIndices::Ptr inliers(new pcl::PointIndices()); //创建存储内点的点索引集合对象inliers 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);//设置输入点云,待分割 seg.segment(*inliers, *coefficients);//引发分割实现:存储分割结果到点集合inliers;存储平面模型系数coefficients pcl::ExtractIndices<pcl::PointXYZ> extract; //创建点云提取对象 extract.setInputCloud(cloud); //设置输入点云 extract.setIndices(inliers); //设置分割后的内点inliers为需要提取的点集 extract.setNegative(false); //设置提取内点而非外点,默认false extract.filter(*cloud_filtered); //提取点集并存储到 cloud_filtered
使用步骤:
读入点云→平面分割获取索引集合→创建点云索引提取对象→执行索引提取→保存提取点云
#include <pcl/filters/project_inliers.h>
滤波代码实例:
cout << "->正在平面模型投影..." << endl; //创建 Ax+By+Cz=0 平面 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients()); coefficients->values.resize(4); //设置模型系数的大小 coefficients->values[0] = 1.0; //x系数 coefficients->values[1] = 1.0; //y系数 coefficients->values[2] = 1.0; //z系数 coefficients->values[3] = 0.0; //常数项 //投影滤波 pcl::ProjectInliers<pcl::PointXYZ> proj;//创建投影滤波器对象 proj.setModelType(pcl::SACMODEL_PLANE); //设置对象对应的投影模型 proj.setInputCloud(cloud); //设置输入点云 proj.setModelCoefficients(coefficients);//设置模型对应的系数 proj.filter(*cloud_projected); //执行投影滤波,存储结果于cloud_projected
#include <pcl/filters/model_outlier_removal.h>
滤波代码实例:
cout << "->正在模型滤波..." << endl; //设置模型系数 pcl::ModelCoefficients model_coeff; model_coeff.values.resize(4); model_coeff.values[0] = 1.0; model_coeff.values[1] = 1.0; model_coeff.values[2] = 1.0; model_coeff.values[3] = 0.0; ///模型滤波 pcl::ModelOutlierRemoval<pcl::PointXYZ> filter; //创建模型滤波器对象 filter.setModelCoefficients(model_coeff); //为模型对象添加模型系数 filter.setThreshold(0.1); //设置判断是否为模型内点的阈值 filter.setModelType(pcl::SACMODEL_PLANE); //设置模型类别 filter.setInputCloud(cloud); //输入待滤波点云 filter.setNegative(false); //默认false,提取模型内点;true,提取模型外点 filter.filter(*cloud_filtered); //执行模型滤波,保存滤波结果于cloud_filtered
使用步骤:
读入点云→设置模型系数→创建模型滤波器对象→执行模型滤波→保存滤波结果
#include <pcl/filters/bilateral.h>
滤波代码实例:
pcl::search::KdTree<pcl::PointXYZI>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZI>); pcl::BilateralFilter<pcl::PointXYZI> bf; bf.setInputCloud(cloud); bf.setSearchMethod(tree); bf.setHalfSize(0.1); // 设置高斯双边滤波窗口的一半大小,即搜索半径。 bf.setStdDev(0.03); // 设置标准差参数 bf.filter(*outcloud);
标签:PCL,pcl,滤波,filter,设置,点云,操作步骤,cloud From: https://www.cnblogs.com/Jack-Elvis/p/17833316.html