激光点云快速构建Delaunay三角网python
一般的Delaunay三角网构建算法效率很低,只适合于少量点(大约几千个点),这是因为三维Delaunay三角网如果使用数组来进行存储,存取和计算效率都会比较低,理想的办法是使用合适的三维模型,如kdtree、八叉树等三维模型或者是通过并行处理提高运算速度,scipy库中提供了Delaunay方法调用,可以快速的进行大量三维点Delaunay三角网的构建,然后使用mayavi.mlab进行渲染,效果较好。
使用库文件
pclpy:用于读取.pcd格式的激光点云数据,调用tolist函数返回list格式的点云坐标数据;
mayavi:mayavi的mlab模块提供了方便快捷的绘制三维图函数。只要把数据准备好,通常只需要调用一次mlab的函数就可以看到数据的三维显示效果。非常适合在IPython中交互式地使用。
scipy.spatial:对空间数据存储和组织构建高效的模型,如kdtree,通过并行处理提高三维空间数据的运算速度,
Delaunay:构建Delaunay三角网
完整代码
from scipy.spatial import delaunay_plot_2d
from scipy.spatial import Delaunay
import numpy as np
import pclpy
from pclpy import pcl
from mayavi import mlab
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 读
pc = pclpy.pcl.PointCloud.PointXYZ()
pcl.io.loadPCDFile('./data/DataSample.pcd', pc)
xyz_points = pc.xyz.tolist()
xy_points = pc.xyz[:,0:2].tolist()
tri = Delaunay(xy_points)
mlab.triangular_mesh(pc.x, pc.y, pc.z, tri.simplices)
mlab.show()
构建结果
这里我们使用600+w个点进行Delaunay三角网构建,耗时大约为30s,电脑内存为16G,效果如下。
思考总结
三维空间数据的存储、组织与管理直接关系到空间运算的效率和精度,现有的三维可视化不能够很好地展现三维实体在多个层次上的细节特征,这也是三维可视化研究的热点方向。造成这种状况的一个重要原因是二维数据结构向三维数据结构扩展的复杂性,不少学者认为开发三维GIS平台的技术关键和瓶颈可能就在于找到合适的三维数据结构,以实现三维空间数据的便捷存储、展示和分析,因此研究者们对可能的三维数据结构进行了大量的探索,这些三维数据结构大致可以分为基于面的三维数据结构和基于体的三维数据结构。基于面的三维数据结构包括栅格结构、不规则三角网结构、边界表示结构和参数方程式结构,基于面的三维数据结构具有精度高、显示美观和更新便捷的优点,但是由于存储关系数据的困难,导致难以进行三维空间分析;基于体的结构包括3D栅格、八叉树结构、实体结构几何和四面体等结构,其优点是便于表示空间体的整体分布状况,这一存储方式解决了基于面结构中空间操作和空间分析困难的问题,但是在存储空间和计算速度等方面存在着有不足之处。