天涯论坛

 找回密码
 立即注册
搜索
查看: 26|回复: 1

Python读取/处理/可视化激光点云【LiDAR】

[复制链接]

3085

主题

2万

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098784
发表于 2024-10-10 15:04:42 | 显示全部楼层 |阅读模式

运用 3D 点云数据拥有挑战性。 一张激光雷达图像中的点集合一般很广泛,按照图像体积可能达到数百万个点。 处理高度维度还带来了其他繁杂性。

举荐:用 NSDT场景设计器 快速搭建3D场景。

点云是空间中的一组数据点。 这些点能够暗示 3D 形状或对象。 每一个点位置都有其一组笛卡尔坐标(X、Y、Z)。

然则咱们持有区别的工具,能够比以往更直接地处理激光雷达数据。 这篇博文将教你一种在 Python 中读取、操作和可视化激光雷达数据的简单办法

1、读取和拜访激光雷达数据

在本教程中,咱们运用 Laspy(一个用于激光雷达 LAS/LAZ IO 的 Python 库)来摄取点云数据。 稍后,咱们运用用于 3D 数据处理的现代库 open3D 来可视化 3D 激光雷达数据。 因此咱们先导入这些库。

import laspy import open3d as o3d import numpy as np

咱们用 Laspy 读取激光雷达数据。 读取是运用 laspy.read() 函数完成的。 倘若你只想要元数据而不想要点,能够运用 laspy.open() 。

las = laspy.read(“data/lidar.las”) las

一旦咱们运用 laspy.read() 进行读取,就会得到元数据和点云数据。 咱们的激光雷达数据的 las 标头如下所示。

<LasData(1.1, point fmt: <ointFormat(1, 0 bytes of extra dims)>, 277573 points, 1 vlrs)>

包括 las 头、点格式、点计数和 vlrs。 咱们能够这般单独调用它们以得到每一个单独的输出。

las.header las.header.point_format las.header.point_count las.vlrs

摄取的文件还包括点数据。 首要,让咱们检测一下咱们已阅读的激光雷达文件的可用功能。

list(las.point_format.dimension_names)

在这种状况下,咱们能够运用以下功能。 请重视,这取决于 LAS 版本。

[X, Y, Z, intensity, return_number, number_of_returns, scan_direction_flag, edge_of_flight_line, classification, synthetic, key_point, withheld, scan_angle_rank, user_data, point_source_id, gps_time]

针对点数据,咱们有 X、Y 、 Z、强度、归类、GPS 时间和其他有些基本维度。 例如,让咱们瞧瞧其中的有些维度。

las.X las.intensity las.gps_time

输出是表率 X、强度和 GPS 时间的数字数组。

# X array([27799997, 27799997, 27799952, ..., 27775004, 27775002, 27775001]) #Intensity array([10, 15, 12, ..., 30, 41, 35], dtype=uint16) # gps_time array([5880.963028, 5880.963032, 5880.978038, ..., 5886.739728, 5886.739733, 5886.739738])

归类是另一个基本维度,你能够运用 las.classification 调用,它将供给一个数字数组。 然则倘若想从激光雷达数据中获取独一归类代码编号,则能够调用以下代码。

set(list(las.classification))

咱们的例子中,仅有四个类。

1 = Unassigned 2 = Ground 5 = High Vegetation 6 = Building

LiDAR数据的归类方法不仅咱们持有的类别。 相关类和相应 LAS 格式的完整仔细信息,请参阅 ArcGIS 文档页面。

2、创建、过滤和写入点云数据

要创建 3D 点云数据,咱们能够这般运用 Numpy 将 X、Y 和 Z 维度堆叠在一块

point_data = np.stack([las.X, las.Y, las.Z], axis=0).transpose((1, 0)) point_data

输出是一个 3 维数组,如下所示。

array([[ 68506260, 390272760, 31571], [ 68506057, 390272764, 31572], [ 68505659, 390272774, 31599], ..., [ 68747636, 389918893, 31996], [ 68747762, 389918889, 32296], [ 68747965, 389918898, 32223]])

咱们晓得数据的归类代码,因此呢能够过滤掉咱们想要的任何类别。 例如,咱们可以运行以下代码来仅过滤掉建筑类。

buildings = laspy.create(point_format=las.header.point_format, file_version=las.header.version) buildings.points = las.points[las.classification == 6]

能够这般用.write()函数将咱们筛选出来的建筑类点快速写入.las文件。

buildings.write(‘buildings.las’)

此刻咱们有一个新的激光雷达图像,其中只保留了建筑物数据。 让咱们继续点云数据可视化。

3、3D 点云可视化

Laspy 可视化办法因此呢咱们运用 open3d 库。 咱们首要创建 open3D 几何图形并传递咱们之前创建的点数据。 最后,咱们运用 open3d 可视化来绘制几何图形。

geom = o3d.geometry.PointCloud() geom.points = o3d.utility.Vector3dVector(point_data) o3d.visualization.draw_geometries([geom])

这般做的好处是它适用于 Jupyter Notebook。 它能够在单独的输出窗口中呈现 3D 可视化。 这是运用 Open3D 的数据的 3D 可视化。

原文链接:http://www.bimant.com/blog/process-lidar-point-cloud-with-python/





上一篇:激光雷达数据的地面线自动生成办法
下一篇:探讨机载LiDAR点云数据的点云修复与点云检测
回复

使用道具 举报

2983

主题

2万

回帖

9956万

积分

论坛元老

Rank: 8Rank: 8

积分
99569178
发表于 2024-11-13 10:34:42 | 显示全部楼层
你的话语如春风拂面,让我心生暖意。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 11:38 , Processed in 0.123911 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.