VTK资料收集
使用Qt Creator開發(fā)VTK
原文鏈接:http://blog.csdn.net/numit/article/details/10200507
VTK應(yīng)用系列:非常強(qiáng)大!非常善良
05-VTK在圖像處理中的應(yīng)用(1)
原文鏈接:http://blog.csdn.net/www_doling_net/article/details/8541534VTK概述
原文鏈接:http://blog.csdn.net/numit/article/details/11619069?VTK(visualization toolkit),直譯為可視化工具包,主要用于醫(yī)學(xué)圖像重建,帶有部分圖像處理功能。屬于科學(xué)性數(shù)據(jù)分析三維成像的函數(shù)庫。
1.1 ? vtk歷史:
? ? ? ? VTK最早是作為Prentice Hall出版的"TheVisualization Toolkit: An Object-Oriented Approach to 3DGraphics"一書的附件釋出,該書及其軟件是由奇異研發(fā)部Corporate R&D的三位研究人員:WillSchroeder、Ken Martin與Bill Lorensen用其閑暇時(shí)間合作。主要用于三維計(jì)算機(jī)圖形學(xué)、圖像處理和可視化。
1.2 ? vtk簡介:
? ? ? ? Vtk是在面向?qū)ο笤淼幕A(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)的,它的內(nèi)核是用C++構(gòu)建的,包含有大約250,000行代碼,2000多個(gè)類,還包含有幾個(gè)轉(zhuǎn)換界面,因此也可以自由的通過Java,Tcl/Tk和Python各種語言使用vtk。
? ? ? ?雖然vtk被NA-Mic(美國國家醫(yī)學(xué)影像計(jì)算聯(lián)盟)列為關(guān)鍵計(jì)算工具,vtk在醫(yī)學(xué)核試驗(yàn)的研究中也起到重大作用,但是vtk也運(yùn)用于其他領(lǐng)域,地理信息,建筑學(xué),氣象學(xué),航空航天等領(lǐng)域的逼真三維效果圖的實(shí)現(xiàn)也都能用vtk解決。
1.3 ?與其他三維引擎對比:
? ? ? vtk 更加靈活,封裝了c++和OpenGL的代碼,簡化編程。當(dāng)vtk需要精確實(shí)現(xiàn)曲面時(shí)也需要用到OpenGL及c++完善效果。和其他三維引擎繪圖不同的是更加注重對數(shù)據(jù)分析處理后的可視化,而osg,ogre等都是基于場景的繪制。Vtk主要用于科學(xué)計(jì)算可視化領(lǐng)域,osg主要用于虛擬現(xiàn)實(shí)領(lǐng)域。
2 vtk流程
vtk模式是基于pipeline設(shè)計(jì)模式,流線型執(zhí)行數(shù)據(jù)流。
Two segment:可視化管線和圖形化管線
可視化管線:source->[多個(gè)filter]形象的說是數(shù)據(jù)在可視化管線中流動(dòng),然后用圖顯示出數(shù)據(jù)信息。數(shù)據(jù)以原始的形式變換成圖元形式(vtk內(nèi)部定義的數(shù)據(jù)結(jié)構(gòu),形成數(shù)據(jù)集)最后以圖形形式表現(xiàn)。
圖形化管線:actor(prop對象的子類)->render->renderWindow->renderWindowInteractor
? ? ?可視化管線輸出的是可被繪制的幾何體,圖形模型主要是對幾何體進(jìn)行繪制,需要一個(gè)接口將兩個(gè)管線連接起來,就是mapper對象。
4 ?vtk簡單對象
vtk的數(shù)據(jù)處理方式將數(shù)據(jù)分為數(shù)據(jù)對象和處理對象。
其中源對象、過濾器對象(可選)、映射器對象?、繪制器對象、繪制窗口為處理對象,?Props對象為數(shù)據(jù)對象(vtk中數(shù)據(jù)都是由數(shù)據(jù)對象表示的,數(shù)據(jù)對象是數(shù)據(jù)的集合),映射器對象是可視化模型和圖形模型的接口。
1、源對象
?????? 數(shù)據(jù)生成的源頭,數(shù)據(jù)來源主要包括從磁盤讀取數(shù)據(jù)文件,如VTK所支持的各種格式文件生成數(shù)據(jù)源對象,這種源對象被稱為讀源對象,或者利用數(shù)學(xué)方法生成源對象,如利用多個(gè)四邊形構(gòu)建一個(gè)圓柱體,這種對象被稱為程序源對象。
2、過濾器對象
????? 對源對象進(jìn)行處理,生成新的數(shù)據(jù)集輸出。
3、映射器對象
???? 映射器對象主要作用是將可視化模型生成的數(shù)據(jù)轉(zhuǎn)換到圖形模型進(jìn)行繪制,或者以磁盤文件的形式進(jìn)行輸出。
5 ?演示例子
[cpp] view plaincopyprint?#include<vtkSmartPointer.h> #include<vtkCylinderSource.h> #include<vtkPolyDataMapper.h> #include<vtkActor.h> #include<vtkProperty.h> #include<vtkRenderer.h> #include<vtkRenderWindow.h> #include<vtkRenderWindowInteractor.h> int main(int, char *[]) { vtkSmartPointer<vtkCylinderSource>source = vtkSmartPointer<vtkCylinderSource>::New();//創(chuàng)建一個(gè)source對象 source->SetResolution(16); //設(shè)置source屬性 source->Update(); vtkSmartPointer<vtkPolyDataMapper>mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); //創(chuàng)建映射對象 mapper->SetInputConnection(source->GetOutputPort()); //將source的流出變成mapper的流入 vtkSmartPointer<vtkActor>cylinder = vtkSmartPointer<vtkActor>::New(); //創(chuàng)建一個(gè)演員對象 cylinder->SetMapper(mapper); //設(shè)置演員對象的屬性 cylinder->SetPosition(10,2,4); cylinder->GetProperty()->SetColor(1,1,0); cylinder->RotateWXYZ(30,1,1,1); vtkSmartPointer<vtkRenderer>render = //創(chuàng)建渲染對象 vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow>renwin = //創(chuàng)建渲染窗口 vtkSmartPointer<vtkRenderWindow>::New(); renwin->AddRenderer(render); //在渲染窗口添加渲染場景。一個(gè)窗口可以添加多個(gè)場景 vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); render->AddActor(cylinder); //在渲染對象上添加actor或其他prop(比如相機(jī),光照) iren->SetRenderWindow(renwin); //將渲染窗口設(shè)置交互屬性對象 renwin->Render(); //啟動(dòng)渲染 iren->Start(); //啟動(dòng)交互 returnEXIT_SUCCESS; }
6 ? vtk可視化執(zhí)行管線的解釋
? ? ? ?
? ? ? ?首先數(shù)據(jù)流執(zhí)行的原則是上游對象輸出的數(shù)據(jù)類型和下游對象輸入的數(shù)據(jù)類型要一致,注意輸入輸出數(shù)據(jù)之間的匹配問題,如果不一致,執(zhí)行管線就不能正常運(yùn)行。
? ? ? ?構(gòu)建好可視化管線后,構(gòu)成可視化管線的各個(gè)對象對數(shù)據(jù)的處理過程,成為可視化管線的執(zhí)行,當(dāng)管線中的過程對象或數(shù)據(jù)發(fā)生改變時(shí),可視化管線都要重新執(zhí)行,為了保證管線的執(zhí)行效率,管線在執(zhí)行過程中必須保持處理對象的同步,VTK采用隱式執(zhí)行的方式保持同步。
隱式執(zhí)行包含兩個(gè)互逆的過程:
1.??????Execute():source->filter->mapper
當(dāng)可視化管線中的對象創(chuàng)建時(shí)間發(fā)生改變,表示對象已經(jīng)更新了,這時(shí)執(zhí)行了execute()
2.??????update(): mapper-->filter->source
當(dāng)renderWindowàRender()發(fā)出繪制請求,actor對象將繪制信息給mapper,管線開始執(zhí)行,然后mapper、filter、source對象依次調(diào)用upDate()方法,源對象調(diào)用了update()方法后,開始比較當(dāng)前修改時(shí)間和最后執(zhí)行時(shí)間,如果當(dāng)前被修改的時(shí)間比最后執(zhí)行的時(shí)間新,則執(zhí)行execute(),filter對象和mapper對象比較他們的修改時(shí)間和最后執(zhí)行的時(shí)間,根據(jù)比較結(jié)果看是否需要調(diào)用execute()。
總結(jié)
- 上一篇: boost::function和boos
- 下一篇: VTK读取序列化图像