【C++风云录】数据处理新纪元:激光扫描数据处理

从libLAS到SPDLib:全面解读六大顶级数据处理库

前言

本文将探讨六个关于点云数据处理的库,包括libLAS、PDAL、PCL、LASlib、LAStools和SPDLib。每个库都将在简介、功能以及支持的格式等方面进行深入的解析和阐述。

欢迎订阅专栏:C++风云录

文章目录

  • 从libLAS到SPDLib:全面解读六大顶级数据处理库
    • 前言
    • 1. libLAS
      • 1.1 简介
      • 1.2 功能
      • 1.3 使用方法
    • 2. PDAL (Point Data Abstraction Library)
      • 2.1 简介
      • 2.2 功能
      • 2.3 支持格式
      • 2.4 数据处理管道和过滤器
    • 3. PCL(Point Cloud Library)
      • 3.1 简介
      • 3.2 功能
      • 3.3 支持格式
      • 3.4 关键模块功能
    • 4. LASlib (LAS library)
      • 4.1 简介
      • 4.2 功能
      • 4.3 支持格式
    • 5. LAStools
      • 5.1 简介
      • 5.2 功能
      • 5.3 工具包内容及用途
    • 6. SPDLib (Sort, Pulse and Discrete Return Processing Library)
      • 6.1 简介
      • 6.2 功能
      • 6.3 关键模块功能
        • 6.3.1 数据管理
        • 6.3.2 数据处理
        • 6.3.3 数据分析
    • 总结

1. libLAS

libLAS 是一个开源C++库,用于处理美国地质勘探局(USGS)的公共激光雷达(LiDAR)数据。
官方网站: http://www.liblas.org/

1.1 简介

libLAS 是一个为读取和写入激光雷达点云数据而设计的 C++ 库。它提供了一种标准、简洁并且高效的方法来处理这些数据。

#include <liblas/liblas.hpp>int main() 
{std::ifstream ifs;ifs.open("file.las", std::ios::in | std::ios::binary);liblas::ReaderFactory f;liblas::Reader reader = f.CreateWithStream(ifs);while (reader.ReadNextPoint()){liblas::Point const& p = reader.GetPoint();std::cout << "X:" << p.GetX() << ", Y:" << p.GetY() << ", Z:" << p.GetZ() << std::endl;}return 0;
}

1.2 功能

libLAS 提供了以下功能:

  • 读取和写入 .las.laz 文件
  • 对点进行筛选和转换
  • 访问 LAS 属性,例如颜色和波形数据

1.3 使用方法

以下是一个使用 libLAS 的示例,该示例展示了如何打开 .las 文件,并读取点数据。

#include <liblas/liblas.hpp>
#include <fstream>
#include <iostream>int main()
{std::ifstream infile;infile.open("sample.las", std::ios::in | std::ios::binary);liblas::ReaderFactory rf;liblas::Reader reader = rf.CreateWithStream(infile);while (reader.ReadNextPoint()) {const liblas::Point& point = reader.GetPoint();std::cout << "X: " << point.GetX()<< ", Y: " << point.GetY()<< ", Z: " << point.GetZ() << std::endl;}return 0;
}

更多详细的使用信息,请参考 libLAS 官方文档。

2. PDAL (Point Data Abstraction Library)

2.1 简介

PDAL是一个C++库,用于翻译和处理点云数据。它提供了一种抽象方法来做几何/拓扑构造和数据管理。你可以在PDAL上找到更多信息。

#include <pdal/pdal.hpp>int main() {pdal::PointTable table;pdal::LasReader reader;reader.setFilename("input.las");reader.prepare(table);reader.execute(table);return 0;
}

2.2 功能

PDAL具有以下功能:

  • 支持许多文件格式,包括但不限于.las.laz.bpf.ply等。
  • 提供数据过滤和转换工具,例如裁剪、采样、平滑等。
  • 支持并行处理。
// 平滑示例
#include <pdal/SmoothKernel.hpp>int main() {pdal::SmoothKernel kernel;kernel.addSwitch(pdal::SmoothKernel::s_getName(), "smooth");kernel.parse();kernel.run();return 0;
}

2.3 支持格式

如前所述,PDAL支持多种格式,包括常见的LAS/LAZ 格式,也包括其他特殊格式,如 PLY、BPF 等。

2.4 数据处理管道和过滤器

PDAL 提供了一系列数据处理管道和过滤器,可供用户根据自身需求选择使用,具体包括:点云裁剪、重采样、降噪、分类、投影变换等。

