PCL 用八叉树方法压缩点云

news2024/9/25 5:09:32

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1点云压缩

2.1.2点云解压缩

2.2完整代码

三、实现效果

3.1原始点云

3.2数据显示


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        八叉树(Octree)是一种高效的三维空间数据结构,用于组织和索引点云数据。除了用于邻域搜索、体素化和可视化等操作,八叉树还可以用于点云的压缩。通过压缩,点云数据的大小可以显著减少,同时保留大致的几何形状,从而加速点云处理。

1.1原理

        八叉树压缩点云的原理是通过递归地将三维空间划分为八个子空间,直到每个体素(空间区域)中只有一个或几个点。可以根据指定的分辨率对点云进行体素化,当多个点落在同一个体素时,只保留一个点作为代表点,这样就减少了点云中的点数,达到压缩的目的。

1.2实现步骤

  1. 读取点云数据。
  2. 使用 pcl::octree::OctreePointCloudCompression 创建八叉树压缩对象。
  3. 压缩点云,并保存压缩结果。
  4. 解压缩点云以恢复压缩后的数据,并将结果可视化。

1.3应用场景

  1. 存储优化:减少点云存储所需的空间。
  2. 传输优化:通过压缩减少点云在网络传输中的数据量。
  3. 点云降采样:通过压缩降低点云数据的密度。

二、代码实现

2.1关键函数

2.1.1点云压缩

        通过 pcl::octree::OctreePointCloudCompression 对点云进行压缩,可以显著减少点云的大小。

#include <pcl/compression/octree_pointcloud_compression.h>

// 创建压缩对象
pcl::io::OctreePointCloudCompression<pcl::PointXYZ> pointCloudEncoder(true);  // 压缩设置为true

// 将点云压缩到字符串流中
std::stringstream compressedData;  // 存储压缩后的数据
pointCloudEncoder.encodePointCloud(cloud, compressedData);  // 压缩点云数据

2.1.2点云解压缩

        通过 pcl::io::OctreePointCloudCompression 解压缩先前压缩的点云数据,将数据还原为点云格式。 

// 创建解压缩对象
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_decoded(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::OctreePointCloudCompression<pcl::PointXYZ> pointCloudDecoder(false);  // 解压缩设置为false

// 从压缩数据流中解压缩点云
pointCloudDecoder.decodePointCloud(compressedData, cloud_decoded);  // 解压缩

2.2完整代码

#include <pcl/compression/octree_pointcloud_compression.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <iostream>
#include <sstream>

// 封装的可视化函数,显示两个点云,一个原始点云,一个解压缩后的点云
void visualizePointClouds(
    pcl::PointCloud<pcl::PointXYZ>::Ptr original_cloud,
    pcl::PointCloud<pcl::PointXYZ>::Ptr decompressed_cloud)
{
    pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Dual PointCloud Viewer"));

    // 设置视口1,显示原始点云
    int vp_1;
    viewer->createViewPort(0.0, 0.0, 0.5, 1.0, vp_1);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_1);
    viewer->addText("Original PointCloud", 10, 10, "vp1_text", vp_1);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> original_color_handler(original_cloud, 0, 255, 0);
    viewer->addPointCloud(original_cloud, original_color_handler, "original_cloud_vp1", vp_1);

    // 设置视口2,显示解压缩后的点云
    int vp_2;
    viewer->createViewPort(0.5, 0.0, 1.0, 1.0, vp_2);
    viewer->setBackgroundColor(1.0, 1.0, 1.0, vp_2);
    viewer->addText("Decompressed PointCloud", 10, 10, "vp2_text", vp_2);
    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> decompressed_color_handler(decompressed_cloud, 0, 0, 255);
    viewer->addPointCloud(decompressed_cloud, decompressed_color_handler, "decompressed_cloud_vp2", vp_2);

    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();

    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
    }
}

