Wolfram Mathematica 三维点云——读取点云

4 阅读3分钟

Wolfram-14.png

前言

在MMA中读取点云是一项不小的考验,尤其是处理文本类型格式存储格式,例如.csv,.xyz,使用传统Import函数读取太慢,因此很多人在第一步便被“劝退”。 但事实并非如此,如果你已经掌握一定的MMA基础,其实只需要你懂一点语法规则,就可以跟我一起走进更高阶的读取方式,而不是使用Import高级函数直接读取。

在开始分享前,需要简答介绍一下,二进制文件。

对于计算机来说,二进制是其直接处理的格式,就是一堆0和1的组合。引用其他人的说法:二进制文件不是直接由人类可读的字符组成,而是由许多的字节序列构成。每个字节对应计算机内存中的一个值,不经过任何编码转换。

因此,通常情况对于计算机来说二进制的读取更快,存储效率更高。


一、转换成二进制格式

对于csv格式的文件,可以利用Python进行快速的转换。利用Pandas和Numpy实现二进制格式的转换,且转换时间都是极快的。

  1. 三维点云最重要的就是x,y,z坐标,在Pandas库下,选取前三列(对应第一句运行代码);

  2. 随后,进行点云去重,一定程度上减少点云规模(对应第二句运行代码);

  3. 将读取后的csv格式转换二进制格式,设定转换前数据的所有格式为双精度(np.float64),一般情况32位精度足够。这一点需要与MMA中适配,MMA中支持的格式包括:{Real32,Real64,Real128},在后来MMA读取二进制文件时,需要与转换格式一一对应;

  4. data.tofile("test0.bin")语句将处理后的csv格式转换为二进制文件。

import pandas as pd
import numpy as np

df = pd.read_csv("example1.csv",usecols=[0, 1, 2])
#df = pd.read_csv("example1.csv",usecols=[0, 1, 2],dtype = np.float64)

df = df.dropna()   

data = df.values.astype(np.float64)

data.tofile("test0.bin")`

二、MMA中读取二进制

使用BinaryReadList函数能够读取二进制文件,"Real64"最好与上文转换的格式对应。

下列为转换 + 可视化代码,为了加速可视化,选择使用随机降采样到指定的点云数量。

data = BinaryReadList["D:\\分割\\test0.bin", "Real64"];
result = Partition[data,3];

pointCount = Length[result];

Print["读取点数:", pointCount];

sampledPoints = RandomSample[result, Round[pointCount*0.1]];

Print["随机采样后点数: ", Length[sampledPoints]];

(* 可视化 *)
Graphics3D[{PointSize[0.002], 
  Point[sampledPoints, 
   VertexColors -> (ColorData["DarkRainbow"] /@ 
      Rescale[sampledPoints[[All, 3]]])]}, Boxed -> True, 
 Lighting -> "Neutral"]

总结

为了更好的比较,选择使用Import读取csv文件与转换二进制读取两种方法,首先使用MMA中的RepeatedTiming函数,默认情况下,其输出的运行时间是五次运行时间的平均值。

下面是MMA中的运行时间比较,二进制读取相较传统读取,速度是其的70多倍,这会极大加速MMA加载点云的速度。 ​

​ ​

上图是两方法的效率对比,无论是在运行速度,还是存储大小,使用二进制文件都是远远优于直接使用Import读取csv文件。使用新方法极大扩展了MMA在点云领域处理的能力,也展示出广阔的使用场景。

以上就是本文全部内容,感谢观看