@[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: 这是一个标准输出流对象的引用。压缩后的数据将会被写入到这个流中。