int main(int argc, char** argv)
{
    // 读取点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>("person2.pcd", *cloud) == -1)
    {
        PCL_ERROR("Couldn't read file!");
        return -1;
    }

    std::cout << "Original cloud size: " << cloud->points.size() << " points." << std::endl;

    // 创建压缩器和解压缩器对象,使用默认配置
    pcl::io::compression_Profiles_e compressionProfile = pcl::io::LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR;

    // 压缩对象
    pcl::io::OctreePointCloudCompression<pcl::PointXYZ> pointCloudEncoder(compressionProfile, true);
    std::stringstream compressedData;

    // 压缩点云
    pointCloudEncoder.encodePointCloud(cloud, compressedData);
    std::cout << "Point cloud compressed successfully." << std::endl;

    // 解压缩对象
    pcl::io::OctreePointCloudCompression<pcl::PointXYZ> pointCloudDecoder(compressionProfile, false);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_decoded(new pcl::PointCloud<pcl::PointXYZ>);

    // 解压缩点云
    pointCloudDecoder.decodePointCloud(compressedData, cloud_decoded);
    std::cout << "Point cloud decompressed successfully." << std::endl;
    std::cout << "Decompressed cloud size: " << cloud_decoded->points.size() << " points." << std::endl;

    // 可视化压缩前后的点云
    visualizePointClouds(cloud, cloud_decoded);

    return 0;
}

三、实现效果

3.1原始点云

3.2数据显示

Original cloud size: 10000 points.
*** POINTCLOUD ENCODING ***
Frame ID: 1
Encoding Frame: Intra frame
Number of encoded points: 8890
XYZ compression percentage: 7.122234%
XYZ bytes per point: 0.854668 bytes
Color compression percentage: 0.000000%
Color bytes per point: 0.000000 bytes
Size of uncompressed point cloud: 138.906250 kBytes
Size of compressed point cloud: 7.419922 kBytes
Total bytes per point: 0.854668 bytes
Total compression percentage: 5.341676%
Compression ratio: 18.720716

Point cloud compressed successfully.
Point cloud decompressed successfully.
Decompressed cloud size: 8890 points.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2162501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于深度学习的数字识别系统的设计与实现(python、yolov、PyQt5)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

VisualStudio如何卸载Resharper插件?

本来按理说&#xff0c;卸载插件应该就是在扩展下的已安装插件中&#xff0c;找到该插件&#xff0c;点一下就会出现卸载的按钮的。 没想到这个Resharper这么吊&#xff0c;卸载按钮居然是个灰色的&#xff0c;意思就是此路不通&#xff0c;有特权的。 那么这种情况下&#x…

DC-DC动态响应度的优化

DC-DC动态响应度的优化 以MP2315模块为例到底怎么样才能改变动态响应度呢&#xff1f;修改前馈电容修改电感也可以改善动态响应度 以MP2315模块为例 DC-DC输出位置再增加电容 从下面的波形图看出&#xff0c;多了一颗输出电容之后的结果&#xff0c;似乎有那么一点点作用但是…

【JS】严格模式/非严格模式的区别

JS的严格模式和非严格模式 js运行有两种模式&#xff1a;一种是普通模式&#xff1b;一种是严格模式。 严格模式是ES5添加的&#xff0c;是比普通模式多一部分的js规则。如果在ES5之前js解析引擎&#xff0c;会忽略严格模式。 js一般默认是普通模式&#xff0c;ES6的模块和Cla…

【优选算法之位运算】No.7--- 经典位运算算法

文章目录 前言一、位运算几种模型&#xff1a;1.1 基础的位运算&#xff1a; << >> ~ & | ^1.2 几种模型&#xff1a;1.3 模型练习 二、位运算示例&#xff1a;2.1 判定字符是否唯⼀2.2 丢失的数字2.3 两整数之和2.4 只出现⼀次的数字 II2.5 消失的两个数字 前…

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时&#xff0c;可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件&#xff0c;本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容&#xff1a; 腾讯云服务器&#xff1a;https://curl.qcloud.com/Sjy0zKjy 2…

【图文详解】什么是微服务?什么是SpringCloud?

目录 一.认识微服务架构 ▐ 微服务带来的挑战 二.微服务解决方案SpringCloud ▐ SpringCloud的版本 ▐ SpringCloud和SpringBoot的关系 ▐ SpringCloud实现方案 Spring Cloud Netfix Spring Cloud Alibaba ▐ Spring Cloud 实现对比 在入门Spring Cloud 之前&#xff…

