VTK学习(一)SetInputData()和SetInputConnection()替换SetInput()

VTK6引入了一些向后不兼容的更改。这里更详细地描述了这些变化背后的原因。其中一个更改是使用SetInputData()和SetInputConnection()替换SetInput()。

VTK4中管道对象连接连接

someFilter - > SetInput ( someReader - > GetOutput ());
 
 
VTK5中更改为

someFilter - > SetInputConnection ( someReader - > GetOutputPort ());
 
 
SetInput()和相关方法被保留为向后兼容性。

VTK6中 此方法和所有相关功能(如SetSource)在VTK 6中已被删除。这背后的主要原因是在将数据对象与管道对象分离(参见此处有详细信息)时,不可能保留此方法。在VTK 5中,SetInput()是使用SetInputConnection()实现的,但这需要访问该算法及其输出端口给定一个数据对象。在VTK 6中,由于数据对象不再引用生成它的算法,所以不可能建立仅给出数据对象的流水线连接。


为了便于将独立数据对象分配给算法的输入,我们在VTK 6中引入了一组方便的功能。下面是一个例子:

someFilter - > SetInputData ( aDataObject );
 
 
请注意,即使下面的代码将被编译,它不会创建一个管道连接,也不应该用于代替SetInputConnection()。

someFilter - > SetInputData ( someReader - > GetOutput ());
 
 
将数据对象与管道对象分离的另一个优点是开发人员不再需要创建输入副本,以便使用内部过滤器。 以前,这是算法正常运行所必需的:


 
 
  1. void MyFilter::RequestData(…)
  2. {
  3. vtkDataObject* input = inInfo->Get(vtkDataObject::DATA_OBJECT());
  4. vtkDataObject* copy = input->NewInstance();
  5. copy->ShallowCopy(input);
  6. this->InternalFilter->SetInput(copy);
  7. this->InternalFilter->Update();
  8. }
现在可以用以下代替


 
 
  1. void MyFilter::RequestData(…)
  2. {
  3. vtkDataObject* input = inInfo->Get(vtkDataObject::DATA_OBJECT());
  4. this->InternalFilter->SetInputData(input);
  5. this->InternalFilter->Update();
  6. }

另一个优点是,此更改会从管道中删除一些循环引用,从而无需使用垃圾回收器。这对使用大型管道时VTK的性能有明显的影响。

这种变化可能对VTK社区产生最大的影响。同时,这是最简单的解决方案。这是一个经验法则:

  • 如果要建立管道连接,请使用SetInputConnection
  • 如果要处理独立数据集,请使用SetInputData

以下是一些具体的例子。注意,即使我们在所有这些示例中使用SetInput(),类似的方法,如SetSource()也应该遵循相同的模式。查找SetSourceConnection()或SetSourceData()为例。此外,我们忽略这些示例中的端口号,但大多数应该使用端口号。

例子1

anotherFilter->SetInput(aFilter->GetOutput());
 
 
anotherFilter->SetInputConnection(aFilter->GetOutputPort());
 
 


例子2


 
 
  1. vtkDataObject* output = aFilter->GetOutput();
  2. anotherFilter->SetInput(output);
anotherFilter->SetInputConnection(aFilter->GetOutputPort());
 
 
例子3


 
 
  1. vtkPolyData *pd = vtkPolyData::New();
  2. aFilter->SetInput(pd);

 
 
  1. vtkPolyData *pd = vtkPolyData::New();
  2. aFilter->SetInputData(pd);
例子4

 
 
  1. vtkDataObject* output = aFilter->GetOutput();
  2. aFilter->Update();
  3. anotherFilter->SetInput(output);

 
 
  1. vtkDataObject* output = aFilter->GetOutput();
  2. aFilter->Update();
  3. anotherFilter->SetInputData(output);
例子5


 
 
  1. void myfunction(vtkDataObject* dobj)
  2. {
  3. vtkAFilter* aFilter = vtkAFilter::New();
  4. aFilter->SetInput(dobj);
  5. aFilter->Update();
  6. // …
  7. }
