Python VTK映射三维模型表面距离

数据准备: 需要准备两个stl文件、Python需要安装vtk库

步骤一:数据读取 首先通过vtk.vtkSTLReader() 定义stl文件读取接口,再通过reader1.GetOutput() 就可以获得stl在vtk工作流的数据。

步骤二:去除重复点 通过vtk.vtkCleanPolyData() 可以去除模型中的重复点

步骤三:计算距离 使用 vtk.vtkDistancePolyDataFilter() ,使用上一步中过滤掉重复点后的数据作为输入。如distanceFilter.SetInputConnection(1, clean1.GetOutputPort()), 其中第一个参数就是输入数据的标号,从0开始计数;第二个参数就是输入的数据。我们将vtkDistancePolyDataFilter的输出到mapper就完成距离映射了。

步骤四:颜色配置 lut = vtk.vtkLookupTable() 相当于一个调色盘函数,通过对其参数改变可以,调整最终映射的颜色范围。 scalarBar = vtk.vtkScalarBarActor() 就是颜色条,按照前面的调色盘的结果将距离数值映射成颜色。

import vtk

input1 = vtk.vtkPolyData()
reader1 = vtk.vtkSTLReader()
reader1.SetFileName('model1.stl')
reader1.Update()
input1 = reader1.GetOutput()  # 读取模型A

input2 = vtk.vtkPolyData()
reader2 = vtk.vtkSTLReader()
reader2.SetFileName('model2.stl')
reader2.Update()
input2 = reader2.GetOutput()  # 读取模型B

# 数据合并,可以合并显示两个模型
clean1 = vtk.vtkCleanPolyData()
clean1.SetInputData(input1)

clean2 = vtk.vtkCleanPolyData()
clean2.SetInputData(input2)

distanceFilter = vtk.vtkDistancePolyDataFilter()

distanceFilter.SetInputConnection(1, clean1.GetOutputPort())
distanceFilter.SetInputConnection(0, clean2.GetOutputPort())
distanceFilter.SignedDistanceOff()
distanceFilter.Update()  # 计算距离
distanceFilter.GetOutputPort()
mapper = vtk.vtkPolyDataMapper()  # 配置mapper
mapper.SetInputConnection(distanceFilter.GetOutputPort())
mapper.SetScalarRange(  # 设置颜色映射范围
    distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[0],
    distanceFilter.GetOutput().GetPointData().GetScalars().GetRange()[1])
actor = vtk.vtkActor()
actor.SetMapper(mapper)
actor1 = vtk.vtkActor()
actor1.SetMapper(mapper)
lut = vtk.vtkLookupTable()
lut.SetHueRange(0.2, 0.7)  # 映射的颜色变换参数(自己调颜色)
# lut.SetAlphaRange(1.0, 1.0)
# lut.SetValueRange(1.0, 1.0)
# lut.SetSaturationRange(1.0, 1.0)
# lut.SetNumberOfTableValues(256)
mapper.SetLookupTable(lut)
mapper2 = vtk.vtkPolyDataMapper()
mapper2.SetInputData((distanceFilter.GetSecondDistanceOutput()))
mapper2.SetScalarRange(  # 设置颜色映射范围
    distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[0],
    distanceFilter.GetSecondDistanceOutput().GetPointData().GetScalars().GetRange()[1])

actor2 = vtk.vtkActor()
actor2.SetMapper(mapper2)

scalarBar = vtk.vtkScalarBarActor()  # 设置color_bar
scalarBar.SetLookupTable(mapper.GetLookupTable())
scalarBar.SetTitle("SD(mm)")
scalarBar.SetNumberOfLabels(5)  # 设置要显示的刻度标签数。自己设定色带的位置
scalarBar.SetMaximumNumberOfColors(10)
# scalarBar.GetPositionCoordinate().SetCoordinateSystemToNormalizedViewport()
# scalarBar.GetPositionCoordinate().SetValue(0.01, 0.49)  # 参数越小越靠左,第二个参数越大越往上
# scalarBar.SetWidth(0.16)
# scalarBar.SetHeight(0.5)
# scalarBar.SetTextPositionToPrecedeScalarBar()  # 标题和刻度标记是否应在标量栏之前(文字会出现在条形左边)
# # 设置标题和条形之间的边距
# scalarBar.SetVerticalTitleSeparation(10)
# # 设置标题颜色
scalarBar.DrawTickLabelsOn()
scalarBar.GetTitleTextProperty().SetColor(0, 0, 0)
scalarBar.GetLabelTextProperty().SetColor(0, 0, 0)
arender = vtk.vtkRenderer()
arender.SetViewport(0, 0.0, 1, 1.0)
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(arender)
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
style = vtk.vtkInteractorStyleTrackballActor()
iren.SetInteractorStyle(style)
aCamera = vtk.vtkCamera()
aCamera.SetViewUp(0, 0, -1)
aCamera.SetPosition(0, -1, 0)
aCamera.ComputeViewPlaneNormal()
aCamera.Azimuth(30.0)
aCamera.Elevation(30.0)
aCamera.Dolly(1.5)

arender.AddActor(actor)
# arender.AddActor(actor1)
arender.SetActiveCamera(aCamera)
arender.ResetCamera()
arender.SetBackground(1, 1, 1)
arender.ResetCameraClippingRange()
arender.AddActor2D(scalarBar)

renWin.Render()
iren.Initialize()
iren.Start()

结果示例:

