赞
踩
激光点云玩家们肯定都想拥有一个属于自己的点云可视化软件,本系列文章将逐步带你打造一个可执行点云处理程序。特别说明,本系列文章不会对点云处理算法做过多说明,如果需要了解该方面内容的小伙伴请移步至本栏目下的《Python点云处理》系列文章。Python点云处理系列文章【汇总指北】持续更新中
该系列文章主要从可视化及交互式点云处理方面展开
作为该系列的开篇,本文将主要介绍以下几点内容:VTK是什么?VTK如何可视化点云?PySide2是什么?如何将vtk点云窗口嵌入到pyside2中?以及最后如何打包成可执行程序?
Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。它的内核是用C++构建的,可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。
VTK跨平台、支持并行处理(VTK曾用于处理大小近乎1个Petabyte的资料,其平台为美国Los Alamos国家实验室所有的具1024个处理器之大型系统)的图形应用函式库。因此显示海量级点云理论上也不在话下。
简而言之,对于我们的用途来讲,vtk就是通过一个python第三方库形式展现和使用。
安装方法so easy,和大多数第三方库安装方式相同
pip install vtk
该方法对于老手比较友好,更稳定。首先下载和自己平台匹配的安装包下载(如VTK-8.2.0-cp38-cp38-win_amd64.whl),适配系统和python版本!
接着,如果你是用的诸如conda的虚拟python环境,那么需要先conda activate激活你需要安装vtk的环境。然后cd进入whl文件的存放路径:
pip install VTK‑8.2.0‑cp38‑cp38‑win_amd64.whl
运行以下代码检测是否安装成功
import vtk cone_a=vtk.vtkConeSource() coneMapper = vtk.vtkPolyDataMapper() coneMapper.SetInputConnection(cone_a.GetOutputPort()) coneActor = vtk.vtkActor() coneActor.SetMapper(coneMapper) ren1= vtk.vtkRenderer() ren1.AddActor( coneActor ) ren1.SetBackground( 0.1, 0.2, 0.4 ) renWin = vtk.vtkRenderWindow() renWin.AddRenderer( ren1 ) renWin.SetSize( 300, 300 ) renWin.Render() iren=vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) iren.Initialize() iren.Start()
以下方法首先将pcd格式的三维点云通过open3d库读取Python点云处理(一)点云数据读取与写入,转换为为numpy数组格式,然后调用numpy_to_vtk方法转为vtk可识别的数据类型。
import numpy as np import vtk from vtkmodules.util.numpy_support import numpy_to_vtk import open3d as o3d if __name__ == '__main__': # 读取点云 pcd = o3d.io.read_point_cloud("building.pcd") # 新建 vtkPoints 实例 points = vtk.vtkPoints() # 导入点数据 points.SetData(numpy_to_vtk(np.asarray(pcd.points))) # 新建 vtkPolyData 实例 polydata = vtk.vtkPolyData() # 设置点坐标 polydata.SetPoints(points) # 顶点相关的 filter vertex = vtk.vtkVertexGlyphFilter() vertex.SetInputData(polydata) # mapper 实例 mapper = vtk.vtkPolyDataMapper() # 关联 filter 输出 mapper.SetInputConnection(vertex.GetOutputPort()) # actor 实例 actor = vtk.vtkActor() # 关联 mapper actor.SetMapper(mapper) # 红色点显示 actor.GetProperty().SetColor(0, 1, 0) # Create a render window render = vtk.vtkRenderer() #colors = vtk.vtkNamedColors() # Insert Actor render.AddActor(actor) render.SetBackground(0, 0, 0) #render.SetBackground(colors.GetColor3d('RosyBrown')) # Renderer Window renderWindows = vtk.vtkRenderWindow() renderWindows.AddRenderer(render) renderWindows.SetSize(1200, 1200) renderWindows.SetWindowName('点云数据') # System Event iwin_render = vtk.vtkRenderWindowInteractor() iwin_render.SetRenderWindow(renderWindows) # Style iwin_render.SetInteractorStyle(vtk.vtkInteractorStyleMultiTouchCamera()) iwin_render.Initialize() #renderWindows.Render() iwin_render.Start()
PySide2是一个Python模块,它提供了对Qt5.12+完整框架的访问,简单点说就是在Python下使用的Qt。使用PySide2既能开发出完美的界面,又能享受Python的便捷开发。与Qt的C++相比,使用PySide2能大大减少代码量。PySide2的这些优点,很适合团队规模不大,项目需要快速推进,需开发精美界面的场合。
PySide2和PyQt5同样对应的Qt5框架,PyQt甚至要比PySide出现更早,社区更完备、中文文档更丰富。但是,值得注意的是:二者的许可证存在着差异。PyQt采用的是GPLv3许可证和需要购买版权的商业许可证发布的,该许可证允许开发专有应用程序,可以由开发者选择。GPLv3许可证,意味着用户使用PyQt就需要开源,闭源商用的,就需要承担相应的法律后果。
毋庸置疑,PySide6功能比PySide2更丰富一下。PySide6支持的是Qt6版本,而PySide2支持的是Qt5以下版本。但是,PySide6开发晚,部分模块不完善。本文基于PySide2。
安装方法与上述vtk安装基本一致,需要注意的仅是版本问题。
以hello word的方式带大家感受一下:
import sys
from PySide2.QtWidgets import QApplication, QLabel
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel("Hello World")
label.show()
sys.exit(app.exec_())
通过以上内容我们能够创建一个pyside2的窗口应用,也能利用vtk创建显示点云的窗口,那么如何将vtk显示点云的窗口嵌入到pyside2的控件中。下面这串代码示例将带大家了解:
import sys import numpy as np import vtk from vtkmodules.util.numpy_support import numpy_to_vtk from PySide2.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget from PySide2 import QtCore, QtGui, QtWidgets from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor import open3d as o3d class Mywindow(QMainWindow): def __init__(self): super(Mywindow, self).__init__() self.setWindowTitle('test_gui') self.setFixedSize(500, 500) # 设置布局 centralWidget = QWidget(self) centralWidget.setFixedSize(500, 500) self.Layout = QVBoxLayout(centralWidget) self.vtkWidget = QVTKRenderWindowInteractor(self) self.Layout.addWidget(self.vtkWidget) #self.vtkWidget.SetRenderWindow(visual.RenderWindow()) self.ren = vtk.vtkRenderer() self.vtkWidget.GetRenderWindow().AddRenderer(self.ren) self.iren = self.vtkWidget.GetRenderWindow().GetInteractor() # Create source pcd = o3d.io.read_point_cloud("building.pcd") # 新建 vtkPoints 实例 poins = vtk.vtkPoints() poins.SetData(numpy_to_vtk(np.asarray(pcd.points))) polydata = vtk.vtkPolyData() polydata.SetPoints(poins) glyphFilter = vtk.vtkVertexGlyphFilter() glyphFilter.SetInputData(polydata) glyphFilter.Update() dataMapper = vtk.vtkPolyDataMapper() dataMapper.SetInputConnection(glyphFilter.GetOutputPort()) # Create an actor actor = vtk.vtkActor() actor.SetMapper(dataMapper) actor1 = vtk.vtkActor() actor1.SetMapper(dataMapper) self.ren.AddActor(actor) self.ren.AddActor(actor1) self.ren.ResetCamera() self.show() self.iren.Initialize() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = Mywindow() window.show() sys.exit(app.exec_())
通过QVTKRenderWindowInteractor的方式就可以完美地把我们的点云显示窗口加入pyside2创建的应用程序当中了
当然,以上创建的应用程序并不美观,功能上也是写死的读取指定路径下的点云进行显示。后续文章会一步一步对此完善。
那么我们的应用程序怎么打包成windows系统下可执行程序EXE呢。
首先,需要安装一个名为pyinstaller的第三方库,安装方式同上。(除了这个库之外,也有很多其他打包库,如cx_Freeze、nuitka、wxpython等,各有优缺点)
接着,命令行下cd进入我们的py文件路径,运行:
pyinstaller -D -w ***.py
打包命令有很多配置参数,如配置图标icon、配置打包结果文件、配置反编译等等。
通过这样的方式我们就得到了一个可执行的exe程序
本篇内容介绍了利用VTK+Pyside2,做出一个最简单的点云可视化程序,包括了程序完整编写和打包方式。然而,这样的应用程序远远达不到我们的想象和需要,本系列后面的文章将一步一步进行功能完善和美化,打造属于自己的点云可视化软件。
下一篇将实现一个简化的类cc界面。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。