太速科技-383-基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡

基于kintex UltraScale XCKU060的双路QSFP光纤PCIe 卡 一、板卡概述 本板卡系我司自主研发&#xff0c;基于Xilinx UltraScale Kintex系列FPGA XCKU060-FFVA1156-2-I架构&#xff0c;支持PCIE Gen3 x8模式的高速信号处理板卡&#xff0c;搭配两路40G QSFP接口&#xff…

DataX3.0:深入探索与实战应用

DataX3.0是阿里云DataWorks数据集成的开源版本&#xff0c;它继承了DataX1.0的优良基因&#xff0c;并在此基础上进行了全面的升级和扩展。新版本的DataX3.0不仅支持更多的数据源和目标端&#xff0c;还提供了更高效的数据同步能力&#xff0c;能够满足企业在数据迁移、数据同步…

虚拟硬盘数据恢复(vmdk、vdi、vhd等虚拟磁盘文件)

我们用的虚拟机有时候用着用着就启动不起来了&#xff0c;可能是操作系统启动扇区出了问题或者硬盘数据损坏。如果还有重要的数据文件在虚拟机里面&#xff0c;不要慌&#xff0c;一般只是操作系统的问题&#xff0c;硬盘里面的文件一般是不会丢失损坏的&#xff0c;即使磁盘有…

【论文阅读】RISE: 3D Perception Makes Real-World Robot Imitation Simple and Effective

Abstract 在模仿学习中&#xff0c;精确的机器人操作需要丰富的空间信息。基于图像的policies模型对象位置来自固定摄像头&#xff0c;对摄像头视图变化很敏感。利用3d点云的策略通常预测关键帧而不是连续动作&#xff0c;这在动态和联系人丰富的场景中造成了困难。为了有效地…

C++核心编程和桌面应用开发 第六天(this指针 友元)

目录 1.this指针 1.1C中空类的大小 1.2类中成员的存储方式 1.3this指针 1.3.1常函数 1.3.2常对象 2.友元 2.1全局函数做友元 2.2类做友元 2.3成员函数做友元 1.this指针 1.1C中空类的大小 1.2 类中成员的存储方式 1.3this指针 this指针指向被调用的成员函数所属的对…

Python电能质量扰动信号分类(一)基于LSTM模型的一维信号分类

引言 本文基于Python仿真的电能质量扰动信号&#xff0c;先经过数据预处理进行数据集的制作和加载&#xff0c;然后通过Pytorch实现LSTM模型对扰动信号的分类。Python仿真电能质量扰动信号的详细介绍可以参考下文&#xff08;文末附10分类数据集&#xff09;&#xff1a; Pyth…

详解机器学习经典模型(原理及应用)——支持向量机

一、什么是支持向量机 支持向量机&#xff08;Support Vector Machine, SVM&#xff09;是一种强大的机器学习算法&#xff0c;可用于解决数据分类&#xff08;二分类&#xff09;和回归问题。在分类问题上&#xff0c;SVM的核心思想是在特征空间中找到一个最优的超平面&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 【全网最全】2024年华为杯研赛A题保奖思路matlab/py代码成品论文等&#xff08;后续会更新完整 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https:…

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …

IDEA:如何设置项目启动的JVM运行内存大小

IDEA版本不一样页面也不一样 -Xms20m -Xmx200m 其实在本地开发调试的时候不需要太大内存&#xff0c;如果测试性能建议放到运算服务器上面去跑~~~

最小花费爬楼梯(动态规划)问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; 最小花费爬楼梯_牛客题霸_牛客网 二思路&#xff1a; 思路&#xff1a;动态规划找前后规律化简题意&#xff1a;此题想要的结果其实就是能上到顶楼也就是&#xff1a; 分为&#xff1…

信息安全工程师(16)密码学概况

前言 密码学是研究编制密码和破译密码的技术科学&#xff0c;它涵盖了加密技术和解密技术的各个方面&#xff0c;是现代信息安全的核心组成部分。 一、定义与基本概念 定义&#xff1a;密码学是研究如何隐密地传递信息的学科&#xff0c;主要涉及保密通信和数字签名两个方面。它…