PCL点云库(5) — Filters模块基类和分类

目录

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) 其他


5.1 PCL中点云滤波方案 

参考文章:PCL 滤波模块相关概念及算法介绍_setleafsize_天上地芒果的博客-CSDN博客

PCL中总结了几种需要进行点云滤波处理的情况,这几种情况分别如下:

(1)点云数据密度不规则需要平滑。

(2)因为遮挡等问题造成离群点需要去除。

(3)大量数据需要进行下采样(Downsample)。

(4)噪声数据需要去除。

对应的方法如下:

(1)按具体给定的规则限制过滤去除点。

(2)通过常用滤波算法修改点的部分属性。

(3)对数据进行下采样。

5.2 滤波基类相关

(1) Class pcl::Filter< PointT >

        pcl::Filter<PointT>是几乎是所有滤波算法的接口,在pcl::Filter<PointT>基类中,最重要的函数为void filter (PointCloud &output),在我们常用的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;,在各个滤波派生类中实现了具体的方法。正常情况下,派生类可以调用基类的成员函数,这里值得注意的是,基类通过纯虚函数反过来调用了派生类的成员函数。

(2) Class pcl::Clipper3D< PointT >

   类Clipper3D是3D空间裁剪对象的基类。

(3) Class pcl::FilterIndices< PointT >

   类FilterIndices是剔除符合一定限定的点集的基类。

5.3 PCL滤波算法分类

参考文章:pcl滤波模块架构解析与算法汇总_pcl滤波算法_xinxiangwangzhi_的博客-CSDN博客

pcl滤波算法主要分为三类:滤波类、采样类、空间裁剪器、其他

(1) 滤波类

◆ 双边滤波,快速双边滤波,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


(2) 采样类(多用于配准或者点云其他后处理)

◆ 体素采样

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

(3) 空间裁剪器

◆ 锥体裁剪器

截锥体剔除过滤截锥体内由相机姿态和视野给定的点。

frustum_culling.hpp

◆ 仿射变换3D包围盒裁剪器

需要给定一个仿射变换矩阵,将原点的单位包围盒进行仿射变换,得到仿射变换后的包围盒内的点云

box_clipper3D.hpp

◆ 平面裁剪器

plane_clipper3D.hpp

◆ 包围盒裁剪器

获取指定包围盒内的点云

crop_box.hpp

◆ 凸包裁剪器

首先建立凸包,获取在3D封闭曲面上或2D封闭多边形内或外部的点云

crop_hull.hpp

(4) 其他

◆ 法线优化

每个法线更新为其邻域中所有法线的(加权)平均值,以此来优化已估计的法线。

normal_refinement.hpp

◆ 点云卷积

convolution.hpp
convolution_3d.hpp

◆ 提取索引点云

extract_indices.hpp

◆ 估计遮挡区域

voxel_grid_occlusion_estimation.hpp

◆ 移除边不连续上出现的重影点

shadowpoints.hpp

猜你喜欢

转载自blog.csdn.net/qq_41921826/article/details/130700603