点云库PCL学习笔记 -- 点云滤波Filtering -- 2. VoxelGrid 体素网格滤波器

点云库PCL学习笔记 -- 点云滤波Filtering -- 2.VoxelGrid 体素网格滤波器


VoxelGrid 体素网格滤波器相关知识

使用体素化网格方式实现下采样,即减少点的数量,减少点云数据,并同时保持点云的形状特征,在提高配准、曲面重建、形状识别等算法速度中非常实用。

PCL实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格(可把体素栅格想象为微小的空间三维立方体的集合),然后在每个体素(即三维立方体)内,用体素中所有点的重心来近似显示体素中的其他店,这样体素内所有点就用一个重心点最终表示。对于所有体素处理后得到过滤的点云,这种方法比用体素中心来逼近的方法更慢,但它对于采样点对应曲面的表示更为准确。


1. VoxelGrid 体素网格滤波器代码

VoxelGrid 体素网格滤波器代码voxel_grid.cpp

#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)
{
  //定义并实例化一个PointCloud2指针对象,从读取相关文件赋值该对象
  pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
  pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());

  //点云读取对象
  pcl::PCDReader reader;
  
  reader.read ("table_scene_lms400.pcd", *cloud); //读取点云文件中的数据到 cloud 对象,table_scene_lms400.pcd 文件与该cpp文件在同一级目录下

  //打印点云数据的相关信息
  std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height 
       << " data points (" << pcl::getFieldsList (*cloud) << ")." << std::endl;

  //创建体素滤波器, Voxel 叶大小为1cm的pcl::VoxelGrid滤波器
  pcl::VoxelGrid<pcl::PCLPointCloud2> sor;		//创建 VoxelGrid 体素栅格滤波对象
  sor.setInputCloud (cloud);					//给滤波对象设置需要过滤的点云
  sor.setLeafSize (0.01f, 0.01f, 0.01f);		//设置滤波时体素的大小为 1cm 立方体
  sor.filter (*cloud_filtered);					//执行滤波处理,存储滤波后的输出点云 cloud_filtered

  //打印滤波后的点云数据信息
  std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height 
       << " data points (" << pcl::getFieldsList (*cloud_filtered) << ")." << std::endl;

  //将滤波后的点云写入 table_scene_lms400_downsampled.pcd 文件
  pcl::PCDWriter writer;
  writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered, 
         Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);

  return (0);
}

2. 编译文件

设置编译文件CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(voxel_grid)
find_package(PCL 1.2 REQUIRED)

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (voxel_grid voxel_grid.cpp)
target_link_libraries (voxel_grid ${PCL_LIBRARIES})

编译
mkdir build
cd build/
cmake ..
make

3. 测试

执行程序

cd ..
./build/voxel_grid

结果如下:

  • 未开始滤波时,工程文件的目录如下所示。
    目录中的table_scene_lms400.pcd原始文件与voxel_grid.cpp文件在同一级目录下。
    在这里插入图片描述
    使用pcl_viewer -fc 0,200,200 table_scene_lms400.pcd查看table_scene_lms400.pcd文件,如下
    (-fc 0,200,200)是设置点云颜色的相关参数:颜色参数为(0,200,200)
    可以很清楚的看到,该点云文件相对比较密集。

在这里插入图片描述

  • 开始执行程序后
    相关的输出信息
    在这里插入图片描述
    文件目录变化如下所示,程序运行完成后会生成一个table_scene_lms400_downsampled.pcd点云文件,该文件为通过VoxelGrid滤波器降采样滤波后的文件。
    在这里插入图片描述

  • 使用pcl_viewer table_scene_lms400_downsampled.pcd查看table_scene_lms400_downsampled.pcd文件,如下所示:
    可以很清楚的看到,该点云文件相比之前的原始数据文件密集度降低了很多。
    在这里插入图片描述


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCL学习教程是关于点云(Point Cloud Library)的教程,该可以用于处理和分析来自传感器的三维点云数据。学习PCL的教程通常包括以下内容: 1. 安装PCL:首先,你需要安装PCL及其依赖项。具体的安装方法可以参考PCL官方网站上的文档。 2. 点云数据的读取和可视化:学习如何读取和可视化点云数据是PCL学习的第一步。使用PCL提供的函数和类,你可以读取来自传感器的点云数据,并将其可视化以便观察和分析。 3. 点云滤波PCL提供了各种滤波器,用于去除点云中的噪声、采样和下采样,以及提取感兴趣的特征。 4. 特征提取:学习如何从点云中提取表面特征,例如平面、曲率、法线等。 5. 点云配准:点云配准是将多个点云对齐到一个共同的坐标系中的过程。PCL提供了各种配准算法,包括ICP(迭代最近点)和SAC-IA(随机一致性),用于实现点云的配准。 6. 点云分割:点云分割是将点云分成多个不同的部分或对象的过程。PCL提供了各种分割算法,例如基于颜色、法线、平面模型等的分割算法。 7. 点云配准和分割的应用:学习如何将点云配准和分割应用于实际问题,例如机器人导航、三维重建和目标检测等。 在学习PCL时,你可以通过阅读PCL官方文档、实践示例代码和参加相关培训课程等方式来深入了解和掌握PCL的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值