我所遭遇过的中间件--VTK

      我所遭遇过的中间件--VTK

      Vtk是我接触的第一款软件开发包,它引导我对图形学的入门.我是先学的VTK,后学的OpenGL和D3D.VTK是专为图形学开发,特点是接口清晰,好上手,又含有大量的图像处理算法.从VTK入手3D图形学,要比从OpenGL和D3D容易的多.

      最初接触VTK是研一那年暑假,研一时我做医学图像处理.VTK很适合由图像处理转到3D图形学,对做医学图像也很方便.它集成着DICOM图像文件格式的解析器.我看过解析DICOM文件的代码,大约5000多行.这代码量对当时的我来说如同天文数字,而使用VTK,几行代码就可以搞定.这就是中间件的方便之处,为开发者提供成熟的功能.我用VTK做三维医学图像绘制,原始数据是一系列的CT断层切片图像,对其做三维重建,以3D的形式显示.有两种绘制方式,体绘制和面绘制,这方面的资料有很多,我就不细讲了.

      我在VTK上投入了极大的激情,VTK的大部分Demo是用一种名为Tcl的脚本语言写的,我便将它们翻译成C++代码.记得有一年的圣诞还是元旦的,我在实验室花了一晚上的时间,将一个Tcl的DEMO改成C++,总共有2000多行代码.程序功能是各种三维图形的堆集.而后我还翻译<Vtk User Guide>,激情燃烧的岁月竟然搞了VTK.我还是国内两个VTK论坛的版主,发过很多关于VTK的帖子,受到很多网友的吹捧,当时我还真有种欣欣然的感觉.但现实总让人很无奈,VTK只是一种现成的图形技术,研究生的工作重点不在于做出了多么牛的软件,不在于你掌握了多强的技术,而是你提出了什么理论,发表了什么论文.不管理论是否可行,能够实现,甚至不管论文的数据是否真实.只要你的理论让人看上去深奥一些,能自圆其说,该有的数据看上去正常一些,毕业就是如此容易.可惜我是在研二结束的开题评审后,才意识到这件事.当时我的开题是要做一套医学三维图像显示系统,并准备了很多自己生成的三维效果截图.但评审老师很明确的指出我的问题,没有自己的理论.幸好我的导师在院里地位高,我的评审算过了.而我的研究课题就改成了三维医学图像体数据分割与显示.三维体数据分割,这个方向算不错,在当时搞的人少又比较新.但我已然没有搞这算法的激情了,既然造数据就能发论文,何必再写代码生成数据呢?我提出的理论为基于8叉树的三维体数据分割,然后实验的截图是用VTK本来提供的区域增长法得到的,具体的算法性能数据是自己编造的.于是顺利完成毕业论文,顺利答辩通过,顺利毕业.毕业时,将自己写的VTK的程序都发布到网上,我就再也没有碰过VTK.毕业两年后,接了个私活是代人写硕士毕业论文,题目还是三维体数据分割,这次又提出一个算法为基于自适应包围盒的体数据分割.当时参考了若干篇毕业论文,发现有个人的实验数据和我的一模一样,有点搞笑,我的数据也是假的.不过这次代人写论文时,我用代码实现了基于8叉树的三维体数据分割和基于自适应包围盒的体数据分割这两种算法.在我的博客中已经将算法的详细介绍以及代码发布出去了.只是,代码我也没有运行调试过,当年的运行环境,实验的原始图像数据已经不存在了.

     再回到VTK的话题上,由于已经五,六年没有碰过VTK了,这门手艺算是废了.记得VTK对数据的处理是一种管道流的架构,这很符合图像的滤波处理,输入图像经过处理后再输出图像.多个滤波器可以串行处理,实现复杂的图像处理.不过话又说回来,所有的图像处理都不是完美的,任何一个滤波操作会有一定的信息丢失.也就是说,图像还是原始的好.VTK提供的官方的DEMO大多采用面向过程的流程,一套数据,从加载到渲染一路串下来很清晰.VTK的低层渲染用的是OpenGL但是在VTK对外提供的接口中,看不到任何OPENGL的影子,VTK将OPENGL完全封装了.记得当年论坛上有人问能否在VTK中集成OPENGL,答案是当然可以,只是怎么集成我没研究过.当年VTK的体绘制非常卡,不知道现在优化的怎么样.毕竟过去这么多年了,算法和硬件都提升了很多.体绘制也是种很神奇的算法,但在游戏中没人会用.

     如果说我在VTK上有什么遗憾的话,那就是:我从没有看过VTK的源码.当年我仅仅满足于论坛上一群粉丝的热捧,自我感觉良好,却没有意识到自己是井底之蛙.我不过是VTK的一个User,连Reader都算不上,更别提Developer了.在这里,我不得不佩服国外这些写开源软件的人.VTK是一款很棒的图形引擎,又是开源,没有好好读下它的源码实在遗憾.它有几个MESH三角形细分的算法,有一些曲线生成,曲面生成的算法,值得一看.

