0.双边滤波算法原理:通过取邻近采样点的加权平均,沿点的法矢方向修正当前采样点的位置。双边滤波的权重不仅考虑了点云间的距离,还考虑了邻域点在原点切平面上投影点到原点的距离=双边滤波不会减少点云数量,会影响点云位置、法线方向 1.基于PCL的双边滤波:需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息 2.基于Cloud compare的双边滤波:同样需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息 基于PCL/Cloud compare的双边滤波,需要点云有强度字段I,对点云数量、位置、法线方向没有任何影响,只改变强度信息 3.基于CGAL的双边滤波:基于CGAL的双边滤波需要点云格式为PointNormal,PointNormal即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的双边滤波可以改变点云数量、位置、法线方向,可以实现双边滤波的目标效果
|