本文简单介绍PCL中常用的filter
- VoxelGrid
- PassThrough
- StatisticalOutlierRemoval
- RadiusOutlierRemoval
VoxelGrid
VoxelGrid,生硬翻译成中文是体素网格,顾名思义是将所有点云分隔成若干个网格,对处于同一网格中的所有点计算分别计算x、y、z的平均值,x、y、z平均值作为新的点,这样即可实现下采样。类比可以想象一个屋子,用3D Box将房间全部填满,那么下采样后最多有所放盒子数量的点数。通常用于下采样,降低点云密度。
PCL中的VoxelGrid
- 包含头文件
#include <pcl/filters/voxel_grid.h>
- 关键代码部分:(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区域。
- PCL头文件
#include <pcl/filters/passthrough.h>
- 关键代码:(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中的使用:
- 头文件
#include <pcl/filters/statistical_outlier_removal.h>
- 关键代码:(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中使用
- 头文件
#include <pcl/filters/radius_outlier_removal.h>
- 关键代码:(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
测试结果:白点是滤波后的点,可以看到一些离散点被移除。