LASlib 读写点云

2023-11-10

一、参考链接

1、LASlib / LAStools
2、LASlib库将PCL库点云类型数据转换为las格式保存
3、.las数据转.pcd并显示
las格式详解:
[1]孙爱怡,王健.LAS格式的解析与转换[J].全球定位系统,2016,41(02):115-117+124.

二、代码

#include "lasreader.hpp"
#include "laswriter.hpp"
#include"LasReadWrite.h"


/* read las */
void LasLib::ReadLas(const std::string& LasPath, pcl::PointCloud<PointT>::Ptr& Read_cloud)
{
	LASreadOpener lasReadOpener;
	lasReadOpener.set_file_name(LasPath.data());
	//lasReadOpener.set_file_name(sLasPath.c_str());
	LASreader* lasReader = lasReadOpener.open(false);

#pragma region Las information
	int majorVersion = lasReader->header.version_major;         // las文件的版本号
	int minorVersion = lasReader->header.version_minor;
	int pointDataFormat = lasReader->header.point_data_format;  // Lidar点的记录格式
	int pointAmount = lasReader->header.number_of_point_records;// Lidar点的个数
	double maxX = lasReader->header.max_x;                      // x坐标的最大值
	double minX = lasReader->header.min_x;                      // x坐标的最小值
	double maxY = lasReader->header.max_y;                      // y坐标的最大值
	double minY = lasReader->header.min_y;                      // y坐标的最小值
	double maxZ = lasReader->header.max_z;                      // z坐标的最大值
	double minZ = lasReader->header.min_z;                      // z坐标的最小值
	double deltaX = maxX - minX;                                // x坐标的取值范围
	double deltaY = maxY - minY;                                // y坐标的取值范围
	double deltaZ = maxZ - minZ;                                // z坐标的取值范围
	double xOffset = lasReader->header.x_offset;                // X方向的偏移量
	double yOffset = lasReader->header.y_offset;                // Y方向的偏移量
	double zOffset = lasReader->header.z_offset;                // Z方向的偏移量
	double xScale = lasReader->header.x_scale_factor;           // X方向的比例尺因子
	double yScale = lasReader->header.y_scale_factor;           // Y方向的比例尺因子
	double zScale = lasReader->header.z_scale_factor;           // Z方向的比例尺因子
#pragma endregion

	int pNumber = 0;
	while (lasReader->read_point())
	{
		LASpoint& pointReader = lasReader->point;

		PointT p;
		p.x = pointReader.get_x()- xOffset;
		p.y = pointReader.get_y()- yOffset;
		p.z = pointReader.get_z()- zOffset;
		//p.r = pointReader.get_R();
		//p.g = pointReader.get_G();
		//p.b = pointReader.get_B();
		//p.intensity = pointReader.get_intensity();
		//p.pointSourceID = pointReader.get_point_source_ID();
		//p.GPStime = pointReader.get_gps_time();
		
		//p.classification = pointReader.get_classification();
		Read_cloud->points.push_back(p);
		pNumber++;

#pragma endregion
	}

	lasReader->close();
	delete lasReader;
	lasReader = nullptr;
}

