欢迎点云相关产学研的学者和团体加入我们。
本小节中我们将学习如何对指定的某一维度实行一个简单的滤波,即去掉在用户指定范围内部(或外部)的点。
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第8章例1文件夹中,打开名为passthrough.cpp的代码文件。
在下列代码中,我们利用随机数生成了点云,作为滤波的输入点云数据,并将其打印到标准输出。
// 生成并填充点云数据
cloud->width=5; //设置点云宽度或数量,这里为数量
cloud->height=1; //设置点云高度或标准其为无序点云
cloud->points.resize(cloud->width*cloud->height);
for(size_t i=0;i<cloud->points.size();++i) //为点云填充数据
{
cloud->points[i].x=1024*rand()/(RAND_MAX+1.0f);
cloud->points[i].y=1024*rand()/(RAND_MAX+1.0f);
cloud->points[i].z=1024*rand()/(RAND_MAX+1.0f);
}
std::cerr<<"Cloud before filtering: "<<std::endl; //打印所有点到标准错误输出
for(size_t i=0;i<cloud->points.size();++i)
std::cerr<<" "<<cloud->points[i].x<<" "
<<cloud->points[i].y<<" "
<<cloud->points[i].z<<std::endl;
接下来,我们创建了直通滤波器的对象,设立它的参数,滤波字段名被设为Z轴方向,可接受的范围设为是(0.0,1.0),即将点云中所有点的z坐标不在该范围内的点过滤掉或保留,这里是过滤掉,由函数setFilterLimitsNegative设定。
pcl::PassThrough<pcl::PointXYZ>pass; //设置滤波器对象
pass.setInputCloud(cloud); //设置输入点云
pass.setFilterFieldName("z"); //设置过滤时所需要点云类型的z字段
pass.setFilterLimits(0.0,1.0); //设置在过滤字段上的范围
//pass.setFilterLimitsNegative (true); //设置保留范围内的还是过滤掉范围内的
pass.filter(*cloud_filtered); //执行滤波,保存过滤结果在cloud_filtered
最后我们打印出过滤后的点云数据。
std::cerr<<"Cloud after filtering: "<<std::endl;
for(size_t i=0;i<cloud_filtered->points.size();++i)
std::cerr<<" "<<cloud_filtered->points[i].x<<" "
<<cloud_filtered->points[i].y<<" "
<<cloud_filtered->points[i].z<<std::endl;
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>passthrough.exe
你会看到类似图1的输出结果,由于是随机数据产生的点云,所以每次运行结果不一样,但都会将点云中z坐标在(0,1)范围外的点过滤掉。
图1 例1过滤点云运行结果
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10