【PCL学习】常用滤波器原理简介和使用

本文简单介绍PCL中常用的filter

  1. VoxelGrid
  2. PassThrough
  3. StatisticalOutlierRemoval
  4. RadiusOutlierRemoval

VoxelGrid

VoxelGrid,生硬翻译成中文是体素网格,顾名思义是将所有点云分隔成若干个网格,对处于同一网格中的所有点计算分别计算x、y、z的平均值,x、y、z平均值作为新的点,这样即可实现下采样。类比可以想象一个屋子,用3D Box将房间全部填满,那么下采样后最多有所放盒子数量的点数。通常用于下采样,降低点云密度。
PCL中的VoxelGrid

  1. 包含头文件
#include <pcl/filters/voxel_grid.h>
  1. 关键代码部分:(1)定义VoxelGrid实例;(2)设置点云;(3)设置leaf_size,即网格的长宽高;(4)执行过滤;
 	...
    pcl::PointCloud<PointT>::Ptr cloud_ptr(new pcl::PointCloud<PointT>(cloud_));
    pcl::PointCloud<PointT>::Ptr out_ptr(new pcl::PointCloud<PointT>());
    // voxel grid filter
    pcl::VoxelGrid<PointT> voxel_grid;
    voxel_grid.setInputCloud(cloud_ptr); // set input pointcloud
    voxel_grid.setLeafSize(lx, ly, lz); // set leaf size along x-axis, y-axis, z-axis
    voxel_grid.filter(*out_ptr); // implement

下图为体素滤波前后的对比,其中红点为之前,白点是之后
在这里插入图片描述

PassThrough

PassThrough滤波器,翻译成中文为直通滤波器,可以通过设置上下限(lower_limit,upper_limit)来实现某个维度(x,y,z)的过滤,比如对x轴进行直通滤波,将留下满足lower_limit < x < upper_limmit或之外的点。可以用来提取ROI区域。

  1. PCL头文件
#include <pcl/filters/passthrough.h>
  1. 关键代码:(1)定义PassThrough实例;(2)输入点云;(3)设置需要过滤的维度;(4)设置过滤的上下限;(5)执行滤波
// passthrough
    pcl::PassThrough<PointT> pass_throuth; //(1)
    pass_throuth.setInputCloud(cloud_ptr); //(2)
    pass_throuth.setFilterFieldName("x");  //(3)
    pass_throuth.setFilterLimits(-50, 50); //(4)
    pass_throuth.filter(*out_ptr);         //(5)
    std::cout << out_ptr->width << std::endl;

测试结果,对x轴进行滤波,留下[-50, 50]区间内的点,红点是滤波前的点云,白点为滤波后的点云
在这里插入图片描述

StatisticalOutlierRemoval

StatisticalOutlierRemoval滤波器,中文翻译为统计学滤波器,因为Lidar的工作原理容易形成很多离群点,StatisticalOutlierRemoval是用来将离群点过滤掉的一种滤波器,其工作原理是首先计算每个点到领域K个点的平均距离,接着计算K领域内所有点到领域点的平均距离的标准差,若当前点的领域平均距离”大于 mean(K个平均距离平均值) + stddev_mult(人为设定阈值) * stddev(K个平均距离标准差)“,则认为当前点是离群点,将它过滤。
PCL中的使用:

  1. 头文件
#include <pcl/filters/statistical_outlier_removal.h>
  1. 关键代码:(1)定义实例;(2)输入点云;(3)设置领域点数量K;(4)设置阈值系数;(5)执行过滤;
    pcl::StatisticalOutlierRemoval<PointT> statistical_filter;
    statistical_filter.setInputCloud(cloud_ptr); // set input of pointcloud
    statistical_filter.setMeanK(k); // set the number of neighbors
    statistical_filter.setStddevMulThresh(stddev_mult); // set stddev_mult,  mean + stddev_mult * stddev
    statistical_filter.filter(*out_ptr); // inmplement

测试结果:红点为滤波前的点,可以看出很多离群点被移除
在这里插入图片描述

RadiusOutlierRemoval

RadiusOutlierRemoval filter,翻译成中文是半径滤波器,作用是滤除离群点,进而提高点云质量,实现原理是扫描每个点附近”距离小于半径的点数”,若点数小于点数阈值,则将该点移除。
PCL中使用

  1. 头文件
#include <pcl/filters/radius_outlier_removal.h>
  1. 关键代码:(1)定义实例;(2)设置点云;(3)设置邻居点数阈值;(4)设置搜索半径;(5)执行滤波
	// radius outlier removal
    pcl::RadiusOutlierRemoval<PointT> radius_removal;
    radius_removal.setInputCloud(cloud_ptr);	//set input pointcloud
    radius_removal.setMinNeighborsInRadius(k);	// set k
    radius_removal.setRadiusSearch(r);			// set search radius
    radius_removal.filter(*out_ptr);			// inplement

测试结果:白点是滤波后的点,可以看到一些离散点被移除。
在这里插入图片描述

  • 28
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCL中,可以使用VoxelGrid滤波器对点云进行降采样操作。VoxelGrid滤波器将点云划分为一个个体素(Voxel),并将每个体素内的点云数据压缩为一个单独的代表点。 以下是在PCL中使用VoxelGrid滤波器进行点云降采样的示例代码: ```cpp #include <pcl/point_cloud.h> #include <pcl/filters/voxel_grid.h> pcl::PointCloud<pcl::PointXYZ>::Ptr downsamplePointCloud(const pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, float leaf_size) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_downsampled(new pcl::PointCloud<pcl::PointXYZ>); pcl::VoxelGrid<pcl::PointXYZ> voxelgrid; voxelgrid.setInputCloud(cloud); voxelgrid.setLeafSize(leaf_size, leaf_size, leaf_size); voxelgrid.filter(*cloud_downsampled); return cloud_downsampled; } ``` 在上述示例中,我们首先创建了输入点云 `cloud` 和输出点云 `cloud_downsampled`。然后,我们创建了一个 `pcl::VoxelGrid` 对象 `voxelgrid`,并设置了输入点云。 使用 `setLeafSize` 方法,我们设置了体素的大小,即 `leaf_size`。体素的大小决定了降采样后的点云密度,较小的体素大小会产生更多的点云数据,较大的体素大小则会减少点云数据。 最后,通过调用 `filter` 方法,我们对点云进行了降采样操作,并将结果保存到 `cloud_downsampled` 中,并返回该点云。 你可以根据需要调整体素的大小,以获得所需的降采样效果。这样,你就可以使用VoxelGrid滤波器对点云进行降采样了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值