首页 > 其他分享 >PCL滤波大全、原理+代码实例+操作步骤

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

时间:2023-11-15 11:12:54浏览次数:41  
标签:PCL pcl 滤波 filter 设置 点云 操作步骤 cloud

#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

相关文章

  • PCL点云读取与保存
     PCL点云读取与保存:1#include<iostream>2#include<string>34#include<pcl/io/io.h>5#include<pcl/io/pcd_io.h>6#include<pcl/point_types.h>7#include<pcl/visualization/pcl_visualizer.h>89usingnamespa......
  • 海康设备接入安防监控EasyCVR平台实现语音对讲的必要操作步骤
    安防监控系统EasyCVR平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中,在语音对讲方面,EasyCVR平台目前可兼容海康设备的对讲。今天我们来介绍下接入、配置与使用。1)首先......
  • 海康设备接入安防监控系统EasyCVR平台实现语音对讲的必要操作步骤
    安防监控系统EasyCVR平台可拓展性强、视频能力灵活,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、智能分析接入等功能。其中,在语音对讲方面,EasyCVR平台目前可兼容海康设备的对讲。今天我们来介绍下接入、配置与使用。1)......
  • 基于FPGA的图像中值滤波开发,包括tb测试文件以及matlab验证代码
    算法运行效果图预览   通过MATLAB调用FPGA的仿真结果,显示滤波效果:   2.算法运行软件版本vivado2019.2 matlab2022a 3.算法理论概述         基于FPGA的图像中值滤波是一种在图像处理中常用的滤波技术,其原理是通过一定的算法将图像中的噪声平......
  • 数字滤波器分析---零极点分析
    数字滤波器分析---零极点分析zplane 函数绘制线性系统的极点和零点。例如,在-1/2处为零且在 0.9e−j2π0.3 和 0.9ej2π0.3 处有一对复极点的简单滤波器为zer=-0.5;pol=0.9*exp(j*2*pi*[-0.30.3]');要查看该滤波器的零极点图,您可以使用 zplane。当系统是零极点形式时......
  • 数字滤波器分析---相位响应
    数字滤波器分析---相位响应MATLAB®函数可用于提取滤波器的相位响应。在给定频率响应的情况下,函数 abs 返回幅值,angle 返回以弧度为单位的相位角。要使用 fvtool 查看巴特沃斯滤波器的幅值和相位,请使用:d=designfilt('lowpassiir','FilterOrder',9,...'HalfPowerFrequ......
  • 数字滤波器分析---频率响应
    数字滤波器分析---频率响应幅值、相位、冲激和阶跃响应、相位和群延迟、零极点分析。分析滤波器的频域和时域响应。可视化复平面中的滤波器极点和零点。频率响应数字域freqz 使用基于FFT的算法来计算数字滤波器的Z变换频率响应。具体来说,语句[h,w]=freqz(b,a,p)返回数字滤波......
  • 滤波器实现
    滤波器实现卷积和滤波    滤波的数学基础是卷积。对于有限冲激响应(FIR)滤波器,滤波运算的输出 y(k) 是输入信号 x(k) 与冲激响应 h(k) 的卷积:y(k)=∞∑l=−∞h(l) x(k−l).    如果输入信号也是有限长度的,您可以使用MATLAB® conv 函数来执行滤波运算。......
  • 补偿 FIR 滤波器引入的延迟
    补偿FIR滤波器引入的延迟对信号进行滤波会引入延迟。这意味着相对于输入,输出信号在时间上有所偏移。此示例向您说明如何抵消这种影响。有限冲激响应滤波器经常将所有频率分量延迟相同的时间量。这样,我们就很容易通过对信号进行时移处理来针对延迟进行校正。以500Hz的频率对心......
  • 补偿 IIR 滤波器引入的延迟
    补偿IIR滤波器引入的延迟对信号进行滤波会引入延迟。这意味着相对于输入,输出信号在时间上有所偏移。无限冲激响应滤波器对某些频率分量的延迟可能比其他频率分量更长。它们会使输入信号呈现明显失真。函数 filtfilt 可补偿此类滤波器引入的延迟,从而校正滤波器失真。这种“零相......