Python+VTK实现激光点云数据可视化学习 2021.7.12
1、激光点云与VTK简介
????????近年来,由于三维激光扫描仪等光学传感器硬件设备的进步,三维激光扫描正在从低精度(厘米级)获取向高精度(毫米级)获取,从几何与强度的采集走向几何与多/高光谱协同采集。相比国外,国内激光扫描硬件起步晚且仍有较大差距。此外,便携式/背包式/无人机为平台的轻小型三维激光扫描装备正蓬勃发展。 ????????三维激光扫描技术能够采集三维物体的表面信息,进而可重建三维物体表面,这种测量方式具有非接触、精度高、快速自动化等特点。随之而来的数据处理软件日益出现三维激光扫描技术得到了快速的发展, ????????在三维点云数据处理软件方面,商业化的软件主要有TerraSolid 公司的TerraSolid、Trimble公 司 的RealWorks、Leica 公 司 的 Cyclone、Bentley公 司 的PointTools、OrbitGT 公 司 的OrbitMobileMapping等,以 及 国 内 科 研 院 所 和公司开发的一些工具软件。三维激光扫描已成为高时空分辨率三维对地观测的一种重要手段。由于激光扫描所获得的数据为坐标点数据(通常包含三维坐标x、y、z)和反射强度信息,采集的三维激光点云数据需要进行可视化显示,经过语义分割后的三维激光扫描点云数据在三维模型重建、自动驾驶与高精度地图、文化遗产数字化保护、工业产品检测、形变监测、智慧城市、森林资源调查、虚拟VR/增强现实AR等方面具有重要的应用价值。
????????现有的三维可视化开发工具主要有 OpenGL、DirectX、VTK 等,其中 VTK 是由美国 Kitware 公司负责维护,在医学、能源、地质等领域颇受重用。VTK 在OpenGL 基础上用 C+ + 语言开发而成,采用面向对象设计,并含有对 Python,Java,Tcl 等语言的接口。独一无二的可视化管道设计: VTK 与 OpenGL,OSG 等其他三维可视化开发工具的主要区别就在于VTK 采用管道式设计( Pipeline) 实现三维显示。绘制器对象Renderer、绘制窗口Render Window、交互器对象Interactor、交互方式Interactor Style以及相机对象Camera、光照对象Light共同构成了绘制环境, 其中绘制器对象设置Camera、Light和背景, Render Window指定关联的父窗口, 并在绘制环境创建完成后开始VTK消息循环。VTK开发文档 和用户指导、Python使用VTK三维3D图形绘制入门教程、VTK官网实例
VTK编程步骤
2、配置Python环境(Conda+PyCharm+Python3.6+VTK)
????????第一步,电脑首先安装好Conda,打开Anaconda Prompt(Anaconda3)命令行窗口,然后通过输入命令在Conda中创建虚拟环境myenv,之后在myenv虚拟环境中安装Python 3.6后,利用包管理工具pip通过输入pip install 包名 来安装所需的外部依赖包numpy、vtk
Anaconda
pip install numpy
pip install vtk
????????第二步,直接安装PyCharm即可。
PyCharm
3、点云数据(大约60万个点,这里只放了部分数据)
4、编写Python代码
????????打开PyCharm,新建一个项目并输入项目名称,之后选择Python编译器为所创建虚拟环境myenv 下的python.exe,然后在项目中新建python文件,取名为tetris.py ,并输入以下代码即可。
import numpy
import vtk
from vtkmodules.util.numpy_support import numpy_to_vtk
if __name__ == '__main__':
source_data = numpy.loadtxt("Pointdata.txt")
points = vtk.vtkPoints()
points.SetData(numpy_to_vtk(source_data))
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
vertex = vtk.vtkVertexGlyphFilter()
vertex.SetInputData(polydata)
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(vertex.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor.GetProperty().SetColor(0, 1, 0)
render = vtk.vtkRenderer()
render.AddActor(actor)
render.SetBackground(0, 0, 0)
renderWindows = vtk.vtkRenderWindow()
renderWindows.AddRenderer(render)
renderWindows.SetSize(1200, 1200)
renderWindows.SetWindowName('点云数据')
iwin_render = vtk.vtkRenderWindowInteractor()
iwin_render.SetRenderWindow(renderWindows)
iwin_render.SetInteractorStyle(vtk.vtkInteractorStyleMultiTouchCamera())
iwin_render.Initialize()
iwin_render.Start()
5、点云可视化运行结果
????????在PyCharm项目中tetris.py代码的空白处右键选择Run tetris,运行结果如下,可以看到所有的激光点数据,通过鼠标滚轮可实现缩放、鼠标左键上下移动实现前后左右翻转。 ????????在人工智能、深度学习等先进技术的驱动下,点云数据的特征描述、语义理解、关系表达、目标语义模型、多维可视化有望实现自动化、智能化的快速发展,同时在测绘地理信息行业中,除了矢量、栅格模型外,激光点云这种新的模型也能够提升地物目标认知与自动化提取和知识化服务的能力。
|