// 降噪示例
#include <pdal/filters/OutlierFilter.hpp>int main() {pdal::OutlierFilter filter;filter.setInputOptions(pdal::Options("mean_k=10", "multiplier=1.0"));filter.filter(input);return 0;
}

更多详细的功能和使用手册,可以参考PDAL的官方文档。

3. PCL(Point Cloud Library)

PCL是一个大型跨平台的开源C++库,用于2D/3D图像和点云处理。它专注于为开发者提供通用的、高效的、可重复利用的数据处理工具。

3.1 简介

PCL库包含众多的现代算法,如特征估计,k-最近邻搜索,平面分割,范围图像,3D可视化等。更详细的信息可以在PCL官网上找到。

以下是一个简单的PCL函数示例,用于从.PCD文件中读取点云数据:

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>int main (int argc, char** argv)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) {PCL_ERROR ("Couldn't read file test_pcd.pcd \n");return (-1);}std::cout << "Loaded "<< cloud->width * cloud->height<< " data points from test_pcd.pcd with the following fields: "<< std::endl;for (const auto& point: *cloud)std::cout << "    " << point.x<< " "   << point.y<< " "   << point.z << std::endl;return (0);
}

3.2 功能

PCL库拥有丰富的特性和功能,包括:

  • 3D特征估计
  • k-最近邻搜索
  • 平面分割
  • 范围图像
  • 3D可视化

以及许多其他的实用功能。

3.3 支持格式

PCL支持各种常见的2D/3D图像和点云格式,包括但不限于:

  • PCD(PCL自定义的点云格式)
  • PNG/JPG/BMP等常见图像格式
  • STL/OBJ等常见3D模型格式

3.4 关键模块功能

以下是一些PCL中关键模块的简单介绍和代码示例:

  • 特征估计

    特征估计是点云处理中非常重要的一步,它通过计算点云中每一个点的特征来描述点云的全局或局部属性。以下是一个用于计算点云中所有点的法线的代码片段:

#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
// 填充点云数据
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud (cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ> ());
ne.setSearchMethod (tree);
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>);
ne.setRadiusSearch (0.03);
ne.compute (*cloud_normals);

更多详细信息和代码实例可以在PCL官网上找到,本篇文章只是对PCL库进行了简单的介绍,希望能为您对激光扫描数据处理提供一些帮助。

4. LASlib (LAS library)

4.1 简介

LASlib是一个高效的激光雷达数据处理库,由美国加利福尼亚大学洛杉矶分校Martin Isenburg开发。该库主要用于读取、写入和处理LAS格式的点云数据。LASlib库提供了一系列接口,可以帮助用户快速完成对点云数据的操作。

LASlib官方网站:https://www.cs.unc.edu/~isenburg/lastools/

下面是一个简单的使用LASlib读取并打印点云数据的C++代码例子:

#include "lasreader.hpp"
using namespace std;int main(int argc, char *argv[])
{// 创建LASreaderLASreadOpener lasreadopener;lasreadopener.set_file_name("input.las");// 打开文件LASreader* lasreader = lasreadopener.open();if (lasreader==0){cout << "ERROR: couldn't open lasreader\n";return 0;}// 读取并打印每个点的坐标while (lasreader->read_point()){cout << "X=" << lasreader->point.get_x()<< ", Y=" << lasreader->point.get_y()<< ", Z=" << lasreader->point.get_z() << "\n";}// 关闭文件lasreader->close();delete lasreader;return 0;
}

4.2 功能

LASlib库提供了以下主要功能:

  • 支持读取和写入LAS, LAZ(压缩的LAS)格式的点云数据。
  • 提供了丰富的点操作接口,可获取点的位置、颜色、强度等信息。
  • 提供了空间索引功能,可以有效地进行区域查询和采样操作。

4.3 支持格式

LASlib支持以下格式:

  • LAS:无损压缩的点云数据格式,广泛用于存储地形图、三维扫描等应用中的点云数据。
  • LAZ:LAS的压缩版本,比LAS占用更少的存储空间,但需要解压缩后才能使用。

以下是一个C++代码示例,展示了如何使用LASlib将LAS格式的点云数据转换为LAZ格式:

#include "lasreader.hpp"
#include "laswriter.hpp"int main(int argc, char *argv[]){// 创建LASreader和LASwriterLASreadOpener lasreadopener;LASwriteOpener laswriteopener;lasreadopener.set_file_name("input.las");laswriteopener.set_file_name("output.laz");// 打开LAS文件并创建LAZ文件LASreader* lasreader = lasreadopener.open();LASwriter* laswriter = laswriteopener.open(&lasreader->header);// 读取每个点并写入LAZ文件while (lasreader->read_point()){laswriter->write_point(&lasreader->point);laswriter->update_inventory(&lasreader->point);}// 关闭文件laswriter->close();delete laswriter;lasreader->close();delete lasreader;return 0;
}

