基于VTK的MFC應(yīng)用程序開(kāi)發(fā)_第1頁(yè)
基于VTK的MFC應(yīng)用程序開(kāi)發(fā)_第2頁(yè)
基于VTK的MFC應(yīng)用程序開(kāi)發(fā)_第3頁(yè)
基于VTK的MFC應(yīng)用程序開(kāi)發(fā)_第4頁(yè)
基于VTK的MFC應(yīng)用程序開(kāi)發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

本文格式為Word版,下載可任意編輯——基于VTK的MFC應(yīng)用程序開(kāi)發(fā)

基于VTK的MFC應(yīng)用程序開(kāi)發(fā)(3)

分類:VTK應(yīng)用例如2023-05-1713:371681人閱讀評(píng)論(17)珍藏舉報(bào)

目錄(?)[+]

之前介紹了基于VTK的單文檔應(yīng)用程序開(kāi)發(fā),并以圖像重采樣為例,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的圖像重采樣的應(yīng)用程序。對(duì)于多文檔應(yīng)用程序,與單文檔應(yīng)用程序基本一致,這里就不再陳述。對(duì)話框應(yīng)用程序是MFC應(yīng)用程序中一個(gè)使用十分廣泛的框架,本節(jié)就以醫(yī)學(xué)圖像可視化中常用的四視圖框架程序的實(shí)現(xiàn)為例,陳述基于VTK的對(duì)話框應(yīng)用程序開(kāi)發(fā)。

1.利用VS和CMake建立一個(gè)空的MFC對(duì)話框程序框架。

利用VS創(chuàng)立一個(gè)MFC對(duì)話框工程vtkDialog,刪除其中的工程文件,完成CMakeLists.txt文件,并添加相應(yīng)的代碼文件和鏈接VTK動(dòng)態(tài)庫(kù),利用CMake配置完畢后,開(kāi)啟生成的工程文件vtkDialog.sln,編譯執(zhí)行,即可得到一個(gè)空的對(duì)話框程序。其中CvtkDialogDlg為該程序的主對(duì)話框類。

2.設(shè)計(jì)用戶界面,添加相應(yīng)的控件

本程序需要實(shí)現(xiàn)的功能有(1)圖像讀取和管理;(2)圖像切分和瀏覽。一個(gè)常見(jiàn)的醫(yī)學(xué)圖像可視化程序,包括四個(gè)視圖,橫斷面視圖,矢狀面視圖,冠狀面視圖和三維視圖。因此,基于以上設(shè)計(jì),我們添加一個(gè)樹(shù)控件,MFC中對(duì)應(yīng)的控件類為CTreeCtrl。樹(shù)控件是最常用的文件管理控件,能夠便利的對(duì)文件進(jìn)行層次化組織和管理。四視圖的實(shí)現(xiàn)則需要四個(gè)控件,這里我們選擇CStatic控件,將其添加至對(duì)話框窗口中。添加完畢后,為控件生成相應(yīng)的Control類型的變量。

依照上述設(shè)計(jì),需要在CStatic中顯示圖像。這就需要對(duì)CStatic類繼續(xù)擴(kuò)展,使其支持VTK可視化管線。一個(gè)可行的方法是,設(shè)計(jì)一個(gè)CStatic類的子類,并在該子類中實(shí)現(xiàn)VTK可視化管線和處理。

3.實(shí)現(xiàn)VTK圖像可視化控件

3.1首先添加一個(gè)MFC類CvtkView

其基類選擇為CStatic,并添加至CMakeLists.txt文件中進(jìn)行管理。

3.2重載CvtkView類PreSubclassWindow()函數(shù)和OnPaint()函數(shù)

PreSubclassWindow函數(shù)負(fù)責(zé)創(chuàng)立VTK可視化管線,OnPaint()函數(shù)負(fù)責(zé)客戶區(qū)內(nèi)場(chǎng)景渲染。

3.3建立VTK可視化管線

VTK可視化管線在其次章中已經(jīng)介紹過(guò),其中最主要包含

