VTK(Visualization Toolkit ),顾名思义主要用于三维计算机图形学、图像处理和可视化,VTK到底能做什么?这还得从人类的视觉系统讲起,现实世界中的物体在光照的作用下,其反射的光线进入人体视神经网络形成图像,物体、光照、视神经网络在VTK中都有对应的抽象,VTK正是利用这种抽象来模拟人类的视觉系统,将图像绘制到计算机屏幕上;那么大家都听过数字图像处理这门课,它与VTK不同,它是利用各种变换和算法来提取图像中的特征,例如,滤波、傅里叶变换、分割等;而VTK的主要功能是绘制,本系列教程就以一个完整的三维医学图像可视化软件来演示如何使用VTK。
![在这里插入图片描述](https://img-blog.csdnimg.cn/1e8d5c61fa76445c97ac3bc9592fca69.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQxNzU1MzA2,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)
VTK源码下载路径:https://vtk.org/download/
对于初学者而言,不建议一开始就直接扎到源代码中去,源码属于底层的细节,如果只关注细节,人的思维很难形成一个整体认识,而是应采用从整体到细节,再从细节到整体,两者相互验证、循序渐进地学习。
先从整体角度出发:
源码目录
良好的目录划分能够很大程度上体现软件的模块划分和软件架构:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d6eac4d288204aafa0ebbee539bf17ee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQxNzU1MzA2,size_20,color_FFFFFF,t_70,g_se,x_16)
类继承体系
VTK使用C++语言编写,面向对象设计思想无处不在,在VTK的用户手册中提供了VTK中类对象的继承体系,这对于初学者而言非常重要,相对于目录结构,又进一步的靠近了VTK。
https://vtk.org/documentation/
源码中的Demo
在VTK的源码和官方网站中提供了大量的示例程序和测试代码,请一定要重视这些宝贵的资源,请相信我,如果你把这些代码都看了一边,你就能够将他们组合成你自己的应用程序。
切换到细节:
当站在上帝的视角去浏览源码目录、类继承体系、Demo时,针对自己随时崩发出的想法和疑虑,请及时切换到细节中去,例如,浏览目录时,查看目录下到底有什么源文件,思考为什么要放在这里,顾名思义的去猜测一下这个源文件实现的功能;当浏览类继承体系时,去看一下类的声明与定义,请记住前面的提到的物体、光照、视网膜,看类的继承体系是否合理地对这些实体进行抽象;多运行几个demo后,就能进一步的对绘制流程有所了解,这时切换到细节,就能加深对VTK的认识。
丰富的扩展性:
这里的扩展性不仅限于利用C++封装、继承、多态特性去现实自己的“物体”,“光照”,“视网膜”;而且还实现了语言层面的扩展性,这么说吧,如果你是Web开发者,或是Python死忠,抑或是.Net,你想用自己熟悉的语言实现绘制应用,那你完全不必被VTK的C++吓跑,因为VTK已经实现了JS、Python的接口,对于C#也有开源的项目提供支持。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e48e81c6c6914e5c96315d483566b369.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQxNzU1MzA2,size_9,color_FFFFFF,t_70,g_se,x_16)
绘制Pipeline:
绘制管线就是从文件中获取或者在内存中创造数据源,然后对数据进行处理,将处理结果要么写到输出文件中,要么绘制到屏幕上,绘制引擎就是负责生成要绘制的图像;前面我们一直提到“物体”,“光照”,“视网膜”,让我们走进VTK,来看看与这些实体对应的类,以及在绘制流程中这些对象是如何相互转化的。
vtkProp:它就代表我们前面提到的“物体”,数据分为好多种类:
![在这里插入图片描述](https://img-blog.csdnimg.cn/3e03ffb3376a418591d51331d3706af5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQxNzU1MzA2,size_16,color_FFFFFF,t_70,g_se,x_16)
vtkFilter:对输入数据预处理,例如对图像上采样、降采样进行缩放,但这并不是必须的。
vtkAbstractMapper:将数据映射成不同形态的数据,例如将原始数据映射成彩色数据;例如将原始数据进行光线追踪生成一张二维结果图像进行显示。
vtkLight:对应我们之前提到的“光照”。
vtkCamera:对应“视网膜”。
vtkRenderer:将vtkProp(演员)在vtkLight(光照)的作用下生成一张图像显示到屏幕(视网膜),然后将结果显示到vtkRenderWindow中。
vtkRenderWindow:它提供了绘制机制,是操作系统和vtkRenderer的桥梁,因为绘制归根到底要利用操作系统提供的绘制机制。
vtkRenderWindowInteractor:上面我们实现了将图像显示到屏幕上,但还差一个最重要的功能,就是交互,也就是响应用户的鼠标、键盘的操作,这个类就是实现交互功能,就是不断的获取操作系统的消息,然后转化成VTK的事件,然后根据事件的类型进行重新绘制。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e35358bf091b4b918d02f8dd4f021082.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAd2VpeGluXzQxNzU1MzA2,size_19,color_FFFFFF,t_70,g_se,x_16)
今天我们讲了VTK的整体架构以及学习方法,从下节开始我们通过一个例子来深入到细节去学习VTK。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)