这个程序会将输入的LAS文件转换为输出的LAZ文件。

5. LAStools

5.1 简介

LAStools 是一个高效的 LiDAR 数据处理软件包,由 Rapidlasso 公司开发和维护。它包含了一系列强大的模块,可用于 LiDAR 数据的读取、写入、查看、编辑和处理等任务。

更多信息请参考 LAStools 官方网站。

5.2 功能

LAStools 提供如下功能:

  • 转换:支持各种 LiDAR 数据格式之间转换。
  • 查看:可视化 LiDAR 数据,对数据进行直观理解。
  • 编辑:剪切、拼接、重采样、滤波等操作。
  • 分析:计算点云统计信息,提供高级分析工具。

5.3 工具包内容及用途

LAStools 包含以下主要工具:

  • laszip:用于 LiDAR 数据的无损压缩和解压缩。
  • lasinfo:获取 LiDAR 数据的详细信息。
  • lasground:从 LiDAR 数据中分类地面点。
  • lasoverlap:检查 LiDAR 数据的覆盖和质量。

以下是一些使用这些工具的示例代码:

// 使用 laszip 压缩数据
LASzip laszip;
laszip.request_compatibility_mode(1);
laszip.open_reader("input.las", &header);// 使用 lasinfo 获取数据信息
LASreadOpener lasreadopener;
lasreadopener.set_file_name("input.las");
LASreader* lasreader = lasreadopener.open();// 使用 lasground 分类地面点
LASground lasground;
lasground.set_params(-1, 10.0, 0.1);
lasground.init(lasreader->header.min_x, lasreader->header.min_y, lasreader->header.max_x, lasreader->header.max_y);
while (lasreader->read_point()) {lasground.add_point(&lasreader->point);
}// 使用 lasoverlap 检查数据覆盖和质量
LASoverlap lasoverlap;
lasoverlap.analyze_overlap("input.las");

更详细的 API 和使用教程可参见 LAStools 的 GitHub 仓库。

6. SPDLib (Sort, Pulse and Discrete Return Processing Library)

6.1 简介

SPDLib是一种强大的开源库,专门用于处理激光雷达扫描数据。它可以提供解决方案来管理、处理和分析大规模离散回波和全波形激光雷达数据。更多信息请访问SPDLib官网.

例如,您能够在C++中利用SPDLib进行简单的数据读取:

#include "spd/SPDFile.h"
#include "spd/SPDPoint.h"int main(){spdlib::SPDFile inSPDFile("input.spd");spdlib::SPDPoint point;for(uint64_t i = 0; i < inSPDFile.getNumPts(); ++i){point = inSPDFile.getPoint(i);std::cout << point.getX() << ", " << point.getY() << ", " << point.getZ() << std::endl;}return 0;
}

6.2 功能

SPDLib具有丰富的功能,包括但不限于:

  • 数据管理:支持多种格式的输入输出,如ASCII、LAS、SPD等。
  • 数据处理:对数据进行降噪、地表检测、分类等操作。
  • 数据分析:提供直接可视化或者导出为其他格式(如CSV)以供进一步分析。

6.3 关键模块功能

6.3.1 数据管理

此模块主要负责数据的输入输出,用户可以方便地将数据从一个格式转换为另一种格式。比如,我们可以将数据从LAS格式转换为SPD格式,代码示例如下:

#include "spd/SPDFile.h"
#include "spd/SPDDataImporter.h"
#include "spd/SPDLASImporter.h"int main(){spdlib::SPDFile *spdInFile = new spdlib::SPDFile("input.las");spdlib::SPDDataImporter *importer = new spdlib::SPDLASImporter();importer->open(spdInFile);spdlib::SPDFile *spdOutFile = new spdlib::SPDFile("output.spd");importer->readAndProcessAllData(spdOutFile);importer->close();delete importer;delete spdInFile;delete spdOutFile;return 0;
}
6.3.2 数据处理

SPDLib提供了一组函数用于数据处理,如数据滤波、分类等。下面的代码示例将演示如何使用SPDLib进行数据滤波:

