PyQt5+VTK环境搭建

2023-11-19

VTK 简介及安装

VTK 介绍

VTK(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk 是在面向对象原理的基础上设计和实现的,它的内核是用 C++ 构建的,包含有大约 250,000 行代码,2000 多个类,还包含有几个转换界面,因此也可以自由的通过 Java,Tcl/Tk 和 Python 各种语言使用 VTK。

VTK 是一个开放源码、自由获取的软件系统,全世界的数以千计的研究人员和开发人员用它来进行 3D 计算机图形,图像处理,可视化。VTK 包含一个 c++类库,众多的翻译接口层,包括 Tcl/Tk,Java,Python。 Visualization Toolkit 是一个用于可视化应用程序构造与运行的支撑环境,它是在三维函数库 OpenGL 的基础上采用面向对象的设计方法发展起来的,它将我们在可视化开发过程中会经常遇到的细节屏蔽起来,并将一些常用的算法封装起来。比如 Visualization Toolkit 将我们在表面重建中比较常见的 MarchingCubes 算法封装起来,以类的形式给我们以支持,这样我们在对三维规则点阵数据进行表面重建时就不必再重复编写 MarchingCubes 算法的代码,而直接使用 Visualization Toolkit 中已经提供的 vtkMarchingCubes 类。Visualization Toolkit 是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具。

VTK 在 Python 环境下安装

方法一 安装 anaconda,使用 conda install 安装:

注意不同版本的 Python 对应不同的命令。

适用于 python3

install -n envA -c menpo vtk=7 python=3

或者具体到某个版本:

conda install -n envB -c menpo vtk=7 python=3.5

适用于 python 2

conda install -n envC vtk python=2

适用于 3.6:

conda install -c clinicalgraphics vtk=7.1.0

以上的命令都可以不加版本号

方法二:镜像安装

由于国内的镜像里没有 vtk,所以直接用 conda 安装会非常慢,推荐下载 whl 文件后使用 pip 安装。

提供一个下载 VTK 的 whl 文件的网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#vtk

我是 win10 系统 64 位下,使用的 python3.7,下载的是:VTK‑8.1.2‑cp37‑cp37m‑win32.whl

然后进入下载目录,启动 cmd, window power shell 或者 git bash,输入命令: pip install VTK-7.1.1-cp36-cp36m-win_amd64.whl 完成安装。

安装完成后,在使用处导入vtk包即可。

检测安装成功

示例代码:

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(1.0, 1.0, 1.0)  
ren1.SetBackground2(0.1, 0.2, 0.4)
ren1.SetGradientBackground(1)

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren1)
renWin.SetSize(300, 300)
renWin.Render()

iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)

iren.Initialize()
iren.Start()

运行结果如图所示:
VTK显示效果

VTK简单示例

绘制立方体

#!/usr/bin/env python

# This is (almost) a direct C++ to Python transliteration of
# <VTK-root>/Examples/DataManipulation/Cxx/Cube.cxx from the VTK
# source distribution, which "shows how to manually create vtkPolyData"
#
# A convenience function, mkVtkIdList(), has been added and one if/else
# so the example also works in version 6 or later.
#
# Lines like `obj->Delete()` have been transliterated as `del obj` to,
# preserve the resemblance to the original C++ example, although I
# doubt this achieves anything beyond what Python's garbage collection
# would do anyway.

import vtk

# Makes a vtkIdList from a Python iterable. I'm kinda surprised that
# this is necessary, since I assumed that this kind of thing would
# have been built into the wrapper and happen transparently, but it
# seems not.


def mkVtkIdList(it):
    vil = vtk.vtkIdList()
    for i in it:
        vil.InsertNextId(int(i))
    return vil

# 绘制通用方法
def myShow(cube):
    # Now we'll look at it.
    cubeMapper = vtk.vtkPolyDataMapper()
    if vtk.VTK_MAJOR_VERSION <= 5:
        cubeMapper.SetInput(cube)
    else:
        cubeMapper.SetInputData(cube)
    cubeMapper.SetScalarRange(0, 7)
    cubeActor = vtk.vtkActor()
    cubeActor.SetMapper(cubeMapper)

    # The usual rendering stuff.
    camera = vtk.vtkCamera()
    camera.SetPosition(1, 1, 1)
    camera.SetFocalPoint(0, 0, 0)

    renderer = vtk.vtkRenderer()
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(renderer)

    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    renderer.AddActor(cubeActor)
    renderer.SetActiveCamera(camera)
    renderer.ResetCamera()
    renderer.SetBackground(0, 0, 0)
    renderer.SetBackground(1.0, 1.0, 1.0)
    renderer.SetBackground2(0.1, 0.2, 0.4)
    renderer.SetGradientBackground(1)

    renWin.SetSize(300, 300)

    # interact with data
    renWin.Render()
    iren.Start()
    del cubeMapper
    del cubeActor
    del camera
    del renderer
    del renWin
    del iren


