QVTKWidget+itk+vtk 交互问题
2015-04-14 13:06
183 查看
现在做到单张dicom图片读取头信息已经显示的部分,按照东灵工作室写的教程例子先写了一下,他们使用ImageToVTKImageFilter类来对itk和vtk进行数据连接,在用vtk的vtkImageViewer2类连接qt的qvtkwidget进行显示。原理是(来源 http://codeplanet.sinaapp.com/?p=361):
ITK的数据流采用如图1所示流水线(pipeline)作业方式。遵循此方式,所处理的数据来龙去脉清晰明了。在图1中,数据流左边的ImageFile代表待处理的图像文件,而右边ImageFile则代表处理后的图像文件。ImageFileReade:将存贮图像文件读人到内存,形成Image,再调用所希望处理的Fileter算法(比如滤波、分割、配准等具体算法),将对读人的图像数据进行处理。最后,ImageFileWriter将处理的图像数据结果保存,或输人给图形显示系统(如VTK),进行数据可视化。
VTK是C++语言开发的、公开源码的、面向对象的数据可视化软件开发包,并不单纯用于医学图像数据的可视化。VTK支持跨平台的编译,可以应用于Windows,Linux等系统。VTK支持包括数量、向量、张量、结构和测定体积等方法一系列可视化算法,VTK还支持包括建模。VTK的数据流同样采用流水线作业方式,如图2所示。
vtkSource为整个可视化流的开始,比如读取、生成数据等。vtkFilte对输入源数据进行各种处理,与ITK的Fileter类似。原始数据经过各种Filte:的处理后,再由vtkMappe:转换(或映射)成可供其它算法模块直接使用的数据形式,比如为几何数据。vtkActor类用来描述绘制场景中一个实体,即绘制场景的某个角色(Actor)。通过SetMapper()方法,可以将几何数据的属性传递给Actor,再由vtkRenderer类将处理后的数据结果显示出来。
由于ITK和VTK的数据流都是采用流水线作业形式,比较方便地利用类库本身提供的类型转换类来实现,如图3所示。通过ITKtoVTKImageFilter类操作将ITK和VTK的图像数据连接了起来,VTK负责图像数据的显示,而ITK负责图像的处理,其中VTK的Image
Viewe:是一个很方便实现的图像显示类,它在内部管理着vtkImageWindow, vtkRenderer, vtkActor2D和vtkImageMapper等图象类,实现图像查看、显示和可视化功能。
因此,东灵他们例子的代码是这么写的:
我用来实现dicom图像显示及交互,然后发现了只要一点击图片,程序就发生崩溃的错误。网上找了好多原因也没检查出来,后来选择不用vtkimageview2这个类而改用传统的写法,实例化vtk的render、actor、renderwindow,renderwindowinteractor后进行,成功实现。
之后再传到qvtkwidget,也成功了。
后来才发现东灵他们的代码没有new一个vtkRenderWindowInteractor,我在程序初始化的时候增加一个
ps:在网上搜索解决问题的时候也看到了一个重点就是
-----------------------------------------------------------------------------------------------------
参考博客:
http://blog.csdn.net/www_doling_net/article/details/8668870 http://codeplanet.sinaapp.com/?p=361 http://blog.csdn.net/colddie/article/details/8966521
感谢作者提供的经验。
————————————————
ITK的数据流采用如图1所示流水线(pipeline)作业方式。遵循此方式,所处理的数据来龙去脉清晰明了。在图1中,数据流左边的ImageFile代表待处理的图像文件,而右边ImageFile则代表处理后的图像文件。ImageFileReade:将存贮图像文件读人到内存,形成Image,再调用所希望处理的Fileter算法(比如滤波、分割、配准等具体算法),将对读人的图像数据进行处理。最后,ImageFileWriter将处理的图像数据结果保存,或输人给图形显示系统(如VTK),进行数据可视化。
VTK是C++语言开发的、公开源码的、面向对象的数据可视化软件开发包,并不单纯用于医学图像数据的可视化。VTK支持跨平台的编译,可以应用于Windows,Linux等系统。VTK支持包括数量、向量、张量、结构和测定体积等方法一系列可视化算法,VTK还支持包括建模。VTK的数据流同样采用流水线作业方式,如图2所示。
vtkSource为整个可视化流的开始,比如读取、生成数据等。vtkFilte对输入源数据进行各种处理,与ITK的Fileter类似。原始数据经过各种Filte:的处理后,再由vtkMappe:转换(或映射)成可供其它算法模块直接使用的数据形式,比如为几何数据。vtkActor类用来描述绘制场景中一个实体,即绘制场景的某个角色(Actor)。通过SetMapper()方法,可以将几何数据的属性传递给Actor,再由vtkRenderer类将处理后的数据结果显示出来。
由于ITK和VTK的数据流都是采用流水线作业形式,比较方便地利用类库本身提供的类型转换类来实现,如图3所示。通过ITKtoVTKImageFilter类操作将ITK和VTK的图像数据连接了起来,VTK负责图像数据的显示,而ITK负责图像的处理,其中VTK的Image
Viewe:是一个很方便实现的图像显示类,它在内部管理着vtkImageWindow, vtkRenderer, vtkActor2D和vtkImageMapper等图象类,实现图像查看、显示和可视化功能。
因此,东灵他们例子的代码是这么写的:
// 将reader的输出作为m_pImageViewer的输入,并设置m_pImageViewer与渲染器m_pRenderer的关联 m_pImageViewer->SetInput(reader->GetOutput()); m_pImageViewer->UpdateDisplayExtent(); m_pImageViewer->SetRenderWindow(m_QVTKWidget->GetRenderWindow()); m_pImageViewer->SetRenderer(m_pRenderder); m_pImageViewer->SetupInteractor(m_QVTKWidget->GetRenderWindow()->GetInteractor()); m_pImageViewer->SetSliceOrientationToXY(); //默认就是这个方向的 m_pImageViewer->GetImageActor()->InterpolateOff(); m_pRenderder->ResetCamera(); m_pRenderder->DrawOn(); m_QVTKWidget->GetRenderWindow()->Render();
我用来实现dicom图像显示及交互,然后发现了只要一点击图片,程序就发生崩溃的错误。网上找了好多原因也没检查出来,后来选择不用vtkimageview2这个类而改用传统的写法,实例化vtk的render、actor、renderwindow,renderwindowinteractor后进行,成功实现。
之后再传到qvtkwidget,也成功了。
后来才发现东灵他们的代码没有new一个vtkRenderWindowInteractor,我在程序初始化的时候增加一个
vtkSmartPointer< vtkRenderWindowInteractor > m_pInteractor = vtkSmartPointer< vtkRenderWindowInteractor >::New();然后设置
qvtkWidget->GetRenderWindow()->SetInteractor(m_pInteractor);测试发现可以成功实现。
ps:在网上搜索解决问题的时候也看到了一个重点就是
重载的vtkInteractorStyleTrackballCamera 也可以是子类 vtkInteractorImage. 同时要注意qvtk 与vtkImageViewer的 RenderWindow与Interactor的共享, 多以qvtk为准. SetInteractor 一定要在 SetRenderWindow之前, 以避免error出现.
-----------------------------------------------------------------------------------------------------
参考博客:
http://blog.csdn.net/www_doling_net/article/details/8668870 http://codeplanet.sinaapp.com/?p=361 http://blog.csdn.net/colddie/article/details/8966521
感谢作者提供的经验。
————————————————
相关文章推荐
- VTK: vtkImagePlaneWidget生成纹理切片相关问题
- VTK修炼之道76:交互部件_标注类Widget的应用
- VTK修炼之道75:交互部件_测量类Widget的应用
- VTK: VTK实体交互widget
- VTK交互之Widget
- ITK+VTK+VS环境搭建.Q:vs编译出问题参见VTK(一)哈。
- QVTKWidget和vtkImageViewer2结合编程设置顺序问题
- 使用ITK,VTK与QT过程遇到的一些问题
- vtkImageViewer2显示图片开始用鼠标左键交互时,出现的图片突然放大问题
- flex widget之间的数据交互问题
- ITK 4.3.1 + VTK 编程 问题
- VTK修炼之道72:交互与Widget_交互器样式
- VTK向ITK转换后输出序列dicom图片的问题
- vtkimageviewer 和vtkcontourwidget交互提取感兴趣区域!
- QVTKWidget和vtkImageViewer2结合编程设置顺序问题
- itk::VTKImageToImageFilter使用问题
- VTK修炼之道74:交互部件_Widget的创建
- VTK中使用vtkBorderWidget时,遇到的窗宽窗位调节功能丢失问题
- ITK+VTK 混编学习过程中遇到的问题记录
- VTK修炼之道77:交互部件_分割/配准类Widget与其他Widget