#include "spd/SPDFile.h"
#include "spd/SPDProcessDataBlocks.h"
#include "spd/SPDApplyFilter.h"int main(){spdlib::SPDFile *spdInFile = new spdlib::SPDFile("input.spd");spdlib::SPDProcessDataBlocks *processor = new spdlib::SPDApplyFilter();processor->processDataBlocks(spdInFile);delete processor;delete spdInFile;return 0;
}
6.3.3 数据分析

通过SPDLib,我们可以方便地进行数据分析,如计算点云的基本统计信息。下面是一个使用SPDLib来计算点云平均高度的C++代码实例:

#include "spd/SPDFile.h"
#include "spd/SPDPoint.h"int main(){spdlib::SPDFile inSPDFile("input.spd");spdlib::SPDPoint point;double sumHeight = 0;for(uint64_t i = 0; i < inSPDFile.getNumPts(); ++i){point = inSPDFile.getPoint(i);sumHeight += point.getZ();}double meanHeight = sumHeight / inSPDFile.getNumPts();std::cout << "Mean Height: " << meanHeight << std::endl;return 0;
}

总结

通过对六个不同的点云数据处理库的深度解析,我们可以更清楚地理解它们各自的优越性以及适用场景。无论是libLAS的高效处理能力,还是PCL的强大功能性,或者是SPDLib的模块化设计,都使得点云数据处理变得简单而有效。掌握这些库,就意味着掌握了处理点云数据的关键。

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

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

相关文章

如何让程序适应ChatGPT:提升开发效率的指南

ChatGPT作为一种强大的AI助手&#xff0c;已经在各行各业中展现了其独特的价值。在软件开发领域&#xff0c;如何让程序更好地适应ChatGPT&#xff0c;从而提升开发效率&#xff0c;是一个值得深入探讨的话题。本文将介绍一些策略和方法&#xff0c;帮助开发者优化程序&#xf…

什么是 UUID,uuid

文章目录 一、是什么二、为什么三、怎么用 标题&#xff1a;深入探讨UUID&#xff1a;全球唯一标识符的秘密 一、是什么 在当今数字化时代&#xff0c;唯一标识符&#xff08;UUID&#xff09;在计算机科学领域扮演着重要的角色。UUID是一种用于标识信息的唯一字符串&#xff0…

工具-博客搭建

以下相关讲解均基于hexo github pages方案&#xff0c;请注意&#xff01;&#xff01;&#xff01;博客搭建方案选择 参考文章1 搭建教程 参考文章1 hexo github pages搭建过程中遇到的问题 删除categories、tags 1、删除含有需要删除categories、tags的文章 2、hexo …

【intel CPU】三代牙膏的对比

1、PC处理器的选择 制程工艺 传说的“intel7”,感觉就像老婆饼&#xff0c;并不是7nm。 2、12代到13代其实应该归为一代&#xff0c;那就是大核心不行就堆小核心 3、所以智能踢掉有小核的&#xff1b; 3.1、CPU规格 3.2 内存规格 3.3 封装规格 其他都是一样的&#xff1b; …

彩色进度条(C语言版本)

.h文件 #include<stdio.h> #include<windows.h>#define NUM 101 #define LOAD_UP 50 #define LOAD_DOWN 60 #define SLEEP_SLOW 300 #define SLEEP_FAST 70 版本1&#xff1a;&#xff08;初始版&#xff09; //v1 #include "progress.h" int main() …

Spring ----> IOC

文章目录 一、 Spring 是一个包含众多工具的IoC容器二、 什么是IOC以及好处三、 如何实现loc思想四、Spring提供的实现loC的方法 --- 类注解方法注解4.1 类注解类注解概念介绍类注解的使用 4.2 方法注解Bean 一、 Spring 是一个包含众多工具的IoC容器 场景解析&#xff1a;首先…

TAS5711带EQ和DRC支持2.1声道的20W立体声8V-26V数字输入开环D类数字功放音频放大器

前言 数字功放很难搞&#xff0c;寄存器很多&#xff0c;要配置正确才有声音&#xff0c;要想声音好&#xff0c;要好好调整。 TAS5711出道很多年了&#xff0c;现在仍然在不少功放、音箱中能看到。 TAS5711特征 音频输入/输出 从 18V 电源向 8Q 负载提供 20W 功率 宽 PVDD…

使用libdmtx库高效识别DM码,关键是图像预处理

