点云滤波,顾名思义,就是滤掉噪声。原始采集的点云数据往往包含大量散列点、孤立点,在获取点云数据时,往往由于传感器本身精度的限制,获取的点云数据就不是很精确,往往有一些噪音点。不只是点云数据存在噪音点,传统相机也会存在噪音点。
在处理点云过程中,预处理是处理的第一步,如果第一步处理不好对后期的处理影响是很大的。只有在预处理时将点云数据处理好,减少离群点,数据压缩等,才能进行更好配准,特征提取,曲面重建,可视化等后续处理。
在开源的pcl库中点云的滤波主要有一下几种方式:
- 直通滤波器 pcl::PassThrough pass
- 体素格滤波器 pcl::VoxelGrid sor;
- 统计滤波器 pcl::StatisticalOutlierRemoval sor;
- 半径滤波器 pcl::RadiusOutlierRemoval outrem;
- 双边滤波 pcl::BilateralFilter bf;该类的实现利用的并非XYZ字段的数据进行, 而是利用强度数据进行双边滤波算法的实现,所以在使用该类时点云的类型必须有强度字段,否则无法进行双边滤波处理,双边滤波算法是通过取临近采样点和加权平均来修正当前采样点的位置,从而达到滤波效果,同时也会有选择剔除与当前采样点“差异”太大的相邻采样点,从而保持原特征的目的
- 高斯滤波 pcl::filters::GaussianKernel< PointInT, PointOutT > 是基于高斯核的卷积滤波实现 高斯滤波相当于一个具有平滑性能的低通滤波器
- 立方体滤波 pcl::CropBox< PointT> 过滤掉在用户给定立方体内的点云数据
- 封闭曲面滤波 pcl::CropHull< PointT> 过滤在给定三维封闭曲面或二维封闭多边形内部或外部的点云数据
- 空间剪裁: pcl::Clipper3D pcl::BoxClipper3D pcl::CropBox pcl::CropHull 剪裁并形成封闭曲面
- 卷积滤波:实现将两个函数通过数学运算产生第三个函数,可以设定不同的卷积核
pcl::filters::Convolution
pcl::filters::ConvolvingKernel - 随机采样一致滤波等,
通常组合使用完成任务。
a. 直通滤波器 pcl::PassThrough 直接指定保留哪个轴上的范围内的点
include <pcl/filters/passthrough.h>
如果使用线结构光扫描的方式采集点云,必然物体沿z向分布较广, 但x,y向的分布处于有限范围内。 此时可使用直通滤波器,确定点云在x或y方向上的范围, 可较快剪除离群点,达到第一步粗处理的目的。
// 创建点云对象 指针
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);
// 原点云获取后进行滤波
pcl::PassThrough<pcl::PointXYZ> pass;// 创建滤波器对象
pass.setInputCloud (cloud);//设置输入点云
pass.setFilterFieldName ("z");//滤波字段名被设置为Z轴方向
pass.setFilterLimits (0.0, 1.0);//可接受的范围为(0.0,1.0)
//pass.setFilterLimitsNegative (true);//设置保留范围内 还是 过滤掉范围内
pass.filter (*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered
[直通滤波器 PassThrough](Basic/Filtering/PassThroughfilter.cpp)
b.体素格滤波器VoxelGrid 下采样 在网格内减少点数量保证重心位置不变 pcl::VoxelGrid
// 创建点云对象 指针
pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
// 源点云读取 获取 后
pcl::VoxelGrid<pcl::PCLPointCloud2> sor; //创建滤波对象
sor.setInputCloud (cloud); //设置需要过滤的点云(指针) 给滤波对象
sor.setLeafSize (0.01f, 0.01f, 0.01f); //设置滤波时创建的体素体积为1cm的立方体
sor.filter (*cloud_filtered); //执行滤波处理,存储输出
// Approximate 体素格滤波器VoxelGrid
pcl::ApproximateVoxelGrid<pcl::PointXYZ> approximate_voxel_filter;
approximate_voxel_filter.setLeafSize (0.2, 0.2, 0.2);
approximate_voxel_filter.setInputCloud (input_cloud);// 第二次扫描点云数据作为源点云
approximate_voxel_filter.filter (*filtered_cloud);
分类: PCL