vtkAcor,vtkRenderer,vtkRenderWindow,vtkRenderWindowInteractor四個(gè)部分。當(dāng)然根據(jù)需要還可以設(shè)置vtkRenderWindowInteractorStyle,以及光照,材質(zhì),顏色等。在CvtkView類頭文件中定義相關(guān)對(duì)象,并在PreSubclassWindow函數(shù)中實(shí)例化和構(gòu)建可視化管線,代碼如下。

[cpp]viewplaincopy

1.voidCvtkView::PreSubclassWindow()2.{

3.//TODO:Addyourspecializedcodehereand/orcallthebaseclass4.CRectrect;

5.GetClientRect(rect);6.

7.m_Renderer=vtkSmartPointer::New();8.

9.m_RenderWindow=vtkSmartPointer::New();10.m_RenderWindow->SetParentId(this->m_hWnd);

11.m_RenderWindow->SetSize(rect.Width(),rect.Height());12.m_RenderWindow->AddRenderer(m_Renderer);13.

14.if(m_RenderWindow->GetInteractor()==NULL)15.{

16.vtkSmartPointerRenderWindowInteractor=

17.vtkSmartPointer::New();18.RenderWindowInteractor->SetRenderWindow(m_RenderWindow);19.RenderWindowInteractor->Initialize();20.}21.

22.m_RenderWindow->Start();23.CStatic::PreSubclassWindow();24.}

相信通過(guò)前面的學(xué)習(xí),這里建立可視化管線的流程已經(jīng)比較熟悉了。需要注意的是,vtkRenderWindow需要通過(guò)函數(shù)vtkRenderWindow::SetParentId()來(lái)建立與控件本身的關(guān)

聯(lián),這樣才能將m_RenderWindow中的渲染內(nèi)容在控件的窗口上進(jìn)行顯示;而vtkRenderWindow::SetSize()則是設(shè)置渲染窗口與當(dāng)前控件客戶區(qū)保持大小一致。大家可能會(huì)有疑問(wèn),怎么沒(méi)有vtkActor?正常的一個(gè)可視化管線中,vtkActor表示需要進(jìn)行渲染或者繪制的對(duì)象。這里需要渲染的對(duì)象是圖像,而與以前不同的是,沒(méi)有直接去定義一個(gè)圖像vtkActor。至于原因暫且不管,隨著該類功能的逐步完善,我們?cè)僭敿?xì)說(shuō)明。VTK渲染管線建立完畢后在OnPaint()函數(shù)中調(diào)用vtkRenderWindow的Render()函數(shù)來(lái)實(shí)現(xiàn)渲染。

到這里一個(gè)基本的VTK顯示控件已經(jīng)實(shí)現(xiàn),在設(shè)計(jì)界面時(shí),通過(guò)MFC自動(dòng)添加的四個(gè)視圖變量類型默認(rèn)為CStatic。由于CvtkView是繼承自CStatic,因此我們可以直接將主對(duì)話框類CvtkDialogDlg頭文件中定義的四個(gè)變量類型修改為CvtkView。然后編譯運(yùn)行程序,是不是已經(jīng)出現(xiàn)了一個(gè)四視圖的原型了(如下圖所示)?由于沒(méi)有添加任何的渲染對(duì)象,因此四個(gè)視圖均為空的黑色窗口。

3.4交互式圖像切分

該控件需要實(shí)現(xiàn)兩個(gè)基本功能:一是交互式圖像切分;二是切片圖像提取。第一個(gè)功能,采用vtkResliceCursorWidget和vtkResliceCursor類。尋常兩個(gè)類同時(shí)使用,每個(gè)vtkResliceCursorWidget對(duì)象中需要定義相應(yīng)的vtkResliceCursor對(duì)象。

vtkResliceCursorWidget通過(guò)定義的“十〞字坐標(biāo)軸,提供用戶便利的切分和交互方式,支持坐標(biāo)軸的旋轉(zhuǎn)和平移;當(dāng)坐標(biāo)系發(fā)生改變時(shí)即調(diào)用vtkResliceCursor來(lái)進(jìn)行圖像切分并進(jìn)行更新到vtkRenderer對(duì)象中。

其次個(gè)功能采用vtkImagePlaneWidget實(shí)現(xiàn)。該類內(nèi)部定義了一個(gè)vtkImageReslice對(duì)象,利用vtkResliceCursor中定義的切分平面來(lái)切分圖像,在其內(nèi)部通過(guò)紋理映射來(lái)繪制到一個(gè)平面上,并在用戶指定的vtkRenderer進(jìn)行顯示。