/* write las */
void LasLib::WriteLas(const std::string& sResultPath, pcl::PointCloud<PointT>::Ptr& Write_cloud)
{

	LASwriteOpener lasWriterOpener;
	lasWriterOpener.set_file_name(sResultPath.data());

	// init header
	LASheader lasHeader;
	lasHeader.x_scale_factor = 0.0001;
	lasHeader.y_scale_factor = 0.0001;
	lasHeader.z_scale_factor = 0.0001;
	lasHeader.x_offset = (int)Write_cloud->points[0].x;
	lasHeader.y_offset = (int)Write_cloud->points[0].y;
	lasHeader.z_offset = (int)Write_cloud->points[0].z;
	lasHeader.point_data_format = 3;
	lasHeader.point_data_record_length = 34; // 变长记录
	//lasHeader.number_of_point_records = vPoints.size();

	// open laswriter
	LASwriter* lasWriter = lasWriterOpener.open(&lasHeader);

	// init point
	LASpoint lasPoint;
	lasPoint.init(&lasHeader, lasHeader.point_data_format, lasHeader.point_data_record_length, 0);

	// write points
	double minX = DBL_MAX, minY = DBL_MAX, minZ = DBL_MAX;
	double maxX = -DBL_MAX, maxY = -DBL_MAX, maxZ = -DBL_MAX;
	for (int i = 0; i < Write_cloud->points.size(); i++)
	{
		// populate the point
		lasPoint.set_x(Write_cloud->points[i].x);
		lasPoint.set_y(Write_cloud->points[i].y);
		lasPoint.set_z(Write_cloud->points[i].z);
		//lasPoint.set_R(write_cloud->points[i].r);
		//lasPoint.set_G(write_cloud->points[i].g);
		//lasPoint.set_B(write_cloud->points[i].b);

		//lasPoint.set_intensity(write_cloud->points[i].intensity);
		//lasPoint.set_point_source_ID(write_cloud->points[i].pointSourceID);
		//lasPoint.set_gps_time(write_cloud->points[i].GPStime);
		//lasPoint.set_classification(write_cloud->points[i].classification);


		// write the point
		lasWriter->write_point(&lasPoint);

		// add it to the inventory
		lasWriter->update_inventory(&lasPoint);

		//range
		double x = Write_cloud->points[i].x;
		double y = Write_cloud->points[i].y;
		double z = Write_cloud->points[i].z;
		if (x < minX) minX = x;
		if (x > maxX) maxX = x;
		if (y < minY) minY = y;
		if (y > maxY) maxY = y;
		if (z < minZ) minZ = z;
		if (z > maxZ) maxZ = z;
	}

	// update the boundary
	lasHeader.set_bounding_box(minX, minY, minZ, maxX, maxY, maxZ);

	// update the header
	lasWriter->update_header(&lasHeader, true);

	// close the writer
	lasWriter->close();
	delete lasWriter;
	lasWriter = nullptr;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LASlib 读写点云 的相关文章

  • mysql进阶优化篇04——深入JOIN语句的底层原理

    前 言 作者简介 半旧518 长跑型选手 立志坚持写10年博客 专注于java后端 专栏简介 mysql基础 进阶 主要讲解mysql数据库sql刷题 进阶知识 包括索引 数据库调优 分库分表等 文章简介 本文将介绍JOIN语句的底层原理
  • 2022-06-14 用crontab在linux下定期执行mysql的存储过程

    问题 我们程序有一个日志表 tx log 由于每天数据量增加巨大 所以要每天手动备份3天前的数据到别的表中 tx log ls 并将这些数据在日志表中删除 但有时总会忘记备份 所以想写一个定时器 每天下半夜1点定时执行 思想 1 在mysq

随机推荐

  • STM32Cube学习(2)——定时器中断

    0 引言 单片机 STM32F407ZGT6 仿真器 ST Link V2 开发环境 STM32CubeIDE 1 10 1 功能说明 采用定时器中断的方式 实现LED按照定时器频率闪烁 前情提要 STM32Cube学习 1 点灯 配置 参
  • 基于点云的三维重建_一分钟详解三维重建学习路线

    作者 庞巧遇 来源 公众号 3D视觉工坊 链接 一分钟详解三维重建学习路线 三维重建在计算机视觉中是十分重要的 其中涉及很多的技术内容 为了后来人能少走弯路 也为了对自己的知识框架系统总结 特记录自己的学习路线 1 什么是三维重建 三维重建
  • 决策树,信息熵,信息增益计算----机器学习

    决策树 decision tree 决策树简单介绍 信息量 信息熵 信息增益 决策树简单介绍 决策树是一种基于树状结构来做决策的 是一种常见的机器学习方法 主要做分类 也可以做回归 一棵决策树含有一个根结点 样本全集 若干个内部结点和若干个
  • MYSQL HTTP头部注入

    HTTP头部基础 Accept 浏览器能够处理的内容类型 Accept Charset 浏览器能够显示的字符集 Accept Encoding 浏览器能处理的压缩编码 Accept Language 浏览器当前设置的语言 Connectio
  • Hyper-V 的用途与安装

    什么是 Hyper V Hyper V是微软提出的一种系统管理程序虚拟化技术 能够实现桌面虚拟化 WSL2 和 WSA 与 Hyper V 的关系 Hyper V其实分两个部分 底层的虚拟机平台 上层的虚拟机管理软件 以前的Windows版
  • 2023华为OD机试真题Python实现【动态规划/找出重复代码】

    题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复代码查找方法 以字符串形式给出两行代码 字符审长度1 lt length lt 100 由英文字母 数字和空格组成 找出两行代码
  • 两个日期选择器的联动

    让两个独立的日期选择器产生联动 我这里用的是elmentUI的 DatePicker日期选择器 效果展示 方案1
  • Linux下的dd命令

    简介 dd命令是Linux下的一个重要的磁盘操作命令 它的主要作用是备份和复制磁盘 dd的语法是 dd if 输入文件的名称 of 输出文件的名称 参数 值 if 输入文件的名称 指定输入文件的名称 可以是文件 设备 目录等 of 输出文件
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】流水线

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 流水线 知识点数组队列编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 一个工厂有m条流水线 来并行完成n个独立的作业 该工厂设置了一个调度系统 在安排作业时
  • aso优化师是什么_aso是什么意思 aso优化师是啥

    aso是什么意思 aso优化师是啥 年已过完 要收心工作学习了 今天李鑫自媒体就从头过滤一下aso方面的知识 用文字总结表述出来 加深自己理解的同时也帮助一些新手小伙伴了解aso aso是什么意思 ASO是App store Optimiz
  • element 的 this.$message( ) 消息提示实现

    在vue项目中 直接通过js代码 this message 就可以调出消息提示组件 这是如何实现的呢 主要分为以下几步 1 用 Vue extend 创建组件的模板 构造函数 2 创建一个函数 在函数内部 实例化组件并进行挂载到相应元素上
  • 【开发记录01】开发环境副本/页的导入&带用户权限管理系统

    在蒋老师的指导下大概了解了 1 开发环境的数据导入 导出 共享组件的同步 因为应用程序277是应用程序100的子程序 所以共享组件必须和100保持一致 但是会出现一个小问题 在APEX开发过程中同时打开两个不同的应用程序 但是编辑过程中经常
  • CVE-2017-12149

    春秋云镜 CVE 2017 12149 JBoss反序列化漏洞 靶标介绍 2017年8月30日 厂商Redhat发布了一个JBOSSAS 5 x 的反序列化远程代码执行漏洞通告 该漏洞位于JBoss的HttpInvoker组件中的 Read
  • 【教程】Github快速学习

    教程 Github快速学习 备注 一 Git基础 1 安装 2 git原理 3 基本配置 4 Gitignore 二 Git分支 1 基础命令 三 学习Github Github Docs官方文档 gt Github漫游指南 gt 开源指北
  • 毕业设计-基于大数据技术的旅游推荐系统-python

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 大数据常用采集工具

    1 Flume Flume作为Hadoop的组件 是由Cloudera专门研发的分布式日志收集系统 尤其近几年随着Flume的不断完善 用户在开发过程中使用的便利性得到很大的改善 Flume现已成为Apache Top项目之一 Flume提
  • [转]一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)

    一文读懂PID控制算法 抛弃公式 从原理上真正理解PID控制 PID控制应该算是应用非常广泛的控制算法了 小到控制一个元件的温度 大到控制无人机的飞行姿态和飞行速度等等 都可以使用PID控制 这里我们从原理上来理解PID控制 PID pro
  • AcWing 1603. 整数集合划分

    给定一个包含 N 个正整数的集合 请你将它们划分为两个不相交的集合 A1 和 A2 其中 A1 包含 n1 个元素 A2 包含 n2 个元素 用 S1 表示集合 A1 内所有元素之和 S2 表示集合 A2 内所有元素之和 请你妥善划分 使得
  • 前端技术栈

    https juejin cn post 7036581158670303240 做了一份前端面试复习计划 保熟 掘金 1 Vue和React的区别 Vue和React的比较 布里渊区 CSDN博客 2 CI CD 做了哪些实践 什么是 C
  • LASlib 读写点云

    一 参考链接 1 LASlib LAStools 2 LASlib库将PCL库点云类型数据转换为las格式保存 3 las数据转 pcd并显示 las格式详解 1 孙爱怡 王健 LAS格式的解析与转换 J 全球定位系统 2016 41 02