目录
5.1 PCL中点云滤波方案
5.2 滤波基类相关
(1) Class pcl::Filter< PointT >
(2) Class pcl::Clipper3D< PointT >
(3) Class pcl::FilterIndices< PointT >
5.3 PCL滤波算法分类
(1) 滤波类
(2) 采样类(多用于配准或者点云其他后处理)
(3) 空间裁剪器
(4) 其他
参考文章:PCL 滤波模块相关概念及算法介绍_setleafsize_天上地芒果的博客-CSDN博客
PCL中总结了几种需要进行点云滤波处理的情况,这几种情况分别如下:
(1)点云数据密度不规则需要平滑。
(2)因为遮挡等问题造成离群点需要去除。
(3)大量数据需要进行下采样(Downsample)。
(4)噪声数据需要去除。
对应的方法如下:
(1)按具体给定的规则限制过滤去除点。
(2)通过常用滤波算法修改点的部分属性。
(3)对数据进行下采样。
pcl::Filter
filter()函数的实现如下:
inline void
filter (PointCloud &output)
{
if (!initCompute ())
return;
if (input_.get () == &output) // cloud_in = cloud_out
{
PointCloud output_temp;
applyFilter (output_temp);
output_temp.header = input_->header;
output_temp.sensor_origin_ = input_->sensor_origin_;
output_temp.sensor_orientation_ = input_->sensor_orientation_;
pcl::copyPointCloud (output_temp, output);
}
else
{
output.header = input_->header;
output.sensor_origin_ = input_->sensor_origin_;
output.sensor_orientation_ = input_->sensor_orientation_;
applyFilter (output);
}
deinitCompute ();
}
在filter中调用了applyFilter()函数,这里的applyFilter()函数为各个滤波算法的具体实现,applyFilter()是虚函数,在基类为纯虚函数:virtual void applyFilter (PointCloud &output) = 0;,在各个滤波派生类中实现了具体的方法。正常情况下,派生类可以调用基类的成员函数,这里值得注意的是,基类通过纯虚函数反过来调用了派生类的成员函数。
类Clipper3D是3D空间裁剪对象的基类。
类FilterIndices是剔除符合一定限定的点集的基类。
参考文章:pcl滤波模块架构解析与算法汇总_pcl滤波算法_xinxiangwangzhi_的博客-CSDN博客
pcl滤波算法主要分为三类:滤波类、采样类、空间裁剪器、其他
◆ 双边滤波,快速双边滤波,omp加速的快速双边滤波(pcl中双边滤波需要使用强度信息)
bilateral.hpp
fast_bilateral.hpp
fast_bilateral_omp.hpp
◆ 半径滤波
radius_outlier_removal.hpp
◆ 中值滤波
median_filter.hpp
◆ 统计滤波
statistical_outlier_removal.hpp
◆ 直通滤波、条件滤波
这两种原理上是一致的,都是根据点的属性(filed)例如xyz法线曲率直方图属性等进行过滤
passthrough.hpp
conditional_removal.hpp
◆ 模型滤波
设置特定模型做为过滤器,根据设定的模型(如线面体)进行拟合,以此提取该模型的点云
model_outlier_removal.hpp
◆ 投影滤波
设置特定几何模型做为过滤器,将点云投影至该模型
project_inliers.hpp
◆ 形态学滤波
对点云进行开闭操作
morphological_filter.hpp
◆ 最小z值采样
对点云建立二维网格,取网格中z值最小的点,可以用于分析多回波信息,提取地面
grid_minimum.hpp
◆ 局部最大z值采样
对点云进行半径进行搜索,删除近邻中z值最大的点,可以用于提取地面
local_maximum.hpp
◆ 体素采样
4种体素滤波
approximate_voxel_grid.hpp
voxel_grid.hpp
voxel_grid_covariance.hpp ["The Three-Dimensional Normal-Distributions Transform an Efficient Representation for Registration"]
voxel_grid_label.cpp
◆ 均匀采样
uniform_sampling.hpp
◆ 随机采样
random_sample.hpp
◆ 体素法线采样
将输入空间划分为网格,直到每个网格最多包含N个点,并在每个网格内随机采样点。使用每个网格的N个点计算得到一个法线。在栅格内采样的所有点的法线都等于该法线。
sampling_surface_normal.hpp
◆ 法线空间均匀采样(NSS)
将点云在法向空间中排列,然后对点云进行均匀采样
normal_space.hpp[“Efficient variants of the ICP algorithm”]
◆ 基于6D协方差的点云采样
该算法以增量方式向生成的点云添加点,同时尽量使协方差矩阵的所有6个特征值彼此尽可能接近
covariance_sampling.hpp["Geometrically Stable Sampling for the ICP Algorithm"]
◆ 金字塔采样
有组织点云的多尺度表示方法,这是一种迭代平滑降采样算法。
pyramid.hpp
◆ 锥体裁剪器
截锥体剔除过滤截锥体内由相机姿态和视野给定的点。
frustum_culling.hpp
◆ 仿射变换3D包围盒裁剪器
需要给定一个仿射变换矩阵,将原点的单位包围盒进行仿射变换,得到仿射变换后的包围盒内的点云
box_clipper3D.hpp
◆ 平面裁剪器
plane_clipper3D.hpp
◆ 包围盒裁剪器
获取指定包围盒内的点云
crop_box.hpp
◆ 凸包裁剪器
首先建立凸包,获取在3D封闭曲面上或2D封闭多边形内或外部的点云
crop_hull.hpp
◆ 法线优化
每个法线更新为其邻域中所有法线的(加权)平均值,以此来优化已估计的法线。
normal_refinement.hpp
◆ 点云卷积
convolution.hpp
convolution_3d.hpp
◆ 提取索引点云
extract_indices.hpp
◆ 估计遮挡区域
voxel_grid_occlusion_estimation.hpp
◆ 移除边不连续上出现的重影点
shadowpoints.hpp