PCL滤波大全、原理+代码实例+操作步骤

发布时间 2023-11-15 11:05:24作者: 量子与太极

#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);