点云库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文件,如下所示:
    可以很清楚的看到,该点云文件相比之前的原始数据文件密集度降低了很多。
    在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值