转载于:https://www.cnblogs.com/WhyEngine/p/3473713.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java.lang.OutOfMemoryError: PermGen space 问题解决

Tomcat/bin/catalina.bat 或 .sh 文件中的“rem ----- Execute The Requested Command -”这个后面增加了下面的语句set JAVA_OPTS%JAVA_OPTS% -Xms256m -Xmx1024m -XX:PermSize256M -XX:MaxNewSize256m -XX:MaxPermSize512m Myeclipse配置选项 打开选项..输入tomcat关键字,然…

python中的__new__和__init__

一、__init__ 方法是什么&#xff1f; 使用Python写过面向对象的代码的同学&#xff0c;可能对 __init__ 方法已经非常熟悉了&#xff0c;__init__ 方法通常用在初始化一个类实例的时候。 这样便是__init__最普通的用法了。 但__init__其实不是实例化一个类的时候第一个被调…

python 中的__getattr__和__setattr__

__getattr__为内置方法&#xff0c;当使用点号获取实例属性时&#xff0c;如果属性不存在就自动调用__getattr__方法 __setattr__当设置类实例属性时自动调用&#xff0c;如j.name5 就会调用__setattr__方法 self.[name]5 因为这个类是从dict继承来的&#xff0c;是dict的超类 …

correct ways to define variables in python

http://stackoverflow.com/questions/9056957/correct-way-to-define-class-variables-in-python later say this转载于:https://www.cnblogs.com/luomingchuan/p/3475268.html

python 的钻石继承问题

如果子类继承自两个单独的超类&#xff0c;而那两个超类又继承自同一个公共基类&#xff0c;那么就构成了钻石继承体系。这种继承体系很像竖立的菱形&#xff0c;也称作菱形继承。 class Base:def __init__(self, value):print("This is Base __init__")self.value …

认知http响应头

HTTP&#xff08;HyperTextTransferProtocol&#xff09;是超文本传输协议的缩写&#xff0c;它用于传送WWW方式的数据&#xff0c;关于HTTP协议的详细内 容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求&#xff0c;请求头包含请求的方法、URI、协…

Python3的方法解析顺序(MRO)

