云點數據讀寫

一、常見點云數據格式

  1. LAS/LAZ格式

    • LAS是點云數據的行業標準格式

    • LAZ是LAS的壓縮版本

    • 支持地理參考信息、顏色、強度等屬性

  2. PCD格式(Point Cloud Data)

    • PCL(Point Cloud Library)開發的格式

    • 支持ASCII和二進制存儲

    • 包含頭部信息和數據部分

  3. PLY格式(Polygon File Format)

    • 最初為存儲3D掃描儀數據設計

    • 支持點云和網格數據

    • 可包含顏色、法線等屬性

  4. OBJ格式

    • 簡單文本格式

    • 主要用于3D模型但也可存儲點云

二、讀寫工具和庫

  1. PDAL(Point Data Abstraction Library)

    • 開源點云數據處理庫

    • 支持多種格式轉換和處理

  2. PCL(Point Cloud Library)

    • 強大的點云處理庫

    • 提供多種點云格式的讀寫接口

  3. LASlib/LASzip

    • 專門用于LAS/LAZ格式的讀寫

  4. CloudCompare

    • 開源點云處理軟件

    • 支持多種格式的導入導出

?

三、PCL讀寫點云數據

?PCL(Point Cloud Library)是處理點云數據的強大開源庫,提供了多種點云數據格式的讀寫功能。以下是使用PCL進行點云數據讀寫的主要方法。

1. 基本點云數據結構

pcl::PointCloud 類

主要屬性

  • width?- 點云的寬度(對于無組織點云表示點數,對于有組織點云表示每行點數)

  • height?- 點云的高度(對于無組織點云通常為1,對于有組織點云表示行數)

  • points?- 存儲所有點的向量

  • is_dense?- 布爾值,表示點云是否包含無限/NaN值

  • sensor_origin_?- 傳感器原點坐標(Eigen::Vector4f)

  • sensor_orientation_?- 傳感器方向(Eigen::Quaternionf)

2. 常用點類型

點類型描述包含數據
pcl::PointXYZ基本XYZ點float x, y, z
pcl::PointXYZI帶強度的XYZ點float x, y, z, intensity
pcl::PointXYZRGB帶RGB顏色的XYZ點float x, y, z; uint32_t rgb
pcl::PointXYZRGBA帶RGBA顏色的XYZ點float x, y, z; uint32_t rgba
pcl::PointNormal帶法線的XYZ點float x, y, z, normal_x, normal_y, normal_z, curvature

3. 讀寫點云數據方法

讀取點云文件

cpp

#include <pcl/io/pcd_io.h>// 讀取PCD文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud) == -1) {PCL_ERROR("Couldn't read file input.pcd\n");return -1;
}// 讀取PLY文件
#include <pcl/io/ply_io.h>
pcl::PLYReader reader;
reader.read("input.ply", *cloud);

寫入點云文件

cpp

// 寫入PCD文件(二進制格式)
pcl::io::savePCDFileBinary("output.pcd", *cloud);// 寫入PCD文件(ASCII格式)
pcl::io::savePCDFileASCII("output_ascii.pcd", *cloud);// 寫入PLY文件
pcl::PLYWriter writer;
writer.write("output.ply", *cloud, false); // false表示不保存二進制格式

4. 常用方法參數表

方法參數返回值描述
loadPCDFile(const std::string &file_name, PointCloud &cloud)int加載PCD文件
savePCDFile(const std::string &file_name, const PointCloud &cloud, bool binary_mode=false)int保存PCD文件
loadPLYFile(const std::string &file_name, PointCloud &cloud)int加載PLY文件
savePLYFile(const std::string &file_name, const PointCloud &cloud, bool binary_mode=false)int保存PLY文件
fromROSMsg(const sensor_msgs::PointCloud2 &msg, PointCloud &cloud)void從ROS消息轉換
toROSMsg(const PointCloud &cloud, sensor_msgs::PointCloud2 &msg)void轉換為ROS消息

?其他格式支持

1. PLY格式讀寫

cpp

#include <pcl/io/ply_io.h>// 讀取PLY文件
pcl::PLYReader reader;
reader.read("input.ply", *cloud);// 寫入PLY文件
pcl::PLYWriter writer;
writer.write("output.ply", *cloud);
2. OBJ格式讀寫

cpp

#include <pcl/io/obj_io.h>// 讀取OBJ文件
pcl::OBJReader reader;
reader.read("input.obj", *cloud);// 寫入OBJ文件
pcl::OBJWriter writer;
writer.write("output.obj", *cloud);
二進制與ASCII格式

PCD文件可以保存為二進制或ASCII格式:

cpp

// 保存為二進制格式(更小更快)
pcl::io::savePCDFileBinary("output_binary.pcd", *cloud);// 保存為壓縮二進制格式(更小)
pcl::io::savePCDFileBinaryCompressed("output_compressed.pcd", *cloud);// 保存為ASCII格式(可讀)
pcl::io::savePCDFileASCII("output_ascii.pcd", *cloud);

5. 點云基本操作

添加點

cpp

