【Matlab/C】多时序激光雷达点云数据的形变监测

230 阅读9分钟

【Matlab/C】多时序激光雷达点云数据的形变监测

假如我有多组点云数据。

  1. 需要先建立一个形变场,以区域最大范围为水平面
  2. 以时间为Z轴,然后以第一组点云数据为基准用M3C2算法计算形变量并储存在时间轴中,在每一个平面格网处用变化点检测算法检测发生形变的开始时间
  3. 记录整个形变过程
  4. 用区域生长法依据时间轴中的形变量获取各形变的空间范围

常见环境搭建

  1. cloudCompare
  2. lasdata
  3. laszip

下载后设置环境变量的path

解释和任务的拆分

  1. 预处理点云数据 读取每组点云数据并进行必要的预处理,例如去除离群点和噪声等。将点云数据进行格式化并处理成可以用于后续计算的形式。

  2. 建立形变场 以区域最大范围为水平面,以时间为Z轴建立形变场。可以使用Matlab中的3D坐标轴或其他可视化工具来可视化形变场。

  3. 计算形变量 以第一组点云数据为基准,使用M3C2算法计算形变量。M3C2算法是一种非常常用的用于点云匹配和形变量计算的算法,可以使用Matlab中的Point Cloud Toolbox中的函数实现。

  4. 记录形变过程 在每一个平面格网处使用变化点检测算法检测形变的开始时间,并记录整个形变过程。变化点检测算法可以使用Matlab中的函数实现,例如findchangepts函数。

  5. 依据时间轴中的形变量获取各形变的空间范围 最后使用区域生长法依据时间轴中的形变量获取各形变的空间范围。区域生长法是一种基于区域的分割方法,可以使用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

  1. process_data.m: 用于处理原始点云数据的脚本。输入为原始点云数据,输出为处理后的点云数据。
  2. compute_deformation.m: 用于计算形变量的脚本。输入为原始点云数据和形变场网格,输出为形变量矩阵。
  3. detect_change_points.m: 用于检测变化点的脚本,并记录形变发生的时间。输入为形变量矩阵和形变场网格,输出为变化点矩阵。
  4. record_deformation_process.m: 用于记录形变过程的脚本。输入为变化点矩阵和形变场网格,输出为形变过程矩阵。
  5. detect_deformation_regions.m: 用于检测形变区域的脚本。输入为形变过程矩阵,输出为形变区域矩阵。
  6. 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

该脚本的作用是在形变量矩阵中检测形变点,并记录形变发生的时间。输入为形变量矩阵和形变量变化的阈值,输出为形变点的位置和形变发生的时间。

该脚本的实现流程如下:

  1. 设置默认的形变量变化阈值。
  2. 初始化形变点数组和时间数组。
  3. 计算形变量在时间维度上的一阶差分。
  4. 在每个网格点处判断形变量的一阶差分是否超过阈值,如果超过则认为该处是形变点。
  5. 记录形变点的位置和形变发生的时间。
  6. 输出形变点的位置和形变发生的时间。

该脚本可以与 compute_deformation.m 脚本配合使用,用于获取形变量矩阵后,进一步检测形变点,为后续的区域生长法提供依据。

4. record_deformation_process.m

该函数的功能是用于记录形变过程,输入为形变量矩阵和形变阈值,输出为形变过程矩阵。

具体实现过程如下:

  1. 获取形变量矩阵的维度
  2. 初始化形变过程矩阵
  3. 遍历形变量矩阵,对每个点进行判断
  4. 如果该点的形变量超过阈值,则表示发生形变,记录开始时间,并循环查找该形变过程的结束时间
  5. 将形变过程标记为2
  6. 最终输出形变过程矩阵

5. detect_deformation_regions.m

该函数的功能是用于检测形变区域,输入为形变过程矩阵和最小形变区域尺寸,输出为形变区域矩阵。

具体实现过程如下:

  1. 获取形变过程矩阵的维度
  2. 初始化形变区域矩阵
  3. 对每个z层进行处理
  4. 获取当前层的形变过程矩阵
  5. 对当前层的形变过程矩阵进行区域生长
  6. 获取当前层形变区域的数量
  7. 遍历当前层形变区域
  8. 获取当前区域的像素坐标
  9. 计算当前区域的像素数量
  10. 如果当前区域像素数量小于最小形变区域尺寸,则忽略
  11. 将当前区域的像素标记为当前区域编号
  12. 最终输出形变区域矩阵

6. visualize_results.m

该脚本的作用是对已处理的数据进行可视化展示。它首先读取processed_data文件夹中的所有配准后的LAS文件和对应的形变场网格,然后计算形变量矩阵、检测形变点、记录形变过程和检测形变区域。最后,它使用MATLAB的subplot函数将结果可视化为一个4个子图的图形,每个子图代表一个处理步骤的结果,分别为:原始点云、形变场、形变过程、形变区域。

具体来说,第一个子图展示的是原始点云的可视化结果,其中颜色代表点云的高度信息。

第二个子图展示的是生成的形变场的可视化结果,其中颜色代表形变量的大小,同时还可以看到形变场网格的形状。

第三个子图展示的是检测到的形变过程,其中红色箭头表示形变发生的时间和位置,黄色箭头表示形变结束的时间和位置。

最后一个子图展示的是检测到的形变区域,其中红色点云表示形变区域的中心点,蓝色点云表示形变区域的边缘点。同时还可以看到形变区域的空间范围。

main

  1. 调用process_data.m读取data/文件夹下的所有数据文件,包括*_incl.txt, *_meta.txt, *_trafomat.txt, *.laz等类型的文件,并对它们进行预处理,它们转换为标准格式的LAS文件。
  2. 导入LAS文件里的点云数据,并转换为pointCloud对象,建立形变场网格。
  3. 调用compute_deformation.m计算形变量,并将结果储存在results/deformation_values.mat中。
  4. 调用detect_change_points.m检测变化点,并将结果储存在results/change_points.mat中。
  5. 调用record_deformation_process.m记录形变过程,并将结果储存在results/deformation_process.mat中。
  6. 调用detect_deformation_regions.m检测形变区域,并将结果储存在results/deformation_regions.mat中。
  7. 调用visualize_results.m可视化结果。

首先调用process_data.m对原始数据进行预处理,然后读取processed_data文件夹中的所有LAS文件,生成形变场网格,计算形变量,检测变化点,记录形变过程,检测形变区域,并将每个步骤的结果存储到对应的MAT文件中。最后调用可视化函数visualize_results.m来显示结果。