def main():
    # x = array of 8 3-tuples of float representing the vertices of a cube:
    # 8个三维值代表长方体的8个顶点
    x = [(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (1.0, 1.0, 0.0), (0.0, 1.0, 0.0),
         (0.0, 0.0, 1.0), (1.0, 0.0, 1.0), (1.0, 1.0, 1.0), (0.0, 1.0, 1.0)]

    # pts = array of 6 4-tuples of vtkIdType (int) representing the faces
    #     of the cube in terms of the above vertices
    # 点的编号0-7,每个面由4个点组成
    pts = [(0, 1, 2, 3), (4, 5, 6, 7), (0, 1, 5, 4),
           (1, 2, 6, 5), (2, 3, 7, 6), (3, 0, 4, 7)]

    # We'll create the building blocks of polydata including data attributes.
    cube = vtk.vtkPolyData()
    points = vtk.vtkPoints()
    polys = vtk.vtkCellArray()
    scalars = vtk.vtkFloatArray()

    # Load the point, cell, and data attributes.
    for i in range(8):
        points.InsertPoint(i, x[i])
    for i in range(6):
        polys.InsertNextCell(mkVtkIdList(pts[i]))
    for i in range(8):
        scalars.InsertTuple1(i, i)

    # We now assign the pieces to the vtkPolyData.
    cube.SetPoints(points)
    del points
    cube.SetPolys(polys)
    del polys
    cube.GetPointData().SetScalars(scalars)
    del scalars

    myShow(cube)
    # Clean up
    del cube


main()

运行结果如图所示:
在这里插入图片描述

PyQt5中引入VTK渲染窗口

from PyQt5.QtWidgets import QApplication, QMainWindow
import sys
import vtk
from PyQt5 import QtCore, QtGui, QtWidgets
from vtk.qt.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor


class myMainWindow(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        QtWidgets.QMainWindow.__init__(self, parent)

        self.frame = QtWidgets.QFrame()

        self.vl = QtWidgets.QVBoxLayout()
        self.vtkWidget = QVTKRenderWindowInteractor(self.frame)
        self.vl.addWidget(self.vtkWidget)

        self.ren = vtk.vtkRenderer()
        self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
        self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()

        # Create source
        source = vtk.vtkConeSource()
        source.SetCenter(0, 0, 0)
        source.SetRadius(0.1)

        source1 = vtk.vtkSphereSource()
        source1.SetCenter(0, 0, 0)
        source1.SetRadius(0.3)

        # Create a mapper
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(source.GetOutputPort())

        mapper1 = vtk.vtkPolyDataMapper()
        mapper1.SetInputConnection(source1.GetOutputPort())

        # Create an actor
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)

        actor1 = vtk.vtkActor()
        actor1.SetMapper(mapper1)

        self.ren.AddActor(actor)
        self.ren.AddActor(actor1)

        self.ren.ResetCamera()

        self.frame.setLayout(self.vl)
        self.setCentralWidget(self.frame)

        self.show()
        self.iren.Initialize()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = myMainWindow()
    sys.exit(app.exec_())

运行结果:
在这里插入图片描述

PyQt5中使用VTK读取STL文件

# 部分代码,在PyQt主程序中以addWidget形式嵌入到主窗口中

    # 添加VTK显示窗读取STL文件===============================================
    self.vtkWidget = QVTKRenderWindowInteractor(self.centralwidget) # 提供平台独立的响应鼠标、键盘和时钟事件的交互机制
    self.verticalLayout_3.addWidget(self.vtkWidget)

    self.ren = vtk.vtkRenderer() # 负责管理场景的渲染过程
    self.ren.SetBackground(1.0, 1.0, 1.0) # 设置页面底部颜色值
    self.ren.SetBackground2(0.1, 0.2, 0.4) # 设置页面顶部颜色值
    self.ren.SetGradientBackground(1) # 开启渐变色背景设置

    self.vtkWidget.GetRenderWindow().AddRenderer(self.ren)
    self.iren = self.vtkWidget.GetRenderWindow().GetInteractor()
    # 交互器样式的一种,该样式下,用户是通过控制相机对物体作旋转、放大、缩小等操作
    style = vtk.vtkInteractorStyleTrackballCamera()
    self.iren.SetInteractorStyle(style)

    # Read from STL file
    stlreader = vtk.vtkSTLReader()
    stlreader.SetFileName("test.stl")

    # Read from OBJ file
    # objReader = vtk.vtkOBJReader()
	# objReader.SetFileName("test.obj")

    # Create a mapper
    mapper = vtk.vtkPolyDataMapper() # 渲染多边形几何数据
    mapper.SetInputConnection(stlreader.GetOutputPort()) 
    # VTK可视化管线的输入数据接口 ,对应的可视化管线输出数据的接口为GetOutputPort();
    # mapper.SetInputConnection(objReader.GetOutputPort())

    # Create an actor
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    # 设置生成几何图元的Mapper。即连接一个Actor到可视化管线的末端(可视化管线的末端就是Mapper)。

    self.ren.AddActor(actor)
    self.ren.ResetCamera()

    self.centralwidget.setLayout(self.verticalLayout_3)
    self.setCentralWidget(self.centralwidget)

    self.vtkWidget.show()
    self.iren.Initialize()

运行结果:
读取stl文件
读取obj文件

VTK支持的3D文件格式

VTK中可以导入/导出或读/写多种三维格式的文件,可以参考What 3D file formats can VTK import and export? The following table identifies the file formats that VTK can read and write. Importer and Exporter classes move full scene information into or out of VTK. Reader and Writer classes move just geometry.

File Format Read Write
3D Studio vtk3DSImporter
AVS “UCD” format vtkAVSucdReader
Movie BYU vtkBYUReader vtkBYUWriter
Renderman vtkRIBExporter
Open Inventor 2.0 vtkIVExporter/vtkIVWriter
CAD STL vtkSTLReader vtkSTLWriter
Fluent GAMBIT ASCII vtkGAMBITReader
Unigraphics Facet Files vtkUGFacetReader
Marching Cubes vtkMCubesReader vtkMCubesWriter
Wavefront OBJ vtkOBJExporter
VRML 2.0 vtkVRMLExporter
VTK Structured Grid † vtkStructuredGridReader vtkStructuredWriter
VTK Poly Data † vtkPolyDataReader vtkPolyDataWriter
PLOT3D vtkPLOT3DReader
CGM vtkCGMWriter
OBJ vtkOBJReader
Particle vtkParticleReader
PDB vtkPDBReader
PLY vtkPLYReader vtkPLYWriter
Gaussian vtkGaussianCubeReader
Facet vtkFacetReader vtkFacetWriter
XYZ vtkXYZMolReader
Ensight ‡ vtkGenericEnSightReader

本文作者: 旌旗
原文链接: https://seekzzh.site/pyqt5-vtk/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyQt5+VTK环境搭建 的相关文章

随机推荐

  • 【Mongodb教程 第五课 】MongoDB 删除集合

    drop 方法 MongoDB 的 db collection drop 是用来从数据库中删除一个集合 语法 drop 命令的基本语法如下 db COLLECTION NAME drop 示例 首先 检查可用的集合在数据库 mydb gt
  • 简单混合运算计算器

    实现一个能够进行简单混合运算的计算器 要求对混合运算的表达式进行先乘除后加减运算 其实现的效果如下图所示 小练习 GUI窗体 面向对象思路 代码 Expression类 package 计算器 import java util Linked
  • 使用R语言实现卷积神经网络cnn进行图像识别

    目录 1 卷积神经网络 CNN 简介 2 安装和加载必要的R包 3 加载和处理数据 4 构建CNN模型
  • 攻防 & 渗透 & Kali笔记(持续更新)

    0x00 写在前面 本来是记录kali用法的一篇文章 后来就慢慢变成了记录攻防 渗透测试 Kali用法的文章了 本来信息安全就涉及到方方面面就是个大杂烩 0x01 John the Ripper john爆破需要一个shadow文件 推荐使
  • Python-import导入上级目录文件

    假设有如下目录结构 dir0 file1 py file2 py dir3 file3 py dir4 file4 py dir0文件夹下有file1 py file2 py两个文件和dir3 dir4两个子文件夹 dir3中有file3
  • IDEA太强悍了!java初级工程师工资多少

    所以 我认为在你选择之前不妨好好想想什么是Java 你适不适合从事这份工作 Java开发是近20多年来最热门的编程语言 就业市场确实比较大 入门的难度也比C和C 要低 结合各方面来说 你选择Java是一定没有问题的 接下来就要好好想想自己适
  • 经典网络ResNet介绍

    经典网络ResNet Residual Networks 由Kaiming He等人于2015年提出 论文名为 Deep Residual Learning for Image Recognition 论文见 https arxiv org
  • 【githubshare】30 天精通 Git 版本管理,主要介绍 Git 的一些常用操作,以及日常工作中实际应用场景讲解

    GitHub 上一份开源的 Git 教程 30 天精通 Git 版本管理 主要介绍 Git 的一些常用操作 以及日常工作中实际应用场景讲解 GitHub github com doggy8088 Learn Git in 30 days 外
  • openssh升级

    openssh下载链接 https ftp openbsd org pub OpenBSD OpenSSH portable 查看ssh版本 ssh V OpenSSH 9 0p1 OpenSSL 1 0 2k fips 26 Jan 20
  • 列表标签使用

    列表标签分为有序列表和无序列表 什么时候使用列表标签 列表也是用来布局使用 它的自由度相对表格来说要大一点 但是它也是可以整齐排列 1 有序列表使用 ol li 苹果 li li 菠萝 li li 香蕉 li ol 2 无序列表 ul li
  • C++学习心得

    C 学习心得 一周的C 学习结束了 从C 的简介 各种专业术语的介绍到最后的标准模板库 对于这个c的加强版的语言有了一定的认识理解 但是由于6天时间学完了全部 而且由于疫情在家里上了两天网课 对于一些运用层次还不是很熟悉 学的重点放在了面向
  • 浅谈CSS中/deep/ >>> ::v-deep属性 进行样式穿透

    背景 在开发vue项目中 引入第三方ui组件库 只需要在当前页面修改第三方组件库的样式以做到不污染全局样式 通过在样式标签上使用 scoped 达到样式只制作用到本页面 但是此时再修改组件样式不起作用 scoped的作用及实现原理 作用 当
  • hook方法

    dl iterate phdr
  • 【Mysql】初探表连接的原理

    在我们的工作学习中肯定都用到过表连接的操作 不同连接写法在执行效率上会有不小的区别 要想写出高效的表连接语句 还是需要我们知晓表连接的原理 什么是连接 连接的本质就是要连接在一起的表中符合条件的结果集组合在一起 然后返回给用户的过程 准备
  • SSM实战开发:构建强大的Java Web应用

    SSM实战开发 构建强大的Java Web应用 本文介绍如何使用SSM框架 Spring SpringMVC MyBatis 进行实战开发 构建一个强大的Java Web应用 通过该实例 你将学会SSM框架的整合 配置和使用 以及常见的We
  • 数据标注工具大汇总

    图片 拉框 labelimg 已经安装 bbox label tool LabelBoundingBox Yolo mark FastAnnotationTool od annotation RectLabel cvat VoTT VIA
  • upload.addEventListener is not a function报错

    原因 Mock js重写了XMLHttpRequest 导致了原生XMLHttpRequest被mockjs覆盖找不到相应的方法 场景 vite plugin mock vue3 element UI upload组件 解决办法 更改配置项
  • centos7 pip3 安装python模块包报错解决

    centos7 pip3 安装python模块包报错 bash usr local bin pip3 usr local bin python3 6 坏的解释器 没有那个文件或目录 root localhost Python pip3 in
  • 关于蚁剑的安装和使用

    下载地址 加载器 https github com AntSwordProject AntSword Loader 核心源码 https github com AntSwordProject antSword 加载器中的是exe文件 因为源
  • PyQt5+VTK环境搭建

    PyQt5 VTK环境搭建 VTK 简介及安装 VTK 介绍 VTK 在 Python 环境下安装 方法一 安装 anaconda 使用 conda install 安装 适用于 python3 适用于 python 2 方法二 镜像安装