【Matlab/C】多时序激光雷达点云数据的形变监测
假如我有多组点云数据。
- 需要先建立一个形变场,以区域最大范围为水平面
- 以时间为Z轴,然后以第一组点云数据为基准用M3C2算法计算形变量并储存在时间轴中,在每一个平面格网处用变化点检测算法检测发生形变的开始时间
- 记录整个形变过程
- 用区域生长法依据时间轴中的形变量获取各形变的空间范围
常见环境搭建
- cloudCompare
- lasdata
- laszip
下载后设置环境变量的path
解释和任务的拆分
-
预处理点云数据 读取每组点云数据并进行必要的预处理,例如去除离群点和噪声等。将点云数据进行格式化并处理成可以用于后续计算的形式。
-
建立形变场 以区域最大范围为水平面,以时间为Z轴建立形变场。可以使用Matlab中的3D坐标轴或其他可视化工具来可视化形变场。
-
计算形变量 以第一组点云数据为基准,使用M3C2算法计算形变量。M3C2算法是一种非常常用的用于点云匹配和形变量计算的算法,可以使用Matlab中的Point Cloud Toolbox中的函数实现。
-
记录形变过程 在每一个平面格网处使用变化点检测算法检测形变的开始时间,并记录整个形变过程。变化点检测算法可以使用Matlab中的函数实现,例如findchangepts函数。
-
依据时间轴中的形变量获取各形变的空间范围 最后使用区域生长法依据时间轴中的形变量获取各形变的空间范围。区域生长法是一种基于区域的分割方法,可以使用Matlab中的函数实现,例如regiongrowing函数。
我们需要什么?
*_incl.txt: 激光雷达扫描的反射率数据文件。 *_meta.txt: 激光雷达扫描的元数据文件,包含了激光雷达的参数等信息。 *_trafomat.txt: 激光雷达扫描的位姿数据文件,包含了激光雷达的位置和方向等信息。 *.las 或 *.laz: 激光雷达扫描的点云数据文件,包含了激光雷达扫描的点云信息,格式为LAS或LAZ。
架构
. ├── ReadMe.md ├── data ├── main.m ├── processed_data └── scripts
- data/文件夹用于存储所有原始点云数据
- scripts/文件夹用于存储所有MATLAB脚本
- processed_data/文件夹用于存储所有中间结果和最终结果
- main.m文件为主程序,调用其他脚本实现整个流程
data
-
*_incl.txt: 存储了激光雷达的倾角信息。这些信息可以用于计算倾斜校正后的点云数据。具体使用方法取决于所用的倾斜校正算法,通常需要将这些信息与点云数据进行配准。 -
*_meta.txt: 存储了激光雷达的元数据信息,如激光雷达的型号、波长、扫描角度等。这些信息可以用于更精确的点云处理和分析。具体使用方法取决于所用的点云处理软件和算法,通常需要将这些信息导入到相应的工具中。 -
*_trafomat.txt: 存储了激光雷达的坐标变换信息,如平移和旋转矩阵。这些信息可以用于将点云数据从激光雷达坐标系转换到其他坐标系,如地面坐标系或车体坐标系。具体使用方法取决于所用的坐标变换算法和点云处理软件,通常需要将这些信息与点云数据进行配准。 -
*.laz: LAS格式的激光雷达点云数据文件。这是一种二进制格式,包含了点的三维坐标、强度、反射率等信息。可以使用各种点云处理软件和算法读取和处理这些文件。 -
Matlab tools: PointCloud、lasdata、lasinfo
-
在处理这些数据之前,需要先确定数据的坐标系、数据格式、坐标变换信息等,以便正确读取和处理数据。
scripts
- process_data.m: 用于处理原始点云数据的脚本。输入为原始点云数据,输出为处理后的点云数据。
- compute_deformation.m: 用于计算形变量的脚本。输入为原始点云数据和形变场网格,输出为形变量矩阵。
- detect_change_points.m: 用于检测变化点的脚本,并记录形变发生的时间。输入为形变量矩阵和形变场网格,输出为变化点矩阵。
- record_deformation_process.m: 用于记录形变过程的脚本。输入为变化点矩阵和形变场网格,输出为形变过程矩阵。
- detect_deformation_regions.m: 用于检测形变区域的脚本。输入为形变过程矩阵,输出为形变区域矩阵。
- visualize_results.m: 用于可视化结果的脚本。输入为原始点云数据、形变场网格、形变量矩阵、变化点矩阵、形变过程矩阵和形变区域矩阵,输出为可视化结果。
1. process_data.m
- 读取data/文件夹下的所有数据文件,包括*_incl.txt, *_meta.txt, *_trafomat.txt, *.laz等类型的文件,并对它们进行预处理,它们转换为标准格式的LAS文件。对所有LAS文件进行配准,生成配准后的点云文件。根据配准后的点云数据,生成形变场网格,并保存为MAT文件。
- 指定输入路径和输出路径,以及配准参数和形变场网格参数。
- 获取data/文件夹下所有需要处理的数据文件。
- 对每个LAS文件进行处理:
- 读取LAS文件。
- 对点云数据进行配准,并保存配准后的点云为LAS文件。
2. compute_deformation.m
该脚本首先将原始点云投影到形变场网格上,然后使用M3C2算法计算每个网格单元的形变量,并将结果保存在一个KxLxM矩阵中。具体而言,该脚本使用三重循环遍历形变场网格中的每个网格单元,并获取该网格单元内的点云数据。如果点云数据不为空,则将其与该网格单元进行配准,并使用M3C2算法计算形变量。
请注意,由于M3C2算法的计算复杂度较高,因此在处理大规模数据时,该脚本可能需要较长的运行时间。
3. detect_change_points.m
该脚本的作用是在形变量矩阵中检测形变点,并记录形变发生的时间。输入为形变量矩阵和形变量变化的阈值,输出为形变点的位置和形变发生的时间。
该脚本的实现流程如下:
- 设置默认的形变量变化阈值。
- 初始化形变点数组和时间数组。
- 计算形变量在时间维度上的一阶差分。
- 在每个网格点处判断形变量的一阶差分是否超过阈值,如果超过则认为该处是形变点。
- 记录形变点的位置和形变发生的时间。
- 输出形变点的位置和形变发生的时间。
该脚本可以与 compute_deformation.m 脚本配合使用,用于获取形变量矩阵后,进一步检测形变点,为后续的区域生长法提供依据。
4. record_deformation_process.m
该函数的功能是用于记录形变过程,输入为形变量矩阵和形变阈值,输出为形变过程矩阵。
具体实现过程如下:
- 获取形变量矩阵的维度
- 初始化形变过程矩阵
- 遍历形变量矩阵,对每个点进行判断
- 如果该点的形变量超过阈值,则表示发生形变,记录开始时间,并循环查找该形变过程的结束时间
- 将形变过程标记为2
- 最终输出形变过程矩阵
5. detect_deformation_regions.m
该函数的功能是用于检测形变区域,输入为形变过程矩阵和最小形变区域尺寸,输出为形变区域矩阵。
具体实现过程如下:
- 获取形变过程矩阵的维度
- 初始化形变区域矩阵
- 对每个z层进行处理
- 获取当前层的形变过程矩阵
- 对当前层的形变过程矩阵进行区域生长
- 获取当前层形变区域的数量
- 遍历当前层形变区域
- 获取当前区域的像素坐标
- 计算当前区域的像素数量
- 如果当前区域像素数量小于最小形变区域尺寸,则忽略
- 将当前区域的像素标记为当前区域编号
- 最终输出形变区域矩阵
6. visualize_results.m
该脚本的作用是对已处理的数据进行可视化展示。它首先读取processed_data文件夹中的所有配准后的LAS文件和对应的形变场网格,然后计算形变量矩阵、检测形变点、记录形变过程和检测形变区域。最后,它使用MATLAB的subplot函数将结果可视化为一个4个子图的图形,每个子图代表一个处理步骤的结果,分别为:原始点云、形变场、形变过程、形变区域。
具体来说,第一个子图展示的是原始点云的可视化结果,其中颜色代表点云的高度信息。
第二个子图展示的是生成的形变场的可视化结果,其中颜色代表形变量的大小,同时还可以看到形变场网格的形状。
第三个子图展示的是检测到的形变过程,其中红色箭头表示形变发生的时间和位置,黄色箭头表示形变结束的时间和位置。
最后一个子图展示的是检测到的形变区域,其中红色点云表示形变区域的中心点,蓝色点云表示形变区域的边缘点。同时还可以看到形变区域的空间范围。
main
- 调用process_data.m读取data/文件夹下的所有数据文件,包括*_incl.txt, *_meta.txt, *_trafomat.txt, *.laz等类型的文件,并对它们进行预处理,它们转换为标准格式的LAS文件。
- 导入LAS文件里的点云数据,并转换为pointCloud对象,建立形变场网格。
- 调用compute_deformation.m计算形变量,并将结果储存在results/deformation_values.mat中。
- 调用detect_change_points.m检测变化点,并将结果储存在results/change_points.mat中。
- 调用record_deformation_process.m记录形变过程,并将结果储存在results/deformation_process.mat中。
- 调用detect_deformation_regions.m检测形变区域,并将结果储存在results/deformation_regions.mat中。
- 调用visualize_results.m可视化结果。
首先调用process_data.m对原始数据进行预处理,然后读取processed_data文件夹中的所有LAS文件,生成形变场网格,计算形变量,检测变化点,记录形变过程,检测形变区域,并将每个步骤的结果存储到对应的MAT文件中。最后调用可视化函数visualize_results.m来显示结果。