到此这篇关于Python VTK映射三维模型表面距离的文章就介绍到这了,更多相关Python VTK 映射内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python-VTK批量读取二维切片并显示三维模型

    目录 主要函数介绍 效果展示 前言: VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk. 主要函数介绍 vtk.vtkJPEGReader(): 读取图片的接口,可以通过该接口设置读取的图片位置.大小.维度.

  • VTK与Python实现机械臂三维模型可视化详解

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成了开发难度大. 周期长等问题.VTK. ORGE.OSG等平台使用封装更好的函数简化了开发过程.下面将使用Python与VTK进行机器人上位机监控界面的快速原型开发. 完整的上位机程序需要有三维显示模块.机器人信息监测模块(位置/角度/速度/电量/温度/错误信息...).通信模块(串口/USB/WI

  • 如何使用Python VTK高亮显示actor

    前言: VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk. 主要函数介绍: NewPickedActor.GetProperty(): 通过该函数,可以设置actor的性质,如颜色.表面样式等. vtk.vt

  • python+VTK环境搭建及第一个简单程序代码

    简介: Vtk,(visualization toolkit)是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk. 在Windows环境下用Python语言开发VTK程序 1.安装Python集成开发环境IDLE,相信大家已经轻车熟路,如果不了解,大家可以参考:运行

  • Python VTK计算曲面的高斯曲率和平均曲率

    前言: VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk. 本文介绍了 如何使用户Python版本的VTK计算曲面的高斯曲率并映射在曲面上.本例中使用了两个不同的表面,每个表面根据其高斯曲率和平均曲率着色.

  • Python-VTK隐式函数属性选择和剪切数据

    前言: VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk. 本文主要介绍了如何利用隐式函数的属性来选择和剪切数据,尤其是如何使用区域分隔属性来选择数据. 使用隐式函数选择或提取数据意味着选择位于函数特定区域内

  • 使用Python VTK 完成图像切割

    目录 1.读取二维图片序列完成面绘制 2.vtk.vtkOutlineFilter()介绍 3.隐函数平面模块vtk.vtkImplicitPlaneWidget() 4.vtk.vtkClipPolyData() 切割效果展示 1.读取二维图片序列完成面绘制 详情见Python-VTK批量读取二维切片并显示三维模型 2.vtk.vtkOutlineFilter()介绍 这个空间就相当于生成渲染模型的轮廓线,比如三维图像大小为(256x256x200),那么这个控件就会生成一个长宽高分别为256

  • Python vtk读取并显示dicom文件示例

    因为做项目的原因,所以接触到了医学图像dicom文件.vtk刚开始看,这里仅仅只是其最简单的读取显示功能.此处用到了vtk库,可自行百度安装方法. 下面附上代码: from vtk import * # reader the dicom file reader = vtkDICOMImageReader() reader.SetDataByteOrderToLittleEndian() reader.SetFileName("00efb2fedf64b867a36031a394e5855a.dc

  • 如何使用Python VTK绘制线条

    主要函数介绍: vtk.vtkPoints() 在VTK中用于定义点的类,使用points.InsertPoint(index, x, y, z) 即可插入点集.函数中,第一个参数是点的序号,后面是三个参数是点的坐标. vtk.vtkLineSource() 在VTK中定义直线的类,通过SetPoints(points),输入直线经过的点. vtk.vtkParametricSpline() 在VTK中定义曲线的类,通过SetPoints(points),输入曲线经过的点. vtk.vtkPar

  • Python VTK映射三维模型表面距离

    数据准备: 需要准备两个stl文件.Python需要安装vtk库 步骤一:数据读取 首先通过vtk.vtkSTLReader() 定义stl文件读取接口,再通过reader1.GetOutput() 就可以获得stl在vtk工作流的数据. 步骤二:去除重复点 通过vtk.vtkCleanPolyData() 可以去除模型中的重复点 步骤三:计算距离 使用 vtk.vtkDistancePolyDataFilter() ,使用上一步中过滤掉重复点后的数据作为输入.如distanceFilter.S

  • Python内存映射文件读写方式

    我就废话不多说了,还是直接看代码吧! import os import time import mmap filename = 'test.txt' #如果不存在,创建. if not os.path.exists(filename): open(filename, 'w') print(os.path.isdir(filename)) if os.path.isfile(filename): print(time.ctime(os.path.getctime(filename))) fd =

  • Python 列表映射后的平均值

    目录 1.average_by 2.lambda表达式 3.map函数 4.其他类似函数 4.1 max_by 4.2 min_by 4.3 sum_by 本篇阅读的代码片段来自于30-seconds-of-python. 1.average_by def average_by(lst, fn=lambda x: x): return sum(map(fn, lst), 0.0) / len(lst) # EXAMPLES average_by([{ 'n': 4 }, { 'n': 2 },

  • 详解Python中映射类型(字典)操作符的概念和使用

    映射类型操作符 (1)标准类型操作符 字典可以和所有的标准类型操作符一起工作,但却不支持像拼接(concatenation)和重复(repetition)这样的操作.这些操作对序列有意义,可对映射类型行不通.         字典是如何比较的呢? 与列表和元组一样,这个过程比数字和字符串的比较更复杂些. (2)映射类型操作符 字典的键查找操作符([ ])         键查找操作符是唯一仅用于字典类型的操作符,它和序列类型里单一元素的切片(slice)操作符很相象.对序列类型来说,用索引做唯一

  • 详解Python中映射类型的内建函数和工厂函数

    1.基本函数介绍 (1)标准类型函数[type().str()和 cmp()]         对一个字典调用type()工厂方法,会返回字典类型:"<type 'dict'>".调用str()工厂方法将返回该字典的字符串表示形式.         字典是通过这样的算法来比较的:首先是字典的大小,然后是键,最后是值.可是用cmp()做字典的比较一般不是很有用. 算法按照以下的顺序: 首先比较字典长度         如果字典的长度不同,那么用cmp(dict1, dict2

随机推荐