python+VTK环境搭建:安装及用PyQt5创建一个包含三维模型的交互窗口

2023-11-17

#一、VTK简介及安装
##1.1 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 是给从事可视化应用程序开发工作的研究人员提供直接的技术支持的一个强大的可视化开发工具。

##1.2 VTK在Python环境下安装
方法一(未亲手实践)、安装anaconda,使用conda install安装:
注意不同版本的Python对应不同的命令。
1)适用于python3(3.6以下)
install -n envA -c menpo vtk=7 python=3
or if you want to be more specific:
conda install -n envB -c menpo vtk=7 python=3.5
2)适用于python 2 (不过最近好多库都声明不支持python2了)
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

我是win7系统64位下,使用的python3.5,下载的是:
VTK 7.1.1 cp35 cp35m win_amd64.whl
然后进入下载目录,启动cmd或者window power shell,输入命令: pip install VTK-7.1.1-cp36-cp36m-win_amd64.whl完成安装。

安装完成后,检测是否安装成功,在spyder里输入
import vtk
这里提供一个检测的小代码:

1.	import vtk    
2.	    
3.	cone_a=vtk.vtkConeSource()    
4.	    
5.	coneMapper = vtk.vtkPolyDataMapper()    
6.	coneMapper.SetInputConnection(cone_a.GetOutputPort())    
7.	    
8.	coneActor = vtk.vtkActor()    
9.	coneActor.SetMapper(coneMapper)    
10.	    
11.	    
12.	ren1= vtk.vtkRenderer()    
13.	ren1.AddActor( coneActor )    
14.	ren1.SetBackground( 0.1, 0.2, 0.4 )    
15.	    
16.	renWin = vtk.vtkRenderWindow()    
17.	renWin.AddRenderer( ren1 )    
18.	renWin.SetSize( 300, 300 )    
19.	renWin.Render()    
20.	    
21.	iren=vtk.vtkRenderWindowInteractor()    
22.	iren.SetRenderWindow(renWin)    
23.	    
24.	iren.Initialize()    
25.	iren.Start()

运行结果如下图:
这里写图片描述

#二、创建包含三维模型窗口的对话框

- 2.1 创建一个对话框

参考我的另外一篇博客,利用PyQt5创建一个对话框。

- 2.2 对话框中加入渲染窗口及三维模型

   当上述对话框搭建好以后,可以输入下面的测试代码进行实验,会得到一个包含渲染窗口的对话框如下,并且可以用鼠标对三维模型进行简单的操作:
这里写图片描述

  PyQt4版本使用以下代码:

#!/usr/bin/env python
import sys
import vtk
from vtk.qt4.QVTKRenderWindowInteractor import QVTKRenderWindowInteractor
from PyQt4 import Qt
from PyQt4 import QtGui, QtCore
class test(Qt.QMainWindow):
"""Test class"""
def __init__(self, parent=None):
	Qt.QMainWindow.__init__(self, parent)
	self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
	self.setAttribute(QtCore.Qt.WA_TranslucentBackground, True)
        self.setWindowTitle(self.tr("PyQt4 VTK test"))
        self.workspace = Qt.QWorkspace()
        self.setCentralWidget(self.workspace)
        self.frame = QtGui.QFrame(self.workspace)
        self.hbox = QtGui.QHBoxLayout()
        # create the widget
	self.widget = QVTKRenderWindowInteractor(self.frame)
        self.widget.Initialize()
        self.widget.Start()
        # if you dont want the 'q' key to exit comment this.
        self.widget.AddObserver("ExitEvent", lambda o, e, a=app: a.quit())
        self.cone = vtk.vtkConeSource()
        self.cone.SetResolution(8)
        self.coneMapper = vtk.vtkPolyDataMapper()
        self.coneMapper.SetInput(self.cone.GetOutput())
        self.coneActor = vtk.vtkActor()
	self.ren.AddActor(self.coneActor)
        self.renWin=self.widget.GetRenderWindow()
        self.renWin.AddRenderer(self.ren)
        self.hbox.addWidget(self.widget)
        self.frame.setLayout(self.hbox)
        self.workspace.addWindow(self.frame)
if __name__ == "__main__":
    app = Qt.QApplication(sys.argv)
    mainwindow = test()
    mainwindow.show()
    sys.exit(app.exec_())

  若是PyQt5版本则使用以下代码(已经经过验证):

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.5)

        # 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()

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
if __name__ == "__main__":
    app = QApplication(sys.argv)

    window = myMainWindow()

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

python+VTK环境搭建:安装及用PyQt5创建一个包含三维模型的交互窗口 的相关文章

