PCL --- 滤波

博主 “没事就要敲代码”总结的更详细,全面。后面的就不自己总结了

1.1 直通滤波 pcl::PassThrough

输入数据类型 PointXYZPointCloud2
代码示例

#include <pcl/filters/passthrough.h>

  pcl::PassThrough<pcl::PointXYZ> pass; // 设置滤波器对象
  pass.setInputCloud (cloud);           // 设置输入点云
  pass.setFilterFieldName ("z");        // 设置过滤时所需要点云类型的字段
  pass.setFilterLimits (0.0, 1.0);      // 设置过滤字段的范围
  pass.setFilterLimitsNegative (false); // 设置保留范围内的还是过滤掉范围内的:默认false,即保留范围内的;若设为true,则保留范围外的;
  //pass.setNegative (true);            // 作用与 setFilterLimitsNegative 一样
  pass.filter (*cloudFiltered);         // 执行过滤,过滤结果保存在 cloudFiltered

1.2 体素格滤波器 pcl::VoxelGrid

VoxelGrid滤波原理 : 使用体素化网格的方法实现下采样,并保持点云的形状特征;voxelGrid类通过在点云数据中创建三维体素栅格,然后用每个体素的重心来近似表达体素中的其它点,采样点对应曲面的表示更为准确
输入数据类型 PointXYZPointCloud2
代码示例

#include <pcl/filters/voxel_grid.h>

  pcl::VoxelGrid<pcl::PCLPointXYZ> sor;      // 设置滤波器对象
  sor.setInputCloud (cloud);                 // 设置输入点云
  sor.setLeafSize (2.0f, 2.0f, 2.0f);        // 设置三维体素网格
  sor.filter (*cloudFiltered);               // 执行过滤,过滤结果保存在 cloudFiltered

1.3 统计滤波器 pcl::StatisticalOutlierRemoval

StatisticalOutlierRemoval滤波原理 : 对每个点的邻域进行统计分析,并修剪掉那些不符合一定标准的点。稀疏离群点移除方法基于在输入数据中对点到邻近点的距离分布的计算。对每个点,我们计算其到所有邻近点的平均距离。假设得到的结果是一个高斯分布,其形状由均值和标准差决定,平均距离在标准范围(由全局距离平均值和方差定义)之外的点,可被定义为离群点并从数据集中去除掉。
输入数据类型 PointXYZPointCloud2
代码示例

#include <pcl/filters/statistical_outlier_removal.h>

  pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor; // 设置滤波器对象
  sor.setInputCloud(cloud);                     // 设置输入点云
  sor.setMeanK(50);                             // 每个点参考的邻域点个数
  sor.setStddevMulThresh(1.0);                  // 标准差倍数设为1,即所有距离查询点的平均距离大于1个标准差的点都将被标记为离群点并删除
  sor.setNegative (false);                      // 设置为正(默认值),保留群内点,过滤掉离群点
  sor.filter(*cloudFiltered);                  // 执行过滤,保留的结果保存在 cloudFiltered
  sor.setNegative (true);                       // 设置为负 ,再次执行过滤
  sor.filter (*cloudFiltered);                 // 再次执行过滤,保存的为过滤掉的离群点

1.4 半径滤波器 pcl::RadiusOutlierRemoval

RadiusOutlierRemoval滤波原理 : 在点云数据中,用户指定每个的点一定范围内周围至少要有足够多的近邻,否则视为离群点删除。
输入数据类型 PointXYZPointCloud2
代码示例

#include <pcl/filters/radius_outlier_removal.h>   

  pcl::RadiusOutlierRemoval<pcl::PointXYZ> sor; // 设置滤波器对象
  sor.setInputCloud(RawCloud);                  // 设置输入点云
  sor.setRadiusSearch(1.5);                     // 设置在1.5的半径内找临近点
  sor.setMinNeighborsInRadius(2);               // 设置邻近点个数小于2的点均删除
  sor.filter (*cloudFiltered);                  // 执行过滤,保存结果
  sor.setNegative (true);                       // 设置为负 ,再次执行过滤
  sor.filter (*cloudFiltered);                 // 再次执行过滤,保存的为过滤掉的离群点