pcl::PointXYZ point;
point.x = 1.0; point.y = 2.0; point.z = 3.0;
cloud->points.push_back(point);

訪問點

cpp

// 隨機訪問
float x = cloud->points[10].x;// 遍歷所有點
for (const auto& point : *cloud) {std::cout << "x: " << point.x << " y: " << point.y << " z: " << point.z << std::endl;
}

點云屬性

cpp

std::cout << "點云大小: " << cloud->size() << std::endl;
std::cout << "寬度: " << cloud->width << std::endl;
std::cout << "高度: " << cloud->height << std::endl;
std::cout << "是否為有組織點云: " << cloud->isOrganized() << std::endl;

6. 常用信號(ROS相關)

在PCL與ROS結合使用時,常用的信號包括:

信號參數描述
pcl::visualization::PointPickingEventconst pcl::visualization::PointPickingEvent &event當用戶選擇點時觸發
pcl::visualization::KeyboardEventconst pcl::visualization::KeyboardEvent &event鍵盤事件
pcl::visualization::MouseEventconst pcl::visualization::MouseEvent &event鼠標事件

7. 示例代碼:完整讀寫流程

cpp

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>int main() {// 創建一個點云對象pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 填充點云數據cloud->width = 5;cloud->height = 1;cloud->is_dense = false;cloud->points.resize(cloud->width * cloud->height);for (auto& point : *cloud) {point.x = 1024 * rand() / (RAND_MAX + 1.0f);point.y = 1024 * rand() / (RAND_MAX + 1.0f);point.z = 1024 * rand() / (RAND_MAX + 1.0f);}// 保存到文件pcl::io::savePCDFileASCII("test_pcd.pcd", *cloud);std::cout << "保存了 " << cloud->size() << " 個點到 test_pcd.pcd" << std::endl;// 從文件讀取pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_from_file(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile<pcl::PointXYZ>("test_pcd.pcd", *cloud_from_file);// 顯示讀取的點云for (const auto& point : *cloud_from_file)std::cout << "    " << point.x << " " << point.y << " " << point.z << std::endl;return 0;
}

8. 注意事項

  1. 內存管理:使用智能指針(如boost::shared_ptrpcl::PointCloud::Ptr)管理點云對象

  2. 文件格式:PCD文件有ASCII和二進制格式,二進制格式更節省空間

  3. 點云類型:讀寫時要確保點云類型匹配

  4. ROS集成:PCL與ROS緊密集成,可以方便地與sensor_msgs::PointCloud2相互轉換

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77491.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77491.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77491.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[RHEL8] 指定rpm軟件包的更高版本模塊流

背景&#xff1a;掛載RHEL ISO使用kickstart安裝操作系統&#xff0c;安裝包未指定安裝perl&#xff0c;但是安裝完可以查到其版本&#xff0c;且安裝的是ISO中多個版本中的最低版本。 原因&#xff1a;&#xff08;1&#xff09;為什么沒有裝perl&#xff0c;perl -v可以看到版…

Spring 事務管理核心機制與傳播行為應用

Spring 事務詳解 一、Spring 事務簡介 Spring 事務管理基于 AOP&#xff08;面向切面編程&#xff09;實現&#xff0c;通過 聲明式事務&#xff08;注解或 XML 配置&#xff09;統一管理數據庫操作&#xff0c;確保數據一致性。核心目標&#xff1a;保證多個數據庫操作的原子…

JavaScript解密實戰指南:從基礎到進階技巧

JavaScript加密技術廣泛應用于數據保護、反爬蟲和代碼混淆&#xff0c;但掌握解密方法能幫助開發者突破技術壁壘。本文結合爬蟲實戰與安全分析場景&#xff0c;系統梳理JS解密的核心方法與工具。 一、基礎解密方法 1. Base64解碼 適用于簡單編碼場景&#xff0c;如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片&#xff08;SoC&#xff09;與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板&#xff0c;最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄羅斯方塊-簡單開發版

一、需求分析 實現了一個經典的俄羅斯方塊小游戲&#xff0c;主要滿足以下需求&#xff1a; 1.圖形界面 使用 pygame 庫創建一個可視化的游戲窗口&#xff0c;展示游戲的各種元素&#xff0c;如游戲區域、方塊、分數等信息。 2.游戲邏輯 實現方塊的生成、移動、旋轉、下落和鎖…

使用安全繼電器的急停電路設計

使用安全繼電器的急停電路設計 一&#xff0c;急停回路的設計1&#xff0c;如何將急停接到線路當中&#xff1f;2&#xff0c;急停開關 如何接到安全繼電器中 一&#xff0c;急停回路的設計 急停是每一個設備必不可少的部分&#xff0c;因為關乎安全&#xff0c;所以說所以說他…

【讀書筆記·VLSI電路設計方法解密】問題64:什么是芯片的功耗分析

低功耗設計是一種針對VLSI芯片功耗持續攀升問題的設計策略。隨著工藝尺寸微縮&#xff0c;單顆芯片可集成更多元件&#xff0c;導致功耗相應增長。更嚴峻的是&#xff0c;現代芯片工作頻率較二十年前大幅提升&#xff0c;而功耗與頻率呈正比關系。因此&#xff0c;芯片功耗突破…