随机推荐

  • WPF中Datagrid其中一列使用图片显示

    实现效果 实现遇到的问题 当时想要实现如图所示 合格率 所示的效果 我的第一个想法就是使用wpf的转换器 可是接下来问题来了 我这个是通过数值来判断是否合格 什么控件可以做到既可以绑定图片类型的 又可以绑定数值类型的 还有此时的当值绑定肯定
  • 段、页、页框、页表、页表项

    段 页 页框 页表 页表项 分页式虚拟内存 页 页框 页表 页表项 段页式虚拟内存 分段 分页 段 段表 段表项 页 页框 页表 页表项 分页式虚拟内存 页 页框 页表 页表项 页 进程中的块 进程被分成许多大小相同的块 页号 页框 内存中
  • TS2769: Property 'xxx' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttribute...

    用TypeScript开发React项目 在父子组件间传值时发生错误提示 class Page extends React Component render return div div
  • vue组件利用css var(--变量)实现动态修改伪类属性(::before、::after)

    如图所示 1 我们可以利用此属性实现vue组件动态传值 修改例如 before after等 伪类的背景色 背景图等属性值 因为vue利用无法直接在css中使用data里的变量 利用var 变量名 以及style中定义变量 其实此步是模仿
  • Coordinate attention,SE,CBAM

    1 SE 因为普通卷积难以建模信道关系 SE考虑通道的相互依赖关系增强模型对信息通道的敏感性 同时全局平均池化可以帮助模型捕获全局信息 然而SE只考虑了内部通道信息而忽略了位置信息的重要性 输入X首先经过全局平均池化 然后经过全连接层来捕获
  • 静态类和动态类的区别和使用

    1 静态类中的静态方法可以通过类名直接调用静态方法 不需要实例化对象 但是无法和Spring容器中的bean进行交互 例如 Slf4j public class ExcelUtil public static
  • 动态链接

    动态链接 命令 gcc static 产生静态库 shared 产生共享库 readelf d 查看 dynamic段的内容 ldd 查看一个程序主模块或一个共享库依赖于哪些共享库 一 静态链接和动态链接的优缺点 静态链接 空间的浪费 静态
  • Arduino结合HX711实现8路信号采集称重

    说明 使用两块Arduino实现8路Sensor同时采集 并输出控制信号 写作目的主要是为了作为学习笔记 Arduino Sensor接线图 1 双机通讯连线图 2 HX711和Sensor的连线图 3 将8个Sensor的SCK全部接到r
  • 键盘输入_bp

    依据惯例 仍然感谢出处 来自程序员的暴击 https space bilibili com 128373173 学习了下 这个说了个什么呢 人到达灯附近 显示提示文字 按F键开灯和关灯切换 远离灯时 提示文字消失 不能切换灯的切换开关状态
  • QT编译报错无法解析的外部符号

    QT编译报错无法解析的外部符号 特征 头文件 有几个槽函数 提示有多少个无法解析的外部符号 注释掉宏Q OBJECT 可以编译通过 可能原因 1 对应的cpp文件没有加入项目中 2 cpp文件 右键属性 为 自定义工具 没有进行编译 修改为
  • 华为、华三、锐捷、飞塔、山石的抓包命令

    一 华为的抓包命令 1 基本概念 华为的抓包行为称之为镜像端口 也就是说将需要抓取的接口上 称为镜像端口 的流量复制一份到另一个接口上 工程师进行流量观察的端口 称为观察端口 如下图所示 2 华为镜像端口分类 1 本地镜像端口 也就是观察端
  • Django框架:优缺点、实用场景及与Flask、FastAPI的对比

    Django是一个使用Python语言编写的高级Web框架 它提供了快速开发 可重用和可维护的Web应用程序所需的一切组件 在本文中 我们将探讨Django的get和post请求 优缺点 实用场景以及与Flask FastAPI的对比 Dj
  • windows中如何将收藏夹里的下载链接加入到开始

    windows中如何将收藏夹里的下载链接加入到开始 以windows 7为例 设置方法如下 1 右击工具栏 属性 2 开始菜单 自定义 下拉至下载 点中显示为链接 确定 3 可以看到 下载已经看到了
  • C# 泛型详解(泛型类,方法,接口,委托,约束,反射 )

    目录 一 什么是泛型 二 为什么要用泛型 三 泛型和Object类型的区别 四 泛型类 五 泛型方法 六 泛型接口 七 泛型委托 八 泛型约束 九 泛型配合反射 结束 一 什么是泛型 先看一段介绍 泛型 Generic 是将不确定的类型预先
  • 天梯题集——多项式A除以B(多项式除法,递归与循环的效率比较)

    多项式A除以B 多项式除法 这里就不展开介绍多项式除法 只需将多项式看成一个整体就类似于整数除法 x3 1 x 1 x2 x 1 多项式除法的演示图 解题思路 模拟 A B 多项式除法 方案一 递归 include
  • 抗渗等级p6是什么意思_混凝土p6是什么意思

    展开全部 40是混凝土的强度等62616964757a686964616fe58685e5aeb931333431356664级 P6是抗渗混凝土按抗渗压力 抗渗混凝土按抗渗压力不同分为P6 P8 P10 P12和大于P12共5个等级 抗渗
  • 面试题目搜集(5)

    本博客的 面试题目搜集系列不错 1 面试题目搜集1 2 面试题目搜集2 3 面试题目搜集3 4 面试题目搜集4 5 面试题目搜集5 6 面试题目搜集6 1 反着打印链表 递归实现 include
  • 详解pytorch之tensor的拼接

    tensor经常需要进行拼接 拆分与调换维度 比如通道拼接 比如通道调至最后一个维度等 本文的目的是详细讨论一下具体是怎么拼接的 如果本来就理解这其中的原理的童鞋就不用往下看了 肯定觉得啰嗦了 拼接即两个tensor按某一维度进行拼接 分两
  • Android App内存泄漏原理、检测及修改方案

    目录 JVM工作原理 运行时数据区 垃圾回收 Garbage Collection 如何判断对象为垃圾对象 垃圾回收算法 四种引用类型 什么是内存泄露 为什么会有内存泄露 Android 中导致内存泄漏的常见场景 检查策略 实例分析 内部类
  • python+VTK环境搭建:安装及用PyQt5创建一个包含三维模型的交互窗口

    一 VTK简介及安装 1 1 VTK介绍 Vtk visualization toolkit 是一个开源的免费软件系统 主要用于三维计算机图形学 图像处理和可视化 Vtk是在面向对象原理的基础上设计和实现的 它的内核是用C 构建的 包含有大