This example is also ambiguous. You need to trace it up to find the origin of dobj. If this is the common use:
myfunction(aFilter->GetOutput());
 
 
you will have to refactor myfunction to take an algorithm and an output port. For example:

 
 
  1. void myfunction(vtkAlgorithm* alg, int port)
  2. {
  3. vtkAFilter* aFilter = vtkAFilter::New();
  4. aFilter->SetInputConnection(alg->GetOutputPort(port));
  5. aFilter->Update();
  6. // …
  7. }
  8. myfunction(aFilter, 0);
If this is the common use:

 
 
  1. vtkPolyData* pd = vtkPolyData::New();
  2. // fill pd
  3. myfunction(pd);
then replacing SetInput() with SetInputData() would work.



https://www.vtk.org/Wiki/VTK/VTK_6_Migration/Replacement_of_SetInput


例子


 
 
  1. #include "vtkAutoInit.h"
  2. VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
  3. VTK_MODULE_INIT(vtkInteractionStyle);
  4. /**********************************************************************
  5. 文件名: 2.3_Viewport.cpp
  6. Copyright (c) 张晓东, 罗火灵. All rights reserved.
  7. 更多信息请访问:
  8. http://www.vtkchina.org (VTK中国)
  9. http://blog.youkuaiyun.com/www_doling_net (东灵工作室)
  10. **********************************************************************/
  11. /**********************************************************************
  12. 文件名: 2.3_Viewport.cpp
  13. Copyright (c) 张晓东, 罗火灵. All rights reserved.
  14. 更多信息请访问:
  15. http://www.vtkchina.org (VTK中国)
  16. http://blog.youkuaiyun.com/www_doling_net (东灵工作室)
  17. **********************************************************************/
  18. #include <vtkConeSource.h>
  19. #include <vtkCubeSource.h>
  20. #include <vtkCylinderSource.h>
  21. #include <vtkSphereSource.h>
  22. #include <vtkPolyDataMapper.h>
  23. #include <vtkRenderer.h>
  24. #include <vtkRenderWindow.h>
  25. #include <vtkActor.h>
  26. #include <vtkRenderWindowInteractor.h>
  27. #include <vtkSmartPointer.h>
  28. int main()
  29. {
  30. vtkSmartPointer<vtkConeSource> cone = vtkSmartPointer<vtkConeSource>::New();
  31. vtkSmartPointer<vtkCubeSource> cube = vtkSmartPointer<vtkCubeSource>::New();
  32. vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
  33. vtkSmartPointer<vtkSphereSource> sphere = vtkSmartPointer<vtkSphereSource>::New();
  34. vtkSmartPointer<vtkPolyDataMapper> coneMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  35. coneMapper->SetInputData(cone->GetOutput()); //SetInput改为SetInputData
  36. vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  37. cubeMapper->SetInputData(cube->GetOutput());
  38. vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  39. cylinderMapper->SetInputData(cylinder->GetOutput());
  40. vtkSmartPointer<vtkPolyDataMapper> sphereMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  41. sphereMapper->SetInputData(sphere->GetOutput());
  42. vtkSmartPointer<vtkActor> coneActor = vtkSmartPointer<vtkActor>::New();
  43. coneActor->SetMapper(coneMapper);
  44. vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
  45. cubeActor->SetMapper(cubeMapper);
  46. vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
  47. cylinderActor->SetMapper(cylinderMapper);
  48. vtkSmartPointer<vtkActor> sphereActor = vtkSmartPointer<vtkActor>::New();
  49. sphereActor->SetMapper(sphereMapper);
  50. vtkSmartPointer<vtkRenderer> renderer1 = vtkSmartPointer<vtkRenderer>::New();
  51. renderer1->AddActor(coneActor);
  52. renderer1->SetBackground( 1.0, 0.0, 0.0);
  53. renderer1->SetViewport( 0.0, 0.0, 0.5, 0.5);
  54. vtkSmartPointer<vtkRenderer> renderer2 = vtkSmartPointer<vtkRenderer>::New();
  55. renderer2->AddActor(cubeActor);
  56. renderer2->SetBackground( 0, 0, 0);
  57. renderer2->SetViewport( 0.5, 0.0, 1.0, 0.5);
  58. vtkSmartPointer<vtkRenderer> renderer3 = vtkSmartPointer<vtkRenderer>::New();
  59. renderer3->AddActor(cylinderActor);
  60. renderer3->SetBackground( 0.0, 0.0, 1.0);
  61. renderer3->SetViewport( 0.0, 0.5, 0.5, 1.0);
  62. vtkSmartPointer<vtkRenderer> renderer4 = vtkSmartPointer<vtkRenderer>::New();
  63. renderer4->AddActor(sphereActor);
  64. renderer4->SetBackground( 1.0, 1.0, 0.0);
  65. renderer4->SetViewport( 0.5, 0.5, 1.0, 1.0);
  66. vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
  67. renWin->AddRenderer(renderer1);
  68. renWin->AddRenderer(renderer2);
  69. renWin->AddRenderer(renderer3);
  70. renWin->AddRenderer(renderer4);
  71. renWin->SetSize( 640, 480);
  72. renWin->Render();
  73. renWin->SetWindowName( "Viewport");
  74. vtkSmartPointer<vtkRenderWindowInteractor> interactor =
  75. vtkSmartPointer<vtkRenderWindowInteractor>::New();
  76. interactor->SetRenderWindow(renWin);
  77. renWin->Render();
  78. interactor->Initialize();
  79. interactor->Start();
  80. return EXIT_SUCCESS;
  81. }