直接代码 void MainWindow::on_pushButton_decode_datamatrix_clicked() {//ROIcv::Rect rect(876,172,1200,1200);cv::Mat Dm_image_roi Dm_image(rect);cv::imshow("ROI",Dm_image_roi);cv::waitKey(1);//return;//Resizecv::Size size(Dm_image_roi.rows/2 ,Dm_…

【栈】Leetcode 71. 简化路径【中等】

简化路径 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表示当前目录本身&am…

MySQL的主从复制(主从数据库都是Linux版本)

概述 1.什么是主从复制 主从复制是指将主库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持一致。 2.主从复制作用 数据备份&#xff1a;通过主从复…

SQL:学习SQL优化

学习 1.语句 2.原则&#xff08;三条快速记忆&#xff09; 3.常见查询类型 试验 本次试验采用SQL表中的world 数据库中city表来试验 1.查询方法 explain SELECT * FROM city where ID>500 limit 10; #1.all查询&#xff0c;主要是因为查询的键不是District&#xff0c;…

新加坡裸机云多IP服务器与跨境外贸业务的适配性

在数字化时代&#xff0c;跨境外贸业务对服务器的需求愈发高标准化、多元化。新加坡裸机云多IP服务器&#xff0c;凭借其独特的优势&#xff0c;成为了跨境外贸等业务的首选。源库主机测评将为您科普新加坡裸机云多IP服务器如何满足跨境外贸等业务的需要。 首先&#xff0c;新加…

工业交换机的好处有哪些?

工业交换机是现代工业网络中不可或缺的重要组成部分&#xff0c;它扮演着连接和管理各种网络设备的关键角色。工业交换机的优点不言而喻&#xff0c;首先是其稳定可靠的性能&#xff0c;能够支撑工业环境下的高负荷工作。无论是在恶劣的温度、湿度或电磁干扰的环境下&#xff0…

【Java】/*类和对象(上)*/

目录 一、什么是类、什么是对象 二、为什么要学习类和对象 三、初识面向过程和面向对象编程 四、如何定义类 4.1 语法形式 4.2 定义示例 示例一&#xff1a;定义一个描述学生的类 示例二&#xff1a;定义一个描述冰箱的类 示例二&#xff1a;定义一个描述狗的类 4.3…

Python基础学习笔记(五)——选择结构与循环结构

目录 程序的组织结构条件选择结构1. 单分支结构2. 双分支结构3. 多分支结构4. 嵌套&#xff08;分支&#xff09;结构5. 无内容执行6. 条件表达式 循环结构1. 可迭代对象2. range()函数3. for循环语句4. while循环语句5. 结束语句 程序的组织结构 程序的组织结构主要有以下三种…

Flutter 中的 DraggableScrollableSheet 小部件:全面指南

Flutter 中的 DraggableScrollableSheet 小部件&#xff1a;全面指南 Flutter 提供了多种展示和交互数据的方式&#xff0c;其中 DraggableScrollableSheet 是一个功能丰富的组件&#xff0c;它允许用户通过拖拽操作来展开和隐藏一个可滚动的面板。这个小部件非常适合实现如评…

新媒体运营如何抓住热点? 沈阳新媒体运营培训

01.如何来寻找热点 热点之所以称为热点&#xff0c;就是它的实时性强&#xff0c;一般情况下我们将热点分为常规型热点和突发型热点&#xff08;社会型事件&#xff09;&#xff0c;但是对于新媒体运营来说&#xff0c;常规型热点是可以提前知晓的&#xff0c;可以预先策划的&…

树形结构-数据表模型

路径枚举模型 实现的无级树形列表 分类表 CREATE TABLE categories (name CHAR(10) NOT NULL,id CHAR(1) NOT NULL PRIMARY KEY,path VARCHAR(500) NOT NULL ); 加上 邻接表 的特性 CREATE TABLE categories (name CHAR(10) NOT NULL,id INT NOT NULL PRIMARY KEY,path VARC…

MySQL5个查询

# 总查询 EXPLAIN SELECT * FROM city; # 范围查询 EXPLAIN SELECT * from city where ID>5 and ID<20; #主键查询 EXPLAIN SELECT * from city where ID5; # 索引查询 EXPLAIN SELECT * from city where CountryCodeNLD; # 普通索引 EXPLAIn SELECT * from cit…

7 Series FPGAs Integrated Block for PCI Express IP核简介

7 Series FPGAs Integrated Block for PCI Express IP核是Xilinx公司7系列FPGA中集成的PCI Express&#xff08;PCIe&#xff09;IP核模块&#xff0c;是一个可扩展的、高带宽的、可靠的串行互联构建块&#xff0c;用于与Xilinx的Zynq-7000 SoC和7系列FPGA配合使用。它支持1-la…