1.5 条件滤波 pcl: :ConditionalRemoval

ConditionalRemoval滤波原理 : 实现过滤满足一定条件的点云数据,非常灵活,可由用户设置滤披条件;可以一次删除满足对输入的点云设定的一个或多个条件指标的所有数据点 。
输入数据类型 PointXYZPointCloud2
代码示例

#include <pcl/filters/conditional_removal.h>

  pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond(new pcl::ConditionAnd<pcl::PointXYZ>());            //创建条件定义对象
  //为条件定义对象添加比较算子: 使用大于0.0和小于0.8这两个条件用于建立滤波器。
  range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new 
		  pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::GT, 0.0)));
  //添加在z字段上大于等于0(GT)的比较算子  
  range_cond->addComparison(pcl::FieldComparison<pcl::PointXYZ>::ConstPtr(new 
  pcl::FieldComparison<pcl::PointXYZ>("z", pcl::ComparisonOps::LT, 0.8)));
  //添加在z字段上小于等于0.8(LT)的比较算子
  pcl::ConditionalRemoval<pcl::PointXYZ>  condrem(range_cond);  // 设置滤波器对象
  condrem.setInputCloud(cloud);                // 设置输入点云
  condrem.setKeepOrganized(true);              // 设置保持点云的结构:为true时被剔除的点为NAN
  condrem.filter (*cloudFiltered);             // 执行过滤,保存结果
  sor.setNegative (true);                      // 设置为负 ,再次执行过滤
  sor.filter (*cloudFiltered);                 // 再次执行过滤,保存的为过滤掉的离群点

1.6 双边滤波 pcl::BilateralFilter

ConditionalRemoval滤波原理 : 该类的实现利用的并非XYZ字段的数据进行, 而是利用强度数据进行双边滤波算法的实现,所以在使用该类时点云的类型必须有强度字段,否则无法进行双边滤波处理,双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的。但是计算时间较长,且两个参数需要多次试验调整。
输入数据类型
代码示例

#include <pcl/filters/bilateral.h>
#include <pcl/kdtree/kdtree_flann.h>


    // 创建KDtree
	pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointXYZ>);//用一个子类作为形参传入
	pcl::BilateralFilter<PointT> bf;     // 设置滤波器对象
	bf.setInputCloud(cloud);             // 设置输入点云
	bf.setSearchMethod(tree);            // 设置搜索模式为树状
	bf.setHalfSize(sigma_s);             // 设置滤波半径
	bf.setStdDev(sigma_r);               // 设置标准差
	bf.filter(cloudFiltered);            // 执行滤波,结果保存在cloudFiltered

快速双边滤波器 : 提出了一种新的双边滤波器的信号处理分析方法,对空间关系和强度进行下采样进行加速。与典型双边滤波器相比,运行相同时间该方法更加准确。
输入数据类型
代码示例

#include <pcl/filters/fast_bilateral.h>  //

    pcl::FastBilateralFilter<pcl::PointXYZ> fbf;
    fbf.setInputCloud (xyz);
    fbf.setSigmaS (sigma_s);
    fbf.setSigmaR (sigma_r);
    fbf.applyFilter(cloudFiltered);

1.7 投影滤波 pcl::Projectlnliers

使用一个模型和一组的内点的索引,将内点投影到模型形成新的一个独立点云。即将点投影到一个参数化模型上(平面或球等)。
输入数据类型 PointT
代码示例

#include <pcl/ModelCoefficients.h>             //模型系数头文件
#include <pcl/filters/project_inliers.h>       //投影滤波类头文件

	// 创建ProjectInliers对象,使用ModelCoefficients作为投影对象的模型参数
	pcl::ProjectInliers<pcl::PointXYZ> proj;     //创建投影滤波对象
	proj.setModelType(pcl::SACMODEL_PLANE);      //设置对象对应的投影模型
	proj.setInputCloud(cloud);                   //设置输入点云
	proj.setModelCoefficients(coefficients);       //设置模型对应的系数
	proj.setCopyAllData(false);                   // true 返回所有点;false 则仅返回投影内的点
	proj.filter(*cloud_projected);                 //投影结果存储

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值