另外前面在定義可視化管線時(shí),我們并沒(méi)有定義相關(guān)的vtkActor。這主要是由于在視圖顯示圖像時(shí),都是通過(guò)相關(guān)的widget來(lái)實(shí)現(xiàn),我們只需要為widget對(duì)象設(shè)置相應(yīng)的vtkRenderer即可,在其內(nèi)部會(huì)自動(dòng)生成相應(yīng)的vtkActor對(duì)象。根據(jù)以上分析在頭文件中定義相關(guān)對(duì)象并在PreSubclassWindow函數(shù)中進(jìn)行實(shí)例化。

[cpp]viewplaincopy

1.vtkSmartPointerm_ImagePlaneWidget;2.vtkSmartPointerm_ResliceCursorWidget;3.vtkSmartPointerm_ResliceCursor;

4.vtkSmartPointerm_ResliceCursorRe

p;

在實(shí)例化時(shí)需要注意,該視圖類在默認(rèn)狀況下渲染的是vtkResliceCursorWidget對(duì)象的輸出,因此需要為vtkResliceCursorWidget對(duì)象指定相應(yīng)的vtkRenderer對(duì)象,

[cpp]viewplaincopy

1.m_ResliceCursorWidget->SetInteractor(m_RenderWindow->GetInteractor());2.m_ResliceCursorWidget->SetDefaultRenderer(m_Renderer);

這樣在vtkResliceCursorWidget對(duì)象內(nèi)部會(huì)將切片圖像轉(zhuǎn)化為一個(gè)vtkActor對(duì)象并添加至指定的vtkRenderer對(duì)象中進(jìn)行顯示渲染;而vtkImagePlaneWidget中也有一個(gè)重要的函數(shù)vtkImagePlaneWidget::SetDefaultRenderer(vtkRenderer*)用于設(shè)置相應(yīng)的

vtkRenderer來(lái)顯示切片。根據(jù)本程序的設(shè)計(jì),vtkImagePlaneWidget產(chǎn)生的切片需要在三維場(chǎng)景中顯示,因此這里并沒(méi)有調(diào)用。也就是說(shuō),在默認(rèn)狀況下,本控件類只顯示二維切片圖像。

3.5添加圖像設(shè)置函數(shù)并初始化圖像切分對(duì)象

該控件類需要從外部設(shè)置相應(yīng)的處理圖像,因此提供一個(gè)接口函數(shù)來(lái)供外部調(diào)用。在3.4中僅僅定義和創(chuàng)立了交互式圖像切分對(duì)象,并沒(méi)有設(shè)置相應(yīng)的輸入數(shù)據(jù),因此每次有新的數(shù)據(jù)傳入時(shí),需要為其進(jìn)行初始化。

[cpp]viewplaincopy

1.voidCvtkView::SetImageData(vtkSmartPointerImageData)

2.{

3.if(ImageData==NULL)return;4.

5.m_ImageData=ImageData;6.SetupReslice();7.}

8.voidCvtkView::SetupReslice()9.{

10.if(m_ImageData==NULL)return;11.intdims[3];

12.m_ImageData->GetDimensions(dims);13.

14.////////////////////////////////////////////////////////////////////////

//

15.m_ImagePlaneWidget->SetInput(m_ImageData);

16.m_ImagePlaneWidget->SetPlaneOrientation(m_Direction);17.m_ImagePlaneWidget->SetSliceIndex(dims[m_Direction]/2);18.m_ImagePlaneWidget->On();

19.m_ImagePlaneWidget->InteractionOn();20.

21.////////////////////////////////////////////////////////////////////////

//

22.m_ResliceCursor->SetCenter(m_ImageData->GetCenter());23.m_ResliceCursor->SetImage(m_ImageData);24.m_ResliceCursor->SetThickMode(0);25.

26.m_ResliceCursorRep->GetResliceCursorActor()->

27.GetCursorAlgorithm()->SetResliceCursor(m_ResliceCursor);28.m_ResliceCursorRep->GetResliceCursorActor()->

29.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論