运用 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 = BuildingLiDAR数据的归类方法不仅是咱们持有的类别。 相关类和相应 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/
|