运行在运行《VTK图形图像进阶》第五章5.3_ImageResliceExample.cpp时,会提示MetaImage cannot read data from file或者显示窗口是空白,后来搜索了VTKExample中的例子,发现可以这样解决:

imgActor->SetInput(colorMap->GetOutput());
 
 
改为
imgActor->GetMapper()->SetInputConnection(colorMap->GetOutputPort());

 
 

同时添加头文件

#include <vtkImageMapper3D.h>
 
 
参考链接https://heliublog.com/2017/05/10/VTK%E6%8F%90%E7%A4%BAMetaImage%20cannot%20read%20data%20from%20file/

### 使用 VTK 进行点云数据可视化 为了利用 VTK 实现点云数据的可视化,首先需要安装 Python 的 `vtk` 库。可以通过 pip 安装命令完成这过程: ```bash pip install vtk ``` #### 创建简单的点云可视化程序 下面展示了个基本的例子,该例子创建了组随机分布的点并将其显示出来[^2]。 ```python import numpy as np import vtk from vtk.util.numpy_support import numpy_to_vtk, vtk_to_numpy def create_point_cloud(num_points=100): points = vtk.vtkPoints() # Generate random point positions within a unit cube centered at origin. for _ in range(num_points): x, y, z = np.random.rand(3) * 2 - 1 # Random coordinates between [-1, 1]. points.InsertNextPoint(x, y, z) polydata = vtk.vtkPolyData() polydata.SetPoints(points) return polydata def visualize_point_cloud(polydata): # Create vertices dataset from the input PolyData's Points. verts = vtk.vtkVertexGlyphFilter() verts.SetInputData(polydata) verts.Update() # Mapper to map polygonal data into graphics primitives. mapper = vtk.vtkPolyDataMapper() if vtk.VTK_MAJOR_VERSION <= 5: mapper.SetInputConnection(verts.GetOutputPort()) else: mapper.SetInputData(verts.GetOutput()) # Actor manages properties and transformation of node attributes. actor = vtk.vtkActor() actor.SetMapper(mapper) # Renderer renders actors using OpenGL or other rendering backends. renderer = vtk.vtkRenderer() render_window = vtk.vtkRenderWindow() render_window.AddRenderer(renderer) interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(render_window) # Add our actor to the scene. renderer.AddActor(actor) renderer.SetBackground(.1, .2, .3) # Background color dark blue. # Render and interact with the window. render_window.Render() interactor.Start() if __name__ == "__main__": cloud_data = create_point_cloud() visualize_point_cloud(cloud_data) ``` 此脚本定义了两个主要功能:个是生成指定数量的随机点构成的点云(`create_point_cloud`);另个则是设置渲染器、映射器演员等组件来绘制这些点(`visualize_point_cloud`)。最后部分展示了如调用这两个函数以启动交互式的视窗查看点云图像[^3]。 通过上述方法,可以轻松地构建起基于 VTK 的简单点云可视化应用程序。对于更复杂的应用场景,则可能涉及到更多高级特性的运用,比如色彩调整、光照效果配置或是与其他几对象组合展示等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值