点云库PCL学习笔记 -- 点云滤波Filtering -- 2.VoxelGrid 体素网格滤波器
VoxelGrid 体素网格滤波器相关知识
使用体素化网格方式实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。
PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即三维立方体)内,用体素中所有点的重心来近似显示体素中的其他店,这样体素内所有点就用一个重心点最终表示。对于所有体素处理后得到过滤的点云,这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。
1. VoxelGrid 体素网格滤波器代码
VoxelGrid 体素网格滤波器代码voxel_grid.cpp
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
int
main (int argc, char** argv)
{
//定义并实例化一个PointCloud2指针对象,从读取相关文件赋值该对象
pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
//点云读取对象
pcl::PCDReader reader;
reader.read ("table_scene_lms400.pcd", *cloud); //读取点云文件中的数据到 cloud 对象,table_scene_lms400.pcd 文件与该cpp文件在同一级目录下
//打印点云数据的相关信息
std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
<< " data points (" << pcl::getFieldsList (*cloud) << ")." << std::endl;
//创建体素滤波器, Voxel 叶大小为1cm的pcl::VoxelGrid滤波器
pcl::VoxelGrid<pcl::PCLPointCloud2> sor; //创建 VoxelGrid 体素栅格滤波对象
sor.setInputCloud (cloud); //给滤波对象设置需要过滤的点云
sor.setLeafSize (0.01f, 0.01f, 0.01f); //设置滤波时体素的大小为 1cm 立方体
sor.filter (*cloud_filtered); //执行滤波处理,存储滤波后的输出点云 cloud_filtered
//打印滤波后的点云数据信息
std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
<< " data points (" << pcl::getFieldsList (*cloud_filtered) << ")." << std::endl;
//将滤波后的点云写入 table_scene_lms400_downsampled.pcd 文件
pcl::PCDWriter writer;
writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered,
Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);
return (0);
}
2. 编译文件
设置编译文件CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(voxel_grid)
find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable (voxel_grid voxel_grid.cpp)
target_link_libraries (voxel_grid ${PCL_LIBRARIES})
编译
mkdir build
cd build/
cmake ..
make
3. 测试
执行程序
cd ..
./build/voxel_grid
结果如下:
- 未开始滤波时,工程文件的目录如下所示。
目录中的table_scene_lms400.pcd
原始文件与voxel_grid.cpp
文件在同一级目录下。
使用pcl_viewer -fc 0,200,200 table_scene_lms400.pcd
查看table_scene_lms400.pcd
文件,如下
(-fc 0,200,200)是设置点云颜色的相关参数:颜色参数为(0,200,200)
可以很清楚的看到,该点云文件相对比较密集。
-
开始执行程序后
相关的输出信息
文件目录变化如下所示,程序运行完成后会生成一个table_scene_lms400_downsampled.pcd
点云文件,该文件为通过VoxelGrid滤波器降采样滤波后的文件。
-
使用
pcl_viewer table_scene_lms400_downsampled.pcd
查看table_scene_lms400_downsampled.pcd
文件,如下所示:
可以很清楚的看到,该点云文件相比之前的原始数据文件密集度降低了很多。