PCL滤波器的学习笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014695839/article/details/84479227

PCL提供了各种各样的滤波器,我在学习使用PCL库时简单地使用过其中一些。因此,在这里做个笔记。

在我看来,使用滤波器的过程为:创建滤波器 -> 设置输入的点云和滤波器参数 -> 执行滤波并获得输出结果。不同的滤波器除了需要设置不同的参数外,其他过程是一致的。想弄明白怎么使用这些滤波器,可以先了解它们共有的方法。

一、滤波器的基类

在PCL库中,滤波器继承自一个基类Filter,这个基类定义了滤波器共有的操作方法。

上图截自Filter类的文档:http://docs.pointclouds.org/trunk/classpcl_1_1_filter.html。这个图片告诉我们,Filter继承自PCLBase类,是滤波器的基类。

Filter类有一个继承自PCLBase类的成员函数setInputCloud,我们可以通过这个函数把要滤波的点云传递给Filter:

virtual void  setInputCloud (const PointCloudConstPtr &cloud) 提供一个指向点云数据的指针

Filter类定义了操作滤波器的函数:

IndicesConstPtr const  getRemovedIndices () const 获取被过滤的点索引。
void  getRemovedIndices (PointIndices &pi) 获取被过滤的点索引。
void  filter (PointCloud &output) 执行滤波操作,并将结果填入参数output。

二、部分滤波器介绍及使用

以下是一些被我使用过的滤波器的简单介绍和demo代码。

1、PassThrough

过滤出给定范围内的点云。

pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);
pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);

...
...

//创建滤波器
pcl::PassThrough<pcl::PointT> ptfilter;
//输入要滤波的点云
ptfilter.setInputCloud(input);
//选择x轴方向进行滤波
ptfilter.setFilterFieldName("x");
//过滤掉x标轴坐标在[-1.0, 1.0]范围之外的点
ptfilter.setFilterLimits(-1.0, 1.0);
//true:滤波结果取反,过滤掉x标轴坐标在[-1.0, 1.0]范围之内的点
ptfilter.setNegative(false);
//获取滤波结果
ptfilter.filter(*output);

2、ExtractIndices

根据给定的点云中点的索引集合提取点云,可结合pcl::SACSegmentation类(点云分割)使用。

pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);
pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);
pcl::PointIndices::Ptr indices(new pcl::PointIndices);
...
...

//创建滤波器
pcl::ExtractIndices<pcl::PointT> extract;
//输入要滤波的点云
extract.setInputCloud(input);
//被提取的点的索引集合
extract.setIndices(indices);
//true:滤波结果取反
extract.setNegative(false);
//获取滤波结果
extract.filter(*output);

3、VoxelGrid

对点云稀疏化(能保持点云形状和特征)

pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);
pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);

...
...

//创建滤波器
pcl::VoxelGrid<pcl::PointT> sor;
//输入点云
sor.setInputCloud (input);
//用0.1 x 0.2 x 0.3的立方体对点云进行稀疏化
sor.setLeafSize (0.1, 0.2, 0.3); 
//获得滤波结果
sor.filter (*output);

4、RadiusOutlierRemoval

过滤掉点云中的离群点,可去除点云中的噪声点

pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);
pcl::PointCloud<pcl::PointT>::Ptr output(new pcl::PointCloud<pcl::PointT>);

...
...

//创建滤波器
pcl::RadiusOutlierRemoval<pcl::PointXYZ> rorfilter;
//输入点云
rorfilter.setInputCloud(inpt);
//在0.5为半径的范围内搜寻邻居点
rorfilter.setRadiusSearch(0.5);
//邻居少于3个的点认为是离群点
rorfilter.setMinNeighborsInRadius (3);
//获取滤波结果
rorfilter.filter (*output);

以上是我用过的pcl库的滤波器的汇总,而代码所表达的都是最基本的用法,实际的接口比demo更加丰富,可以从滤波器的文档中查阅。此外,这只是pcl库提供的滤波器的一部分,还有更多滤波器等待着探索,到时候再回来更新。

大家如果发现问题,希望多多指正!

猜你喜欢

转载自blog.csdn.net/u014695839/article/details/84479227
今日推荐