Ubuntu 18.04.06 PCL C++学习记录(十)

@[TOC]PCL中滤波模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.8.1,CMake版本为3.10.2

学习内容

使用体素化网格方法实现下采样,即减少点的数量 减少点云数据,并同时保存点云的形状特征,在提高配准,曲面重建,形状识别等算法速度中非常实用,PCL是实现的VoxelGrid类通过输入的点云数据创建一个三维体素栅格,容纳后每个体素内用体素中所有点的重心来近似显示体素中其他点,这样该体素内所有点都用一个重心点最终表示,对于所有体素处理后得到的过滤后的点云,这种方法比用体素中心逼近的方法更慢,但是对于采样点对应曲面的表示更为准确。

源代码及所用函数

源代码

/*在本教程中,我们将学习如何使用体素网格方法对点云数据集进行降采样,即减少点的数量。
我们将要介绍的 VoxelGrid 类会在输入的点云数据上创建一个三维体素网格(将体素网格视为一组空间中的微小三维方框)。
然后,在每个体素(即三维方框)中,所有存在的点都将以其中心点为近似值(即降采样)。
这种方法比用体素中心点近似要慢一些,但能更准确地表示底层表面。*/

#include<iostream>//标准输入输出流头文件
#include<pcl/io/pcd_io.h>//PCD输入输出头文件
#include<pcl/point_types.h>//点类型定义头文件
#include<pcl/filters/voxel_grid.h>//包含体素网格滤波器的头文件

int main(int argc,char**argv)
{
    pcl::PCLPointCloud2::Ptr cloud(new pcl::PCLPointCloud2());
    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2());
    //读取点云对象
    pcl::PCDReader reader;
    reader.read("table_400.pcd",*cloud);//将点云读取到cloud中
    std::cout << "滤波之前的点云" <<cloud->width * cloud->height << "点数据(" << pcl::getFieldsList(*cloud) << ")";
    /* ---------------------- 创建一个叶大小为1cm的pcl::VoxelGrid滤波器 --------------------- */
    pcl::VoxelGrid<pcl::PCLPointCloud2> sor;//创建滤波对象
    sor.setInputCloud(cloud);//设置需要过滤的点云给滤波对象
    sor.setLeafSize(0.01f,0.01f,0.01f);//设置滤波时创建的体素体积为1cm的立方体
    sor.filter(*cloud_filtered);//将滤波后的点保存
    std::cout <<"滤波后的点" << cloud_filtered->width*cloud_filtered->height << "数据点(" << pcl::getFieldsList(*cloud_filtered) << ")";
    pcl::PCDWriter writer;
    writer.write("table_scene_lms400_downsampled.pcd",*cloud_filtered,Eigen::Vector4f::Zero(),Eigen::Quaternionf::Identity(),false);
    return 0;

}

CMakeLists.txt

cmake_minimum_required(VERSION 3.1 FATAL_ERROR)#指定CMake的最低版本要求为3.1
project(voxel_grid)#设置项目名称
#set(CMAKE_CXX_STANDARD 11)#设置C++编译器版本为C++11
find_package(PCL 1.8 REQUIRED)#查找PCL库,要求版本为1.7或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (voxel_grid voxel_grid.cpp)#需要修改
target_link_libraries (voxel_grid ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

PCD文件已上传,你自己试试看吧。
使用终端命令pcl_viewer file_name.pcd
在这里插入图片描述

滤波前
在这里插入图片描述滤波后
在这里插入图片描述

函数

  • pcl::PCLPointCloud2是PCL中用于存储点云数据的主要数据结构之一。它使用二进制格式存储点云数据,可以存储任意类型的点云数据,包括具有多种字段(如xyz坐标、法向量、颜色等)的点云。

补充内容

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值