各种滤波方法类对点云滤波的整体流程:
使用对应滤波器方法类设置滤波器对象------将待滤波的点云添加到滤波器对象------根据相应滤波的的特性设置滤波器的各个参数------设置滤波条件------采用滤波方法滤波,将滤波后的点云输出。
例子:直通滤波器对点云滤波
1,创建pass滤波器对象; pcl::PassThrough<pcl::PointXYZ> pass(true/false);
首先创建passthrough滤波器对象,如果后续过程依然要使用被滤除点,我们必须保存被滤除点的索引以供后续使用,那么创建滤波器对象时,必须设置为true,默认构造函数创建滤波器对象时默认参数是false,不保存被滤除点的索引。
2,添加滤波对象两种方式,
一是添加指向点云的指针;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudnew(pcl::PointCloud<pcl::PointXYZ>)
pass.setInputCloud(cloud);
二是添加指向点云索引的指针;
pcl::IndicesConstPtr my_indicies;
pass.setIndicies(my_indicies);
三是设置滤波器的各种参数;
pass.setFilterFieldName(const std::string):设置在那个属性字段上做滤波处理;
pass.setFilterLimits(double a,double b):设置滤波的区间限制;
pass.setFilterLimitsNegative(bool):设置滤除区间内的点还是区间外的点;
pass.filter(*pointcloud_ptr):滤波后的点云的输出;
程序如下:
结果如下图所示:可知:
1,pcl库中可视窗口的坐标原点在左下角;
2,v2视口为v1视口原始点云沿着x字段滤波得到的[0,1]区间内的点云;
3,v3视口为v1原始点云经过第一次滤波被滤除点云沿着z方向滤波,得到区间[-1,0]的点云;
4,v4视口为第二次滤波被滤除的点云在y方向的滤波,可知,对于一个滤波器对象pass连续使用发法getRemoveIndices()返回的仅仅是上一次滤波被滤除点云的索引值,上上一次滤波被滤除的点云的索引就被覆盖点不存在了。
来自源码: