#tls #lidar #image #2d #transform #quick #inspection

app tls_3d_to_2d

将汉克三维地形激光扫描数据(TLS)转换为2D图像以便快速检查

4个版本 (2个破坏性版本)

0.3.0 2019年11月14日
0.2.0 2019年11月8日
0.1.1 2019年11月8日
0.1.0 2019年11月8日

#401 in 科学

MIT许可证

660KB
331

tls_3d_to_2d

将汉克地面激光扫描二进制极坐标格式转换为2D图像以便快速检查的命令行工具。

描述

此工具将投影3D TLS极点格式到2D格式。投影将点云视为围绕传感器的大约球形,并将其投影到圆柱体上,就像墨卡托投影一样。因此,计算x和y的方程式为

x equation

y equation

其中

  • W: 投影图像宽度
  • Phi: 角度方位角
  • Theta: 角度仰角

从这些方程中,我们可以将坐标x和y投影到一个网格图像中,像素值将对应于该单元格所属所有像素的平均反射率值。

用法

基本

tls_3d_to_2d -z 35 -Z 125 -d 0 -D 40 --output output.png input_file.bin

它将从传感器0到40米的水平距离以及从35到125度的仰角投影云点。如果最小仰角为0度,则会导致cot(0度)的计算,这是无穷大,从而使程序崩溃。

多帧

我们可以用它从多个帧中生成一个视频,通过点云从一个距离走到另一个距离。用法是

tls_3d_to_2d -z 35 -Z 125 --mult-frames 120 --mult-dist-from 0 --mult-dist-to 30 --sigma 1 --mult-range-view 8 --output output.png input_file.bin

它将输出120帧(--mult-frames 120),从0(--mult_dist_from 0)到30(--mult_dist_to 30)的距离行走,使用高斯平滑因子sigma为1(--sigma 1)和8米的可见范围(--mult-range-view 8)。算法将

  1. 对于 i 在0到30之间,分成120部分
    1. i 为中距离
    2. 计算最小距离: i - (range_view/2)
    3. 计算最大距离: i + (range_view/2)
    4. 将最小和最大距离之间的点投影到2D
    5. 通过水平距离进行高斯平滑:均值 = i,sigma 由 --sigma 或 -s 选项 定义
    6. 创建图像为 OUTPUT_NAME.{n}.png,其中 {n} 将被替换为每个步骤从0到119的数字。

除了灰度以外的着色

您应该能够使用类似 ImageMagick 的工具将灰度 PNG 输出格式转换为伪彩色。命令行可能如下所示

convert {INPUT_FILE} -normalize ( xc:black xc:red xc:yellow xc:blue +append -filter Cubic -resize 600x1! ) -clut {OUTPUT_FILE} 

这将把 {INPUT_FILE} 的灰度转换为黑→红→黄→蓝的刻度。但如果您这样做,请注意实际上不要将高斯应用于灰度图像,而应使用 --split-S 标志将输出图像分为 reflectance 部分和 gaussian_weigths 之间,文件应命名为 {OUTPUT_FILE}.{n}.png(反射数据)和 {OUTPUT_FILE}.{n}.g.png(高斯权重)。然后您可以先像之前解释的那样将伪彩色应用于反射数据,然后使用类似

convert {INPUT_REFLECTANCE_FALSE_COLOR_FILE} {INPUT_GAUSSIAN_WEIGHTS} -compose multiply -layers flatten {OUTPUT_FILE}

创建视频文件

有许多将顺序图像转换为视频文件的方法,我使用了 ffmpeg,以下是其命令行

ffmpeg -start_number 0 -i {INPUT_IMAGE_PATTERN} -c:v libx264 -vf "fps=23,format=yuv420p,pad=width=ceil(iw/2)*2:height=ceil(ih/2)*2" {OUTPUT.mp4}

奇怪的 pad=width=ceil(iw/2)*2:height=ceil(ih/2)*2 将处理奇数高度和宽度,否则可能会失败。{INPUT_IMAGE_PATTERN} 应该类似于 images_%3d.png,这将匹配前缀为 images_ + 三个数字 + .png 的文件。

注意

这是一个命令行工具,它可以接受多个文件,并将并行运行。

示例

$ cargo install tls_3d_to_2d
$ tls_3d_to_2d --help
3d-to-2d 0.3.0

USAGE:
    tls_3d_to_2d [FLAGS] [OPTIONS] --output <output> [file]...

FLAGS:
    -h, --help        Prints help information
    -p, --progress
    -S, --split       Save splitted gauss weights and reflectance images (see README)
        --version     Prints version information

OPTIONS:
    -D, --dist-max <dist-max>                  Maximum distance [default: 20.0]
    -d, --dist-min <dist-min>                  Minimum distance [default: 0.0]
    -f, --mult-dist-from <mult-dist-from>      From distance (multiple images, see readme) [default: -1.0]
    -F, --mult-dist-to <mult-dist-to>          To distance (multiple images, see README) [default: -1.0]
    -t, --mult-frames <mult-frames>            Total frames (multiple images, see README) [default: 120]
    -V, --mult-range-view <mult-range-view>    Range view (multiple images, see README) [default: 6.0]
    -n, --n-threads <n-threads>                Number of threads to run multiple files in parallel [default: 0]
    -o, --output <output>                      Output file name
    -s, --sigma <sigma>                        Sigma gaussian smoothing factor from range center [default: 0.0]
    -w, --width <width>                        Azimuth pixel resolution [default: 1800]
    -Z, --zen-max <zen-max>                    Maximum zenith [default: 120.0]
    -z, --zen-min <zen-min>                    Minimum zenith [default: 30.0]

ARGS:
    <file>...    Input file list space separated

输出示例

output sample image

Output sample video

依赖项

~8–17MB
~201K SLoC