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

 更新时间:2022年04月18日 13:07:41   作者:派大大大星  
这篇文章主要介绍了Python VTK映射三维模型表面距离,通过如何使用VTK读取图片计算两个三维模型(stl)的表面距离,并将其距离值映射到模型上展开主题,需要的朋友可以参考一下

数据准备: 需要准备两个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()

结果示例:

1636355834(1).jpg

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

相关文章

  • 用Python识别人脸,人种等各种信息

    用Python识别人脸,人种等各种信息

    这篇文章主要介绍了用Python识别人脸,人种等各种信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Python数据类型之String字符串实例详解

    Python数据类型之String字符串实例详解

    这篇文章主要介绍了Python数据类型之String字符串,结合实例形式详细讲解了Python字符串的概念、定义、连接、格式化、转换、查找、截取、判断等常见操作技巧,需要的朋友可以参考下
    2019-05-05
  • python对比两个字典dict的差异详解

    python对比两个字典dict的差异详解

    这篇文章主要为大家详细介绍了python 如何对比两个字典dict的不同差异,文中的示例代码简洁易懂,具有一定的学习价值,感兴趣的可以了解一下
    2023-05-05
  • Python matplotlib绘制实时数据动画

    Python matplotlib绘制实时数据动画

    Matplotlib作为Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。本文将利用Matplotlib库绘制实时数据动画,感兴趣的可以了解一下
    2022-03-03
  • Python实现嵌套列表去重方法示例

    Python实现嵌套列表去重方法示例

    人生苦短,早用Python。python可以说2017比较火的一个语言了,下面这篇文章主要给大家介绍了关于利用Python实现嵌套列表去重的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • python使用for循环计算0-100的整数的和方法

    python使用for循环计算0-100的整数的和方法

    今天小编就为大家分享一篇python使用for循环计算0-100的整数的和方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python里隐藏的“禅”

    Python里隐藏的“禅”

    这篇文章主要介绍了IT柏拉图翻译的python的lib目录下this.py文件中的一首诗,蕴含了Python程序设计中很多哲理性的规律,需要的朋友可以参考下
    2014-06-06
  • Python读取txt内容写入xls格式excel中的方法

    Python读取txt内容写入xls格式excel中的方法

    今天小编就为大家分享一篇Python读取txt内容写入xls格式excel中的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • python中shell执行知识点

    python中shell执行知识点

    在本篇文章里小编给大家分享的是关于python中shell执行知识点内容,需要的朋友们可以学习下。
    2020-05-05
  • 使用Python进行物联网设备的控制与数据收集

    使用Python进行物联网设备的控制与数据收集

    Python作为一种高效且易于学习的编程语言,已经成为开发物联网应用的首选语言之一,本文将探讨如何使用Python进行物联网设备的控制与数据收集,并提供相应的代码示例,需要的朋友可以参考下
    2024-05-05

最新评论