基于 PCL/Cloud compare/CGAL 的双边滤波环境配置,代码实现及结果分析

摘要

1.基于点云的双边滤波有两种,第一种是根据点的空间位置XYZ和强度Intensity,第二种是根据点的空间位置XYZ和法线信息Normal
2.已知的博客对基于PCL库双边滤波原理讲解都解释为根据点的空间位置XYZ和法线信息Normal,通过取邻近采样点的加权平均,沿点的法矢方向修正当前采样点的位置。按我的理解,其实都是错误的, 基于PCL的双边滤波是根据点的空间位置XYZ和强度Intensity,所以代码实现后点云的空间位置和法线信息没有改变
3.基于PCL的双边滤波:需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息
4.基于Cloud compare的双边滤波:同样需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息
5.基于CGAL的双边滤波:基于CGAL的双边滤波需要点云格式为PointNormal,PointNormal即XYZ字段+Normal字段,可以改变点云数量、位置、法线方向

一. 基于点云的双边滤波算法原理

1.参考文献

A review of algorithms for filtering the 3D point cloud

2.算法方向

方向1. 根据点的空间位置XYZ和强度Intensity

强度(Intensity)信息,与目标的表面材质、粗糙度、入射角方向,以及仪器的发射能量,激光波长有关。

Ws和Wr分别是空间权重和范围权重,(i,j)是(x,y)的邻域,I(i,j)体现(x,y)的强度
在这里插入图片描述

方向2. 根据点的空间位置XYZ和法线信息Normal

在这里插入图片描述
通过取邻近采样点的加权平均,沿点的法矢方向修正当前采样点的位置。p’为处理后的点云数据,p为输入数据, n为点云数据法向量,α为权重因子

在这里插入图片描述

权重不仅考虑了点云间的距离,还考虑了邻域点在原点切平面上投影点到原点的距离=根据点的空间位置XYZ和法线信息Normal的双边滤波不会减少点云数量,会影响点云位置、法线方向

二. 基于PCL的双边滤波

pcl::BilateralFilter < pcl::PointXYZI>基于pcl的双边滤波需要点云的强度字段I,。现有的points类型中,只有PointXYZI和PointXYZINormal有强度信息。这里使用有强度信息的点云模型数据集:kitti

1.代码实现

pcl双边滤波代码实现
pcl双边滤波参数说明

2.结果分析

两窗口对比显示基于pcl库的双边滤波处理前后点云位置法向量变化,可以发现 使用pcl库双边滤波对点云数量、位置、法线方向没有任何影响!
在这里插入图片描述
打开滤波前后的pcd文件,发现 pcl库双边滤波只改变了强度信息!
在这里插入图片描述
说明:pcl实现双边滤波对点云数量、位置、法线方向没有任何影响,只改变强度信息

三. 基于Cloud compare的双边滤波

1.操作实现

Cloud compare双边滤波操作实现

2.结果分析

(1)没有强度信息的点云无法点击Cloud compare的双边滤波
基于Cloud compare的双边滤波,需要点云有强度字段I
(2)两窗口对比显示Cloud compare双边滤波前后的点云位置,发现无变化
(3)Cloud compare双边滤波前后保存文件在pcl上计算法线并显示无区别,结果图省略
使用Cloud compare双边滤波对点云数量、位置、法线方向没有任何影响! 以强度信息作为颜色属性,可以发现双边滤波前后,颜色有变化(截图不明显,运行时很明显),发现 Cloud compare双边滤波只改变了强度信息!
在这里插入图片描述
说明: 基于Cloud compare的双边滤波,需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息

四. 基于CGAL的双边滤波

1.配置实现

Windows编译安装CGAL
Win 10 + VS 2017 + Qt +CGAL+Boost+CMake+Eigen

2.代码实现

CGAL有双边滤波的示例代码,位置在 :\CGAL\examples\Point_set_processing_3,
运行CGAL的双边滤波的示例代码,发现基于CGAL的双边滤波可以改变点云数量、位置、法线方向
在这里插入图片描述

3.格式问题:

PointXYZ如何转换为PointNormal?

观察示例代码的输入文件为 sphere_20k_normal.xyz
点云格式为PointNormal : x y z normal_x normal_y normal_z
在这里插入图片描述

大多数点云为PointXYZ格式,试改变示例代码,将输入文件路径改为目标文件(PointXYZ格式),代码运行时间变长,滤波后文件字段都是nan(Not a Number,非数,是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值),说明:CGAL的双边滤波代码中输入文件格式必须为PointNormal
在这里插入图片描述

4.问题解决

思路:计算Normal并保存+基于pcl库合并XYZ和Normal字段
步骤1:Normal计算显示并保存
步骤2:基于pcl库合并XYZ和Normal字段
步骤3:将输入文件路径改为目标文件(新合成的PointNormal格式),运行双边滤波代码
在这里插入图片描述
说明:1.CGAL的双边滤波代码中输入文件格式必须为PointNormal
2.基于CGAL的双边滤波可以改变点云数量、位置、法线方向

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值