Python 2.3 的新式类的 C3 算法。它也是 Python 3 唯一支持的方式(笔者使用python3&#xff0c;所以就先讲这种的) 一个例子&#xff1a; class D(object): pass class E(object): pass class F(object): pass class C(D, F): pass class B(E, D): …

WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习

WPF中 DataGrid 列头合并&#xff0c;类似于报表设计。效果图如下↓ 1.新建一个WPF项目WpfApplication1&#xff0c;新建一个窗体DataGridTest&#xff0c;前台代码如下&#xff1a; <Window x:Class"WpfApplication1.DataGridTest" xmlns"http://sch…

python 中的pickle库

序列化&#xff1a;我们把变量从内存中变成可存储或传输的过程称之为序列化&#xff0c;在Python中叫pickling&#xff0c;在其他语言中也被称之为serialization&#xff0c;marshalling&#xff0c;flattening等等&#xff0c;都是一个意思。 序列化之后&#xff0c;就可以把…

他山之石,可以攻玉——来自亚马逊的电商启示录

题记&#xff1a;“创新是我们的DNA&#xff0c;技术是我们改善客户体验的基础2009 年致股东的信” 1. 从亚马逊的成功讲起 1.1 历经8 年亏损始成正果 它是世界上所有电商的龙头和楷模&#xff0c;是毫无争议的行业标杆和旗帜&#xff0c;它在战略和经营上的一举一动都是关注的…

python数据结构-栈和队列的实现

&#xff11;、栈&#xff08;后进先出(last in first out&#xff0c;LIFO)&#xff09; 栈是一种特殊的列表&#xff0c;栈内的元素只能通过列表的一端访问&#xff0c;这一端称为栈顶。栈被称为一种后入先出&#xff08;LIFO&#xff0c;last-in-first-out&#xff09;的数…

c#只读字段和常量的区别,以及静态构造函数的使用 .

using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace ConsoleApplication1{ /// <summary> /// 功能&#xff1a;c#只读字段和常量的区别&#xff0c;以及静态构造函数的使用 /// </summary> class Progra…

python中的json序列化

如果我们要在不同的编程语言之间传递对象&#xff0c;就必须把对象序列化为标准格式&#xff0c;比如XML&#xff0c;但更好的方法是序列化为JSON&#xff0c;因为JSON表示出来就是一个字符串&#xff0c;可以被所有语言读取&#xff0c;也可以方便地存储到磁盘或者通过网络传输…

android 中 四舍五入的method */

/* 四舍五入的method */private String format(double num) {NumberFormat formatter new DecimalFormat("0.00");String s formatter.format(num);return s;} 转载于:https://www.cnblogs.com/hao222/p/3485204.html

Jar 打包 EXE文件,可以脱离java环境运行 Jsmooth的使用

1、首先准备我们的资源&#xff0c;把要转换的Jar文件、精简过的JRE文件夹和想生成的EXE文件的图标&#xff08;可以是png&#xff0c;jpg等格式&#xff0c;不想加图标可以不弄&#xff09;放到同一个文件夹内。这一步一定要做&#xff0c;否则可以成功生成&#xff0c;但在没…

linux中的fork方法(python)

前言&#xff1a; Unix/Linux操作系统提供了一个fork()系统调用&#xff0c;它非常特殊。普通的函数调用&#xff0c;调用一次&#xff0c;返回一次&#xff0c;但是fork()调用一次&#xff0c;返回两次&#xff0c;因为操作系统自动把当前进程&#xff08;称为父进程&#xf…

PowerDesigner的文章

来自iteye的PowerDesigner的相关文章&#xff0c;写的不错&#xff0c;这里引用一下 PD12 建模工具的使用 博客分类&#xff1a; PowerDesigner.nethttp://jpkc.zjbti.net.cn/sjkjs/uploadfile/2007514153222522.swf2010-01-12 00:34 浏览 352 评论(0) 分类:数据库从PowerDesi…

并发(concurrency)和并行(parallellism)

并发&#xff08;concurrency&#xff09;和并行&#xff08;parallellism&#xff09;是&#xff1a; 解释一&#xff1a;并行是指两个或者多个事件在同一时刻发生&#xff1b;而并发是指两个或多个事件在同一时间间隔发生。

大公司开源共享

Google开源:https://developers.google.com/open-source/projectsFacebook开源:https://github.com/facebook阿里巴巴开源:https://github.com/alibabaIntel开源:https://01.org/http://software.intel.com/zh-cn/ossApple开源:http://www.apple.com/opensource/http://www.ope…

进程间通信(python)

Process之间肯定是需要通信的&#xff0c;操作系统提供了很多机制来实现进程间的通信。Python的multiprocessing模块包装了底层的机制&#xff0c;提供了Queue、Pipes等多种方式来交换数据。 一、我们以Queue为例&#xff0c;在父进程中创建两个子进程&#xff0c;一个往Queue…