欢迎点云相关产学研的学者和团体加入我们。
在本小节中我们将学习如何使用体素化网格方法实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即,三维立方体)内,用体素中所有点的重心来近似显示体素中其他点,这样该体素就内所有点就用一个重心点最终表示,对于所有体素处理后得到过滤后的点云。这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。
首先,在PCL(Point Cloud Learning)中国协助发行的书[1]提供光盘的第8章例2文件夹中,打开名为voxel_grid.cpp的代码文件,同文件夹下可以找到相关的测试点云文件table_scene_lms400.pcd。
我们分段解释代码,下列代码将从磁盘中读取点云数据。
pcl::PCDReaderreader; //点云读取对象
//把路径改为自己存放文件的路径或者将该文件与生产的可执行文件放在同一目录下
reader.read("table_scene_lms400.pcd",*cloud);//读取点云文件的中的数据到cloud对象
接下来,创建一个叶大小为1cm的pcl::VoxelGrid滤波器,输入数据作为滤波器的输入,滤波计算后的输出被储存在cloud_filtered中。
pcl::VoxelGrid<sensor_msgs::PointCloud2>sor; //创建滤波对象
sor.setInputCloud(cloud); //设置需要过滤的点云给滤波对象
sor.setLeafSize(0.01f,0.01f,0.01f); //设置滤波时创建的体素大小为1cm立方体
sor.filter(*cloud_filtered); //执行滤波处理,存储输出cloud_filtered
最后,将数据写入磁盘以供其他使用,例如可视化等。
pcl::PCDWriterwriter;
writer.write("table_scene_lms400_downsampled.pcd",*cloud_filtered,
Eigen::Vector4f::Zero(),Eigen::Quaternionf::Identity(),false);
利用光盘提供的CMakeLists.txt文件,在cmake中建立工程文件,并生成相应的可执行文件,生成执行文件后,就可以运行了,在cmd中键入命令:
...>voxel_grid.exe
你会看到类似图1所示的结果,命令行输出可以看出,过滤前后的数据量大大减少,处理前点云数为460400,而处理后为41049。如图2所示为原始点云与滤波后的点云可视化结果,明显也能看出,点的密度大小与整齐程度不同,虽然处理后数据量大大减少,但很明显其所含有的形状特征与空间结构信息与原始点云差不多。
图1 例2滤波运行结果
图2 例2中原始点云与滤波后的点云可视化结果
敬请关注PCL(Point Cloud Learning)中国更多的点云库PCL(Point Cloud Library)相关官方教程。
参考文献:
1.朱德海、郭浩、苏伟.点云库PCL学习教程(ISBN 978-7-5124-0954-5)北京航空航天出版社 2012-10