第一部分,VTK简介
VTK(Visualization Toolkit)是一款用于二次开发的可视化工具包,在世界上同类产品中最有影响,基本上可以作为可视化领域的规范。vtk封装了大量OpenGL代码,主要用于三维计算机图形学、图像处理和可视化。vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,650多个类,还包含有几个转换界面,因此也可以自由的通过Java,tcl/tk和Python各种语言使用vtk。 vtk几乎可以在任何一个基于Unix的平台上操作,以及Windows 95/98/NT/2000/XP。
VTK的特点:Open Source。采用CVS版本控制跨平台。支持Windows、Unix、Linux、Mac等多种平台功能强大。适合几乎所有的可视化领域,从医学可视化到数据可视化,都能找到VTK的用户支持多种语言开发。C语言当然不用说了,还包括脚本语言,如TCL、Python,也支持Java。具有强大的开发团队,包括多家开发单位,具有商业化的维护,具有来自全世界使用者的智力资源。
vtk的结构
Vtk比OpenGL和PEX高一个层面,这意味着在创建图形或可视化应用方面它将更加方便,更加简单。可以直接用C++,Tcl,Java,或 Python各种语言编写的程序调用vtk。因为vtk的内核是C++,所以毫无疑问,使用C++调用vtk是最快的。但是使用解释型语言Tcl, Python(以及Tk),甚至附带GUI类库的Java语言也都能够很快的构建出所需的应用。
第二部分,VTK安装
1,在www.kitware.com网站上下载
这四个东东。注:cmake就是一个用来生成适合不同编译器所需要的工程文件的工具。
2,分别安装cmake-2.8.2-win32-x86.exe以及vtk-5.6.1-win32.exe,后者路径为D:/vtk,再解压vtk-5.6.1.zip以及vtkdata-5.6.1.zip放在D:/vtk文件夹目录下。在D目录下,建立一个文件夹,命名vtk-5.6.1-bin。
3,运行cmake,选择编译器 visual c++ 9(即studio 2008),完成后configure,完成后generate,done后关闭CMAKE.
4,打开Visual Studio,编译d:/vtk-5.6.1-bin中的VTK.sln, all build,运行,等待。。。。,完成。
5,设置环境变量,添加相应库文件等,最好把.dll文件全部搜索出来,放在windows\system32目录下
第三部分,学习心得
初学VTK,感觉非常麻烦,但是功能又特别强大,在我们医学图像处理领域里那可是老大级别的东东。
(1)
要用 VTK 库进行可视化编程首先要对可视化要有一定的概念和基础。除了普通的可视化教科书以外,VTK 提供的教科书本身就非常好。VTK 源程序包的 Example目录包括了一系列例子,它们都有详尽的注释。一步步学习这些例子,可以很容易理解 VTK 涉及的可视化概念和 VTK 编程的一般特点。
学习这些例子首先要成功编译运行它们。这个步骤跟编译库类似,也需要先用 CMake工具生成 Visual Studio的工程文件,然后编译;而要保证程序能正确运行,还得保证 VTK 库文件在环境变量的 PATH 内。
初学者应该从 Tutorial 目录内的 Step x 例子入手,它们从最简单的 VTK 程序开始,一步步地增加概念,演示了各种可视化概念。注意例子里的注释,以第一个程序(Step1 的 Cone 程序)为例,看一下源程序:
源程序:Example/Tutorial/Step1/Cxx/Cone.cxx
//
// This example creates a polygonal model of a cone, and then renders it to
// the screen. It will rotate the cone 360 degrees and then exit. The basic
// setup of source -> mapper -> actor -> renderer -> renderwindow is
// typical of most VTK programs.
//
// First include the required header files for the VTK classes we are using.
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
int main( int argc, char *argv[] )
{
//
// Next we create an instance of vtkConeSource and set some of its
// properties. The instance of vtkConeSource "cone" is part of a
// visualization pipeline (it is a source process object); it produces data
// (output type is vtkPolyData) which other filters may process.
//
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );
//
// In this example we terminate the pipeline with a mapper process object.
// (Intermediate filters such as vtkShrinkPolyData could be inserted in
// between the source and the mapper.) We create an instance of
// vtkPolyDataMapper to map the polygonal data into graphics primitives. We
// connect the output of the cone souece to the input of this mapper.
// vtkPolyDataMapper *coneMapper = vtkPolyDataMapper::New();
coneMapper->SetInput( cone->GetOutput() );
程序段 1
这个简单的例子是一个控制台下的程序,创建一个棱锥,在屏幕上绘制,旋转360度后退出。程序虽简单,但已经包括了数据源、映射器、演员、绘制器、绘制窗口等概念,这些概念在 VTK 编程中几乎都是必然涉及的。通过这个例子,就可以对教科书里讲到的各种可视化概念(如相机、演员),编程模型(如管道)等有直观的了解了。
这里仅举这个最简单的例子,事实上,VTK 自带的例子循序渐进,从简单的概念,到各种复杂的概念、算法和数据结构、GUI 编程、直到具体的应用等,都做了很好的例证。结合教科书和例子,可以较快地理解 VTK 的各个方面。
比如说,如果要用 VTK在Win32环境下编程,应该学习 Example/GUI/Win32 下的例程,如果要用 MFC 框架,那么可以参考其中的 vtkMFC 例程。体会 VTK 库和 Win32 的关系、和 MFC 框架的关系,以便在这些平台上开发自己的程序。这需要对VTK和操作系统、编程环境本身有比较深入的了解,而这种了解对自行开发程序是十分必要的。
(2)用 VTK 进行 CT 片三维重构
VTK 作为一种通用的可视化类库,在科学和工程界有着广泛的应用。其中一种重要而常见的应用就是在医学领域,比如著名的“可视化人”项目,就有 VTK 的应用。实际上,VTK 在医学方面的应用是VTK 比较强调的,在它提供的例程应用中,就有专门的医学目录。学习它们,并应用于我们的项目中,是一条合适的途径。
比如,如果要做一个3D的医学影像系统,其中重要的一个环节就是三维重构,这也是在全膝置换手术中需要的。所以,用 VTK 进行 CT 片的三维重构,就是一个合适的应用的例子。
利用 VTK 做 CT 片的三维重构,从算法和数据结构来看,就是一个读取数据问题和一个图形显示问题。
对于我们手里的 CT 片,因为它们符合 DICOM 3.0 标准,所以对它们的读取还是相对容易的。VTK 已经实现了这类数据的读取,vtkImageSource类的很多子类都可以完成这种工作,如vtkImageReader 类或者 vtkVolumeReader 等。这样我们编程的时候只要指定必须的参数,就可以实现对单张 CT 片乃至 CT 片序列的读取了。根据 VTK 的数据管道,原始数据读取入了以后,就可以使用各种各种过滤器进行数据转换,在这个例子里,即进行表面抽取、影射,然后就可以绘制了。因为是三维重建,所以还应该加入交互器,以便可以在绘制窗口里进行交互。
关于重建算法,对于 CT 片这种三维规则数据场,可以采取成熟、基本的算法来进行三维重建,比如 MarchingCubes 算法。
我们使用 Visual Studio 6.0 开发平台来完成上述的工作,使对 CT 片的读取、重建及显示、交互等功能融合到 MFC 的框架中,以便提供一个方便的用户接口。具体的程序另件给出,各部分的功能可以参考注释。