在PCL中如何实现点云压缩(1)

更新时间:2023-07-14 07:47:11 阅读: 评论:0

在PCL中如何实现点云压缩(1)
点云由庞⼤的数据集组成,这些数据集通过距离、颜⾊、法线等附加信息来描述空间三维点。此外,点云能以⾮常⾼的速率被创建出来,因此需要占⽤相当⼤的存储资源,⼀旦点云需要存储或者通过速率受限制的通信信道进⾏传输,提供针对这种数据的压缩⽅法就变得⼗分有⽤。PCL库提供了点云压缩功能,它允许编码压缩所有类型的点云,包括“⽆序”点云,它具有⽆参考点和变化的点尺⼨、分辨率、分布密度和点顺序等结构特征。⽽且,底层的octree数据结构允许从⼏个输⼊源⾼效地合并点云数据。
图1 点云压缩⽰意图
纪律作风心得体会
下⾯,我们解释单个点云和点云数据流是如何⾼效压缩的,在给出的例⼦中,我们⽤PCL点云压缩技术来压缩⽤OpenNIGrabber抓取到的点云。
代码:
⾸先,在PCL(Point Cloud Learning)中国协助发⾏的书提供光盘的第6章例1⽂件夹中,打开名为point_cloud_compression.cpp的代码⽂件。
严密性试验解释说明
下⾯详细解析打开的源代码。从主函数开始,⾸先创建⼀个新的SimpleOpenNIViewer实例并调⽤它的run()⽅法。
禹的拼音int
main(int argc,char **argv)
{
SimpleOpenNIViewer v;
v.run();
return(0);
}
在run()函数中,创建PointCloudCompression类的对象来编码和解码,这些对象把压缩配置⽂件作为配置压缩算法的参数,所提供的压缩配置⽂件为OpenNI兼容设备采集到的点云预先确定的通⽤参数集。本例中,使⽤MED_RES_ONLINE_COMPRESSION_WITH_COLOR配置参数集,它应⽤5⽴⽅毫⽶的编码精度并且允许彩⾊纹理成分编码,并进⼀步优化,⽤于快速在线压缩。压缩配置⽂件的完整列表及其配制⽅法可以在⽂件“/io/include/pcl/compression/compression_profiles.h”中找到。在PointCloudCompression构造函数中使⽤MANUAL_CONFIGURATION属性就可以⼿动设置压缩算法全部参数。
豆干怎么做好吃bool showStatistics=true;                      //设置在标准设备上输出打印出压缩结果信息
// 压缩选项详见 /io/include/pcl/compression/compression_profiles.h
pcl::octree::compression_Profiles_e compressionProfile=pcl::octree::MED_RES_ONLINE_COMPRESSION_WITH_COLOR;
// 初始化压缩与解压缩对象,其中压缩对象需要设定压缩参数选项,解压缩按照数据源⾃⾏判断
PointCloudEncoder=new pcl::octree::PointCloudCompression<pcl::PointXYZRGBA> (compressionP
rofile, showStatistics);
PointCloudDecoder=new pcl::octree::PointCloudCompression<pcl::PointXYZRGBA> ();
下⾯的代码为OpenNI兼容设备实例化⼀个新的采集器,并且启动循环回调接⼝,每从设备获取⼀帧数据,就调⽤回调函数⼀次,这⾥的回调函数实现数据压缩和可视化解压缩结果。
//创建从 OpenNI获取点云的抓取对象
pcl::Grabber* interface =new pcl::OpenNIGrabber ();
boost::function<void(constpcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr&)> f = boost::bind (&SimpleOpenNIViewer::cloud_cb_, this, _1);//建⽴回调函数
// 建⽴回调函数与回调信号之间绑定
boost::signals2::connection c = interface->registerCallback (f);
// 开始接收点云数据流
interface->start ();
while (!viewer.wasStopped ())
{
sleep (1);
}
interface->stop ();
河对岸是山在OpenNIGrabber采集循环执⾏的回调函数cloud_cb_中,我们⾸先把获取到的点云压缩到stringstream缓冲区,下⼀步是解压缩,它对压缩了的⼆进制数据进⾏解码,存储在新的点云对象中,解码了的点云被发送到点云可视化对象中进⾏实时可视化。
void
cloud_cb_ (const pcl::PointCloud<pcl::PointXYZRGBA>::ConstPtr &cloud)
{
if (!viewer.wasStopped ())
{
std::stringstream compresdData;// 存储压缩点云的字节流对象
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloudOut // 存储输出点云
(new pcl::PointCloud<pcl::PointXYZRGBA> ());
PointCloudEncoder->encodePointCloud (cloud, compresdData);// 压缩点云
鑫字五行属什么PointCloudDecoder->decodePointCloud (compresdData, cloudOut);// 解压缩点云
viewer.showCloud (cloudOut);//可视化解压缩点云
}
}
//在压缩与解压缩过程中,因为设置compresdData为true所以在标准输出上打印出压缩率帧数等信息
编译并运⾏该程序
利⽤光盘提供的⽂件,在cmake中建⽴⼯程⽂件,并⽣成相应的可执⾏⽂件,⽣成执⾏⽂件后,就可以运⾏了,在cmd中键⼊命令:
建德肉圆笺怎么读...>point_
可以看到如图2所⽰结果,左边为实时可视化带RGB纹理信息的点云结果,⽤户缩放可视化结果可以看到经过压缩后点云进⾏了重采样,纹理信息有所丢失,但数据量有所减⼩,在实际应⽤当中需折中取舍。右边则为实时压缩信息输出,可以看出压缩的帧数、点数、压缩率等信息。
图2 点云压缩运⾏结果

本文发布于:2023-07-14 07:47:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1080902.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:压缩   信息   对象   回调   参数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图