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

@[TOC]PCL中K-Dtree模块的学习

学习背景

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

学习内容

以OpenNI设备输入为例,学习PCL点云的压缩、解压缩以及可视化解压缩点云

源代码及所用函数

源代码

#include<iostream>//用于输入/输出操作的标准头文件
#include<sstream>//用于字符串流操作的头文件。
#include<pcl/point_cloud.h>//点云类定义头文件
#include<pcl/point_types.h>//点类型定义头文件
#include<pcl/io/openni_grabber.h>//PCL库中用于从OpenNI设备获取点云数据的头文件
#include<pcl/visualization/cloud_viewer.h>//PCL库中用于可视化点云的头文件
#include<pcl/compression/octree_pointcloud_compression.h>//CL库中用于点云压缩和解压缩的头文件。

// 一个预处理器条件编译指令,用于检测当前编译环境是否为Windows32位系统。如果定义了WIN32这个宏,则执行该条件分支下的代码
//在Windows下,Sleep 函数是以毫秒为单位的睡眠时间。
//而在其他系统(如Linux)中,它的参数是以秒为单位的睡眠时间。
#ifdef WIN32
#define sleep(x) Sleep((x)*1000)
#endif
class SimpleOpenNIViewer
{    
public:
    pcl::visualization::CloudViewer viewer;
    pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder;//用于压缩和解压缩包含空间坐标和颜色信息的点云数据。
    pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudDecoder;//需要使用new关键字为PointCloudEncoder分配内存,并在不再需要时释放该内存。

    SimpleOpenNIViewer()
     :viewer(" Point Cloud Compression Example")//构造函数CloudViewer接受一个字符串参数,这个字符串将会成为可视化窗口的标题。
    {}
    void cloud_cd_(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud)
    {
        if(!viewer.wasStopped())
        {
            std::stringstream CompressedDate;//存储压缩点云的字节流对象
            pcl::PointCloud<pcl::PointXYZRGBA>::Ptr CloudOut(new pcl::PointCloud<pcl::PointXYZRGBA>());//存储输出点云
            PointCloudEncoder->encodePointCloud(cloud,CompressedDate);//压缩点云
            PointCloudDecoder->decodePointCloud(CompressedDate,CloudOut);//解压缩点云
            viewer.showCloud(CloudOut);//可视化解压缩点云
            //在压缩与解压缩过程中,因为设置CompressDate为true,所以在标准输出上打印压缩率帧数等信息
        }
    }

    void run()
    {
        bool ShowStatistics = true;//设置在标准设备上输出打印出压缩结果信息
        pcl::io::compression_Profiles_e compressionProfile = pcl::io::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;
        //初始化压缩与解压缩对象,压缩对象需要设定压缩参数选项,解压缩按照数据源自行判断
        PointCloudEncoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>(compressionProfile,ShowStatistics);
        PointCloudDecoder = new pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>();
        //创建从OpenNI获取点云的抓取对象
        pcl::Grabber* interface = new pcl::OpenNIGrabber();
        //回调函数
        boost::function<void(const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f = boost::bind(&SimpleOpenNIViewer::cloud_cd_,this,_1);
        boost::signals2::connection c = interface->registerCallback(f);
        //开始接受点云数据流
        interface->start();
        while(!viewer.wasStopped())
        {
            sleep(1);
        }
        interface->stop();
        delete(PointCloudDecoder);
        delete(PointCloudEncoder);//释放内存
        delete(interface);
    }
};

int main()
{
    SimpleOpenNIViewer v;
    v.run();
    return 0;
}


CMakeLists.txt

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

函数

  • pcl::visualization::CloudViewer viewer;PCL 中的一个类,用于可视化点云数据。创建一个可视化窗口,并实时显示点云。构造函数 CloudViewer 接受一个字符串参数,这个字符串将会成为可视化窗口的标题。
    本章所用方法
showCloud(const pcl::PointCloud<PointT> &cloud)
//在查看器窗口中显示给定的点云
//这会将点云显示在可视化窗口中。如果这行代码被反复调用(例如在一个循环或回调函数中),点云显示将会被实时更新。
  • pcl::io::OctreePointCloudCompression<pcl::PointXYZRGBA>* PointCloudEncoder;
    pcl::io::OctreePointCloudCompression 是 PCL 库中用于点云压缩和解压缩的一个类,<pcl::PointXYZRGBA> 是一种点云数据类型,表示每个点包含 X、Y、Z 三个空间坐标以及 RGB 颜色信息。
  • PointCloudEncoder->encodePointCloud(cloud, CompressedData);将输入的点云数据压缩,并将压缩后的数据写入到一个输出流中
void encodePointCloud(const PointCloudConstPtr& cloud_arg, std::ostream& compressedTreeDataOut_arg) const;
//cloud_arg: 这是一个指向常量点云对象的共享指针。它是我们想要压缩的输入点云数据。
//compressedTreeDataOut_arg: 这是一个标准输出流对象的引用。压缩后的数据将会被写入到这个流中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值