PCL学习记录-2 Filter-2 VoxelGrid(体素网格方法-降采样)功能及用法解析

通过体素网格实现降采样,可以减少点数量的同时,保证点云的形状特征,可以提高配准、曲面重建、形状识别等算法的速度,并保证准确性

来源:官方文档:https://pcl-tutorials.readthedocs.io/en/latest/voxel_grid.html#voxelgrid

一.VoxelGrid体素网格方法进行滤波&降采样 

  VoxelGrid体素网格作用:使用体素网格可以用来减少点云数据中的点的数量,同时能够保持点云的形状特征;

                                         在提高配准,曲面重建,形状识别等算法的运行速度时,非常有用。

  VoxelGrid体素网格实现原理:

          PCL实现的VoxelGrid类通过输入的点云数据创建一系列三维的体素栅格(可以想象为一个个微小的空间三维立方体的集合),然后在每一个体素中(就是每一个三维体素栅格)内,用这个体素栅格内所有点的重心近似的显示体素中的其他点(用一个点代表栅格内的所有点)

          经过体素网格处理过的点云的密度将会显著减小,并且能够很好的保留原始的曲面特征,这也就是降采样(或称下采样的原因)。

 

二.使用体素网格进行降采样代码

     2.1 代码实现大致过程:

        1.创建带处理点云对象:注意变量格式为:pcl::PCLPointCloud2::Ptr 

        2.创建处理后点云对象:pcl::PCLPointCloud2::Ptr 

        3.将PCD文件导入,并存入带处理点云对象中:使用pcl::PCDreader

        4.创建Voxel体素处理对象,并设置体素参数,此处例子采用的体素网格的尺寸为0.01m^3

        5.执行降采样,并存入处理后点云对象中

        6.将降采样后点晕存储至PCD文件中

    2.2 一些小tips:

       1. 使用 pcl_viewer -multiview 1 table_scene_lms400.pcd table_scene_lms400_downsampled.pcd 指令,可以同时查看两个点云PCD文件。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>

int main(int argc, char** argv){
    //step1 :创建待处理点云对象以及处理后点云对象,注意变量类型!
    pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
    pcl::PCLPointCloud2::Ptr filtered_cloud(new pcl::PCLPointCloud2());

    //Step2: 创建IO对象,读取点云文件,并显示体素网格降采样之前的点云信息
    pcl::PCDReader reader;
    reader.read("table_scene_lms400.pcd", *cloud);
    
    std::cerr<< "PointCloud file size before filtering" << cloud->width *cloud->height
             << " data points.("  <<pcl::getFieldsList(* cloud)<<  ")." <<std::endl;

    //step3. 创建体素网格对象,并进行降采样
    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;
    sor.setInputCloud(cloud);
    sor.setLeafSize(0.01f,0.01f,0.01f);
    sor.filter(*filtered_cloud);
    
    //step4:降采样结束,查看结果
    std::cerr<< "PointCloud file size after filtering" << filtered_cloud->width *filtered_cloud->height
             << " data points.("  <<pcl::getFieldsList(* filtered_cloud)<<  ")." <<std::endl;

    //Step5: 将降采样后的文件存储至PCD文件中
    pcl::PCDWriter writer;
    writer.write ("table_scene_lms400_downsampled.pcd", *filtered_cloud, 
         Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);

 return (0);

}

   处理后的结果如下所示:

          

 

                               

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值