ITK之封装

185 阅读3分钟

1 概述

尽管 ITK 的核心是用 C++ 来实现的,但也可以自动转换 TclPython 语言,使用这些编程语言就可以生成 ITK 程序。这种功能仅仅适用于高级用户而且正在大力发展。若对此工具有兴趣的话,这个概述将给你提供一些有用的意见并告诉你应该看的地方。

由于使用范型编程(例如 C++ 模板的扩展使用),所以 ITK 中的封装过程是很复杂的。像 VTK 系统是使用自己的封装工具,是非模板化的、是在系统中由编码技术定制的。由于 一般的 C++ 很难被解析,所以即使像 SWIG 这样专为通用封装生成器设计的系统也很难处理 ITK 编码。因此,ITK 封装生成器使用一个综合产生语言的绑定工具。

(1)gccxmlGNU 编译器的一个改进版本,可以产生一个输入 C++ 程序的 XML 描述。

(2)CABLE 处理从 gccxml 而来的 XML 信息并生成下一个工具的额外输入(例如:包含即将封装的信息的 CSWIG)。

(3)CSWIGSWIG 的一个改进版本,用 XML 解析器来代替通常的 SWIG 解析器(从CABLE 和 gccxml 生成 XML)。 CSWIG 生成一个合适的语言绑定(不论是 Tcl 还是 Python)。

(注意:由于 SWIG 具有对包括 JavaPerl 等 11 种不同语言产生语言绑定的能力,所以大家希望在将来对这些语言以更大的支持力度)。

2 封装

阅读 Wrapping/CSwig/README 中的文件可以得到更多关于封装处理的信息。在Wrapping/CSwig/Tests 中也有一些简单的测试文件,在目录 Testing/Code/*/中有大量的测试和样例。

封装处理的结果是产生一系列可供解释语言使用的共享库, 依照每种语言不同的句法要求 甚 至 可 以 直 接 转 换 到 C++ 。 例 如 :在文件夹 Testing/Code/Algorithms 中 , 测试itkCurvatureFlowTestTcl2.tcl 中有一段代码如下:

set reader [itkImageFileReaderF2_New]
$reader SetFileName "${ITK_TEST_INPUT}/cthead1.png"
set cf [itkCurvatureFlowImageFilterF2F2_New]
$cf SetInput [$reader GetOutput]
$cf SetTimeStep 0.25
$cf SetNumberOfIterations 10

在 C++中有同样的代码如下:

itk::ImageFileReader<ImageType>::Pointer reader =
itk::ImageFileReader<ImageType>::New( );
reader->SetFileName("cthead1.png");
itk::CurvatureFlowImageFilter<ImageType,ImageType>::Pointer cf =
itk::CurvatureFlowImageFilter<ImageType,ImageType>::New( );
cf->SetInput(reader->GetOutput( ));
cf->SetTimeStep(0.25);
cf->SetNumberOfIterations(10);

这个例子论证了 C++ 和如 Tcl 等的封装语言的一个重要的差别。模板类在封装之前必须进行实例化。也就是说,模板参数必须指定为封装过程的一部分。在上面的例子中, CurvatureFlowImageFilterF2F2 表示滤波器已经被一个输入图像和二维浮点型数据类型的输出图像(例如 F2)进行了实例化。

通常仅仅选择几个普通的类型进行封装处理来避免类型溢出,然后封装到一个类库大小。增加一个新类型就需要再运行封装来生成新库。

通译语言的优点就是不用像 C++ 语言那样需要一个很长的编译/链接周期。另外,它们通常都会附带一套生成有用功能的工具包。例如,Tk 工具包(例如 Tcl/TkPython/Tk)提 供生成功能广泛的用户界面的工具。将来 ITK 支持的各种通译语言必将能实现更多的应用和测试。