以下介绍PCL中四种常用的点云降采样算法,包括体素网格滤波、均匀采样、随机采样和近似体素网格滤波,涵盖原理、PCL代码实现、特点及适用场景。
原理:将点云空间划分为规则的3D体素网格,对每个体素内的点取质心(centroid)或平均点作为代表点,减少点云数量。
PCL实现:
#include <pcl/filters/voxel_grid.h>
pcl::VoxelGrid<pcl::PointXYZ> voxel_filter;
voxel_filter.setInputCloud(cloud);
voxel_filter.setLeafSize(0.01f, 0.01f, 0.01f); // 体素边长(米)
voxel_filter.filter(*cloud_filtered);
特点:
适用场景:3D重建、SLAM点云预处理。
参数:`LeafSize`控制体素边长,值越大,点云压缩越强。
原理:基于kd-tree,以固定空间间隔(搜索半径)选择代表点(通常为第一个点或质心),确保点云均匀分布。
PCL实现:
#include <pcl/filters/uniform_sampling.h>
pcl::UniformSampling<pcl::PointXYZ> uniform_filter;
uniform_filter.setInputCloud(cloud);
uniform_filter.setRadiusSearch(0.05f); // 搜索半径(米)
uniform_filter.filter(*cloud_filtered);
特点:
适用场景:表面重建、点云配准。
参数:`RadiusSearch`控制采样点间最小距离,值越大,点云越稀疏。
原理:从点云中随机选择固定数量的点,基于随机索引,不考虑空间分布。
PCL实现:
#include <pcl/filters/random_sample.h>
pcl::RandomSample<pcl::PointXYZ> random_filter;
random_filter.setInputCloud(cloud);
random_filter.setSample(1000); // 保留点数
random_filter.filter(*cloud_filtered);
特点:
适用场景:快速可视化、初步数据处理。
参数:`Sample`指定保留点数,值越小,降采样程度越高。
原理:与体素网格滤波类似,划分为3D体素网格,但使用近似方法(如哈希表)加速处理,牺牲少量精度换取更高效率。
PCL实现:
#include <pcl/filters/approximate_voxel_grid.h>
pcl::ApproximateVoxelGrid<pcl::PointXYZ> approx_voxel_filter;
approx_voxel_filter.setInputCloud(cloud);
approx_voxel_filter.setLeafSize(0.01f, 0.01f, 0.01f); // 体素边长(米)
approx_voxel_filter.filter(*cloud_filtered);
特点:
适用场景:超大规模点云处理、实时应用。
参数:`LeafSize`控制体素边长,值越大,点云压缩越强。
| 算法 | 保留几何结构 | 计算效率 | 点云均匀性 | 适用场景 |
|---|---|---|---|---|
| 体素网格滤波 | 高 | 高 | 中 | 3D重建、SLAM |
| 均匀采样 | 中 | 中 | 高 | 表面重建、点云配准 |
| 随机采样 | 低 | 高 | 低 | 快速可视化、初步处理 |
| 近似体素网格 | 中 | 极高 | 中 | 超大规模点云、实时处理 |