2013年1月28日 星期一

ITK + VTK + QT + OpenCV VS2010 Project Setup


  • 首先Qt的專案格式:
    • 一般來說有五個檔案
      • Program Driver - 
        • ItkVtkQtProjectApp.cxx
        • 程式開始執行位置並初始化一個GUI
      • Qt Gui file
        • ItkVtkQtProjectGui.ui
        • 這個檔案是用Qt Designer設計來的GUI,當然也可以用hard-coding方式完成,使用的程式語言是XML
      • Gui Functionality spec & implementation
        • ItkVtkQtProjectGui.cxx and ItkVtkQtProjectGui.h
        • 這兩個負責實作Gui的functionality
        • 可以用hard-coding的方式一邊做gui介面,一邊做functionality
      • Qt Gui resources - 
        • ItkVtkQtProjectGui.qrc
        • 專門存放gui可能用到的資源位置,例如icon
    • 專案的檔案都設置好以後進行編譯跟執行時,Qt的meta-object compiler moc會將qt相關的程式部分產生對應的檔案在Generated資料夾下,主要有兩個
      • moc_ItkVtkQtProjectGui.cxx - 根據ItkVtkQtProjectGui.h產生的Meta object code,基本上可以不用動這個檔案
      • ui_ItkVtkQtProjectGui.h - 由ItkVtkQtProjectGui.ui產生的介面,含有C++ code,其中出現的Qt物件會對應Gui的元件以及Gui的Layout
      • 當有需要時,可以來這裡改Gui的設定,除此之外,這兩個不需要特別去動
  • 建立及執行專案
    • 環境設定 - 
      • Window 7 64bit 企業版 + Visual Studio 2010 professional
      • InsightToolkit-4.2.1 + VTK5.10.1 + Qt4.8.4 + OpenCV-2.4.3
    • Cautious:以上使用到的Library必須先正確的在機器上編譯好!
    • Download Project
    • Step 1:
      • 利用Cmake建立專案,過程中如果遇到找不到Library出現Error,就點一下找不到的那個LIBRARY的欄位,接著點右邊的按鈕,明確地給他路徑,然後再點一次Generate即可。
      • 必須直到Cmake皆找到所有Library位置即可,最終結果可能如:
      • Note: 過程中,Cmake可能找到OpenCV的路徑,但是是相對路徑,此時,仍然點OpenCV的欄位,明確地給他路徑,否則之後專案裡面可能會沒有include到OpenCV的Library;如果用不到OpenCV,也可以在CMakeLists.txt中把OpenCV相關的都刪掉,則可以忽略這個Note
    • Step 2:
      • 接著打開專案,在ItkVtkQtProject上點右鍵,將ItkVtkQtProject設成起始專案
      • 改成Release Mode( 非常重要! )
      • Note 1: 編譯過程中compiler可能找不到 「itkImageToVTKImageFilter.h」
        • #include <itkImageToVTKImageFilter.h>,必須在專案屬性頁手動加入這個include檔的原始位置
        • 路徑位置大概在C:\itk\itk-4.2.1\InsightToolkit-4.2.1\Modules\Bridge\VtkGlue\include
      • Note 2: 在執行第一次編譯以前,前面提到的moc_xxx.h 和 ui_xxx.h兩個檔案,會先在實作的code內出現,不過compiler會找不到這些檔案,但是不用擔心,只要執行第一次編譯後,這兩個檔案自然就會出現,程式也可以正常執行
      • 執行結果          
  • 主要概念
    • ITK image 和 VTK image利用itkImageToVTKImageFilter相互連結
    • VTK 和 Qt 利用QVTKWidget連結
    • VTK 和 Qt的差別可以看User Guide或是其他Reference得知,而其中最主要就是利用Qt中signal/slot Connection的概念