在 Debian 10.x 安裝和配置 Samba

1. 更新系統 sudo apt update sudo apt upgrade -y2. 安裝 Samba sudo apt install samba -y3. 配置 Samba 備份默認配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak編輯配置文件 sudo nano /etc/samba/smb.conf示例配置&#xff08;共享目錄&#xff09; …

修改PointLIO項目

添加key_frame_info.msg消息 新建.msg文件&#xff0c;內容填寫為&#xff1a; # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…

關于隔離1

1.隔離的目的&#xff1a; 在隔離電源設計中&#xff0c;輸入與輸出之間沒有直接電氣連接&#xff0c;提供絕緣高阻態&#xff0c;防止電流回路。這意味著輸入與輸出之間呈現為絕緣的高阻態&#xff0c;從而確保了無電流回路的形成。 隔離與可靠保護有關。電隔離是一種電路設…

【java實現+4種變體完整例子】排序算法中【插入排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是插入排序的詳細解析&#xff0c;包含基礎實現、常見變體的完整代碼示例&#xff0c;以及各變體的對比表格&#xff1a; 一、插入排序基礎實現 原理 將元素逐個插入到已排序序列的合適位置&#xff0c;逐步構建有序序列。 代碼示例 public class InsertionSort {void…

清醒思考的藝術

成為穿越暴風雨后的幸存者 系統性錯誤是指系統性的偏離理性&#xff0c;偏離最理想的、合乎邏輯的、理智的思考和行為。 “系統”一詞很重要&#xff0c;因為我們經常錯誤地走向同一方向。 幸存偏誤 幸存偏誤會扭曲概率&#xff0c;系統性的高估了成功概率。一旦混淆選擇標準和…

DSA數據結構與算法 6

查找技術&#xff08;Searching Techniques&#xff09; 查找簡介 在計算機科學中&#xff0c;“查找”指的是在某個集合或序列中尋找特定元素的過程。這個過程可以是成功的&#xff0c;也可以是失敗的&#xff1a; 若目標元素存在于集合中&#xff0c;我們稱之為“查找成功”…

FastAPI:現代高性能Python Web框架的技術解析與實踐指南

一、FastAPI的誕生背景與技術定位 在數字化轉型的浪潮中,API(應用程序接口)作為連接服務與數據的核心樞紐,其性能與開發效率直接影響業務迭代速度。傳統Python框架如Django和Flask雖功能豐富,但在高并發場景下面臨性能瓶頸,且缺乏對異步編程的原生支持。FastAPI應運而生…

VuePress 使用教程:從入門到精通

VuePress 使用教程&#xff1a;從入門到精通 VuePress 是一個以 Vue 驅動的靜態網站生成器&#xff0c;它為技術文檔和技術博客的編寫提供了優雅而高效的解決方案。無論你是個人開發者、團隊負責人還是開源項目維護者&#xff0c;VuePress 都能幫助你輕松地創建和管理你的文檔…

1.Vue自動化工具安裝(Vue-cli)

目錄 1.node.js 安裝&#xff1a; 2 npm 安裝 3 安裝Vue-cli 4總結&#xff1a; 一般情況下&#xff0c;單文件組件&#xff0c;我們運行在 自動化工具vue-CLI中&#xff0c;可以幫我們編譯單文件組件。所以我們在學習時一般需要在系統中先搭建vue-CLI工具 下面就是一些我…

IP數據報

IP數據報組成 IP數據報&#xff08;IP Datagram&#xff09;是網絡中傳輸數據的基本單位。 IP數據報頭部 版本&#xff08;Version&#xff09; 4bit 告訴我們使用的是哪種IP協議。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 頭部長度&#xff08;IHL&#xff0c;Intern…

Leetcode 2158. 每天繪制新區域的數量【Plus題】

1.題目基本信息 1.1.題目描述 有一幅細長的畫&#xff0c;可以用數軸來表示。 給你一個長度為 n 、下標從 0 開始的二維整數數組 paint &#xff0c;其中 paint[i] [starti, endi] 表示在第 i 天你需要繪制 starti 和 endi 之間的區域。 多次繪制同一區域會導致不均勻&…

Git Flow

Git Flow深度解析&#xff1a;企業級分支管理實戰指南 前言 在持續交付時代&#xff0c;分支策略決定團隊協作效率。Git Flow作為經典的分支管理模型&#xff0c;被Apache、Spring等知名項目采用。2023年JetBrains開發者調查報告顯示&#xff0c;Git Flow仍是中大型項目最常用…

[Swift]pod install成功后運行項目報錯問題error: Sandbox: bash(84760) deny(1)

操作&#xff1a; platform :ios, 14.0target ZKMKAPP do# Comment the next line if you dont want to use dynamic frameworksuse_frameworks!# Pods for ZKMKAPPpod Moyaend pod install成功后運行報錯 報錯&#xff1a; error: Sandbox: bash(84760) deny(1) file-writ…