一、点云滤波介绍

当激光或结构光设备采集的时候会因为被采集物体的表面材料,环境带来许多的噪声点(也叫做离群点),也会因为点云数据冗余,需要进行降采样,便于后续处理数据量的减少。

本文借助PCL开源库,实现基础的点云滤波算法。

二、具体实现

2.1直通滤波

直通滤波是在给定的通道上(x、y、z等)进行给定区域的滤波,在自动驾驶中一般用来进行地面的滤除。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<pcl/filters/passthrough.h>//头文件

cout<<"----------直通滤波开始-------------"<<endl;
cout<<*cloud<<endl;
pcl::PointXYZ minPt, maxPt;
pcl::getMinMax3D(*cloud,minPt,maxPt);//获得输入点云的最大最小边界
//关键配置代码
pcl::PassThrough<pcl::PointXYZ>PassZ;
PassZ.setInputCloud(cloud);//传入点云
PassZ.setFilterFieldName("z");//设置滤波字段名,x方向
PassZ.setFilterLimits(minPt.z,0);//设置在过滤方向上的点云
PassZ.setNegative(true);//设置false为保留范围内的点,true为剔除范围内点
PassZ.filter(*cloud);//保存点
cout<<"----------直通滤波完成-------------"<<endl;
cout<<*cloud<<endl;

2.2统计滤波

统计滤波是针对每一个点进行其领域的统计分析,得到该点到其领域点距离的分布特征,过滤掉不满足阈值的离群点,保留内点。

1
2
3
4
5
6
7
8
9
10
11
12
#include<pcl/filters/statistical_outlier_removal.h>//头文件

cout<<"----------离群点滤波开始-------------"<<endl;
cout<<*cloud<<endl;
pcl::StatisticalOutlierRemoval<pcl::PointXYZ>sor;//创建过滤器
sor.setInputCloud(cloud);//传入要滤波的点云
sor.setMeanK(50);//每个点考虑最近邻个数为50
sor.setStddevMulThresh(1.0);//设置标准差阈值为1
//这意味着所有距离查询点的平均距离的标准偏差均大于1个标准偏差的所有点都将被标记为离群值并删除。
sor.filter(*cloud);
cout<<*cloud<<endl;
cout<<"----------离群点滤波完成-------------"<<endl;

处理图像

image-20230805160619017