当前位置:   article > 正文

Python-编写点云处理软件(一)打造属于你的点云可视化软件_python中使用vtk库进行点云可视化及颜色修改

python中使用vtk库进行点云可视化及颜色修改

0 简述

激光点云玩家们肯定都想拥有一个属于自己的点云可视化软件,本系列文章将逐步带你打造一个可执行点云处理程序。特别说明,本系列文章不会对点云处理算法做过多说明,如果需要了解该方面内容的小伙伴请移步至本栏目下的《Python点云处理》系列文章。Python点云处理系列文章【汇总指北】持续更新中
该系列文章主要从可视化及交互式点云处理方面展开

作为该系列的开篇,本文将主要介绍以下几点内容:VTK是什么?VTK如何可视化点云?PySide2是什么?如何将vtk点云窗口嵌入到pyside2中?以及最后如何打包成可执行程序?

1 VTK是什么?

在这里插入图片描述

Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。它的内核是用C++构建的,可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。
VTK跨平台、支持并行处理(VTK曾用于处理大小近乎1个Petabyte的资料,其平台为美国Los Alamos国家实验室所有的具1024个处理器之大型系统)的图形应用函式库。因此显示海量级点云理论上也不在话下。

简而言之,对于我们的用途来讲,vtk就是通过一个python第三方库形式展现和使用。
安装方法so easy,和大多数第三方库安装方式相同

  • 最简单的方法pip
pip install vtk
  • 1
  • 下载安装包

该方法对于老手比较友好,更稳定。首先下载和自己平台匹配的安装包下载(如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
  • 1

运行以下代码检测是否安装成功

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2 VTK如何可视化点云?

以下方法首先将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()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

在这里插入图片描述


3 PySide2是什么?

PySide2是一个Python模块,它提供了对Qt5.12+完整框架的访问,简单点说就是在Python下使用的Qt。使用PySide2既能开发出完美的界面,又能享受Python的便捷开发。与Qt的C++相比,使用PySide2能大大减少代码量。PySide2的这些优点,很适合团队规模不大,项目需要快速推进,需开发精美界面的场合。

  • PySide2和PyQt5

PySide2和PyQt5同样对应的Qt5框架,PyQt甚至要比PySide出现更早,社区更完备、中文文档更丰富。但是,值得注意的是:二者的许可证存在着差异。PyQt采用的是GPLv3许可证和需要购买版权的商业许可证发布的,该许可证允许开发专有应用程序,可以由开发者选择。GPLv3许可证,意味着用户使用PyQt就需要开源,闭源商用的,就需要承担相应的法律后果。

  • PySide2与PySide6

毋庸置疑,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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述


4 如何将vtk点云窗口嵌入到pyside2中?

通过以上内容我们能够创建一个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_())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

在这里插入图片描述
通过QVTKRenderWindowInteractor的方式就可以完美地把我们的点云显示窗口加入pyside2创建的应用程序当中了


5 如何打包成可执行程序?

当然,以上创建的应用程序并不美观,功能上也是写死的读取指定路径下的点云进行显示。后续文章会一步一步对此完善。
那么我们的应用程序怎么打包成windows系统下可执行程序EXE呢。

首先,需要安装一个名为pyinstaller的第三方库,安装方式同上。(除了这个库之外,也有很多其他打包库,如cx_Freeze、nuitka、wxpython等,各有优缺点)
接着,命令行下cd进入我们的py文件路径,运行:

pyinstaller -D -w ***.py

  • 1
  • 2

打包命令有很多配置参数,如配置图标icon、配置打包结果文件、配置反编译等等。

通过这样的方式我们就得到了一个可执行的exe程序


6 总结

本篇内容介绍了利用VTK+Pyside2,做出一个最简单的点云可视化程序,包括了程序完整编写和打包方式。然而,这样的应用程序远远达不到我们的想象和需要,本系列后面的文章将一步一步进行功能完善和美化,打造属于自己的点云可视化软件。


下一篇将实现一个简化的类cc界面。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/394149
推荐阅读
相关标签
  

闽ICP备14008679号