简述
点云滤波方法及效果
内容
滤波原因
点云滤波作为常见的点云处理算法,一般是点云处理的第一步,对后续处理有很重要作用。滤波有很多方面也有很多种功能,比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等
一般下面这几种情况需要进行点云滤波处理:
(1)点云数据密度不规则需要平滑
(2)因为遮挡等问题造成离群点需要去除
(3)大量数据需要下采样
(4)噪声数据需要去除
滤波方法
PCL滤波算法的实现是通过滤波器类来完成的,需要实现滤波功能时则新建一个滤波器对象并设置参数,从而保证可以针对不同的滤波任务,使用不同参数的滤波器对点云进行处理
直通滤波器
// Create the filtering object
pcl::PassThrough<pcl::PointXYZ> pass;
pass.setInputCloud(point_cloud_ptr);
pass.setFilterFieldName("z");
pass.setFilterLimits(-2, 0);
//pass.setFilterLimitsNegative(true);
pass.filter(*cloud_filtered);
体素滤波器
// 创建过滤对象
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(point_cloud_ptr);
sor.setDownsampleAllData(1);
sor.setLeafSize(0.02f, 0.02f, 0.02f);
sor.filter(*cloud_filtered1);
统计滤波器
// 创建过滤对象
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor1;
sor1.setInputCloud(point_cloud_ptr);
sor1.setMeanK(50);
sor1.setStddevMulThresh(1.0);
sor1.filter(*cloud_filtered2);
半径滤波器
// 构建过滤器
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(point_cloud_ptr);
outrem.setRadiusSearch(0.01);
outrem.setMinNeighborsInRadius(1);
// apply filter
outrem.filter(*cloud_filtered3);
不同的滤波器在滤波过程中,总是先创建一个对象,再设置对象参数,最后调用滤波函数对点云进行处理(点云为智能指针指向的一块区域)
滤波效果
效果图依次是点云原始数据、直通滤波、体素滤波、统计滤波、半径滤波