1. 程式人生 > >Mac下安裝VTK6.2,並在Qt上使用VTK

Mac下安裝VTK6.2,並在Qt上使用VTK

最近要在mac執行一個Qt工程,需要使用OpenCV+ITK+VTK,搞了好久才搞定。我只想說,vtk+itk在mac上的資料真心少,雖然osx和linux的安裝配置大體一樣,但是就是那些許差異埋得坑真是磨人(特別是對於身為新手而言,淚奔啊´╮(╯﹏╰)╭ 。所以搞定之後打算好好寫個部落格記錄自己踩過的坑,也供給他人提供經驗少踩坑。

這邊部落格主要記錄Mac上VTK的安裝,和如何在Qt上使用VTK

環境:
- Mac OSX 10.11.2
- OpenCV3.0
- Qt 5
- QtCreator 3.5
- cmake version 3.5.2

VTK的安裝

  1. 下載VTK原始碼包,可上官網下載

    http://www.vtk.org/download/
    關於版本選擇,還是那句話,(如果你並不需要最新版本獨有的功能或對各版本區別不熟悉,還是下載前一個穩定版吧。) 這裡因為我的工程用到了vtkRenderingFreeTypeOpenGL模組,而這個模組在VTK6.3被更改捨棄,所以為了正常執行我已有的工程,我選擇了VTK6.2。在此提供多版本下載地址https://gitlab.kitware.com/vtk/vtk/tags

  2. 解壓VTK原始碼包

  3. 進入目錄建立build資料夾,存放編譯檔案

  4. 通過cmake配置並編譯,這裡可以用cmake GUI工具,或者直接在終端下用命令列ccmake配置。新手推薦使用GUI。
    以下為 cmake GUI介面,選擇你的VTK目錄及其build目錄,按左下角的configure配置,選擇生成Unix Makefile
    這裡寫圖片描述

  5. cmake一般需要多次 configure > 紅色警告,修改配置 >再次configure; 直到無紅色警告再Generate。

    列出需要的cmake配置及可能碰到的問題1

主要配置

BUILD_SHARED_LIBS                ON
VTK_Group_Qt                     ON
VTK_QT_VERSION                  5
QT_QMAKE_EXECUTABLE          /Users/jerry/Applications/Qt/5.5/clang_64/bin/qmake
 Qt5_DIR                         /Users/jerry/Applications/Qt/5.5
/clang_64/lib/cmake/Qt5
  • 預設是選擇Qt4,如果你使用Qt5第一次configure之後會提示Qt版本錯誤
  • QT_QMAKE_EXECUTABLE 和 Qt5_DIR 與你Qt得安裝路徑相關,其中Qt5_DIR配置完之後如果不能自動檢測Qt5各個模組的q make,需要手動配置。

    QT_QMAKE_EXECUTABLE /Users/jerry/Applications/Qt/5.5/clang_64/bin/qmake
    Qt5Core_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Core
    Qt5Designer_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Designer
    Qt5Gui_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Gui
    Qt5Network_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Network
    Qt5OpenGL_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5OpenGL
    Qt5Sql_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Sql
    Qt5UiPlugin_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5UiPlugin
    Qt5WebKitWidgets_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5WebKitWidgets
    Qt5WebKit_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5WebKit
    Qt5Widgets_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Widgets
    Qt5Xml_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5Xml
    Qt5_DIR /Users/jerry/Applications/Qt/5.5/clang_64/lib/cmake/Qt5

這裡寫圖片描述

  1. 終端到 build目錄下,執行make -j8,其中-j8 為多執行緒執行命令,加速編譯過程
  2. 最後安裝 make install -j8,這樣就安裝王完成了。

開啟Qt Creator建立新工程

  1. 新建工程 > New Project
  2. 選擇專案Application > Qt Widgets Application > next
  3. 工程名tesVTK,工程路徑
  4. 之後一直預設選擇,建立完成。

工程建立之後的目錄如下

☁  Qt  tree testOpenCV
testVTK
├── main.cpp
├── mainwindow.cpp
├── mainwindow.h
├── mainwindow.ui
├── testVTK.pro
└── testVTK.pro.user

0 directories, 6 files

對新建工程配置VTK路徑連結

工程中的testVTK.pro即為工程自動生成的配置檔案,我們只需要在此檔案上新增需要用的配置,當然如果不知道自己用到哪些連結庫,可全部新增。

INCLUDEPATH+= /usr/local/include/vtk-6.2
LIBS +=-L/usr/local/lib -lvtkChartsCore-6.2.1 \
-lvtkCommonColor-6.2.1 \
-lvtkCommonComputationalGeometry-6.2.1 \
-lvtkCommonCore-6.2.1 \
-lvtkCommonDataModel-6.2.1 \
-lvtkCommonExecutionModel-6.2.1 \
-lvtkCommonMath-6.2.1 \
-lvtkCommonMisc-6.2.1 \
-lvtkCommonSystem-6.2.1 \
-lvtkCommonTransforms-6.2.1 \
-lvtkDICOMParser-6.2.1 \
-lvtkDomainsChemistry-6.2.1 \
-lvtkFiltersAMR-6.2.1 \
-lvtkFiltersCore-6.2.1 \
-lvtkFiltersExtraction-6.2.1 \
-lvtkFiltersFlowPaths-6.2.1 \
-lvtkFiltersGeneral-6.2.1 \
-lvtkFiltersGeneric-6.2.1 \
-lvtkFiltersGeometry-6.2.1 \
-lvtkFiltersHybrid-6.2.1 \
-lvtkFiltersHyperTree-6.2.1 \
-lvtkFiltersImaging-6.2.1 \
-lvtkFiltersModeling-6.2.1 \
-lvtkFiltersParallel-6.2.1 \
-lvtkFiltersParallelImaging-6.2.1 \
-lvtkFiltersProgrammable-6.2.1 \
-lvtkFiltersSMP-6.2.1 \
-lvtkFiltersSelection-6.2.1 \
-lvtkFiltersSources-6.2.1 \
-lvtkFiltersStatistics-6.2.1 \
-lvtkFiltersTexture-6.2.1 \
-lvtkFiltersVerdict-6.2.1 \
-lvtkGUISupportQt-6.2.1 \
-lvtkGUISupportQtOpenGL-6.2.1 \
-lvtkGUISupportQtSQL-6.2.1 \
-lvtkGUISupportQtWebkit-6.2.1 \
-lvtkGeovisCore-6.2.1 \
-lvtkIOAMR-6.2.1 \
-lvtkIOCore-6.2.1 \
-lvtkIOEnSight-6.2.1 \
-lvtkIOExodus-6.2.1 \
-lvtkIOExport-6.2.1 \
-lvtkIOGeometry-6.2.1 \
-lvtkIOImage-6.2.1 \
-lvtkIOImport-6.2.1 \
-lvtkIOInfovis-6.2.1 \
-lvtkIOLSDyna-6.2.1 \
-lvtkIOLegacy-6.2.1 \
-lvtkIOMINC-6.2.1 \
-lvtkIOMovie-6.2.1 \
-lvtkIONetCDF-6.2.1 \
-lvtkIOPLY-6.2.1 \
-lvtkIOParallel-6.2.1 \
-lvtkIOParallelXML-6.2.1 \
-lvtkIOSQL-6.2.1 \
-lvtkIOVideo-6.2.1 \
-lvtkIOXML-6.2.1 \
-lvtkIOXMLParser-6.2.1 \
-lvtkImagingColor-6.2.1 \
-lvtkImagingCore-6.2.1 \
-lvtkImagingFourier-6.2.1 \
-lvtkImagingGeneral-6.2.1 \
-lvtkImagingHybrid-6.2.1 \
-lvtkImagingMath-6.2.1 \
-lvtkImagingMorphological-6.2.1 \
-lvtkImagingSources-6.2.1 \
-lvtkImagingStatistics-6.2.1 \
-lvtkImagingStencil-6.2.1 \
-lvtkInfovisCore-6.2.1 \
-lvtkInfovisLayout-6.2.1 \
-lvtkInteractionImage-6.2.1 \
-lvtkInteractionStyle-6.2.1 \
-lvtkInteractionWidgets-6.2.1 \
-lvtkNetCDF-6.2.1 \
-lvtkNetCDF_cxx-6.2.1 \
-lvtkParallelCore-6.2.1 \
-lvtkRenderingAnnotation-6.2.1 \
-lvtkRenderingContext2D-6.2.1 \
-lvtkRenderingContextOpenGL-6.2.1 \
-lvtkRenderingCore-6.2.1 \
-lvtkRenderingFreeType-6.2.1 \
-lvtkRenderingFreeTypeOpenGL-6.2.1 \
-lvtkRenderingGL2PS-6.2.1 \
-lvtkRenderingImage-6.2.1 \
-lvtkRenderingLIC-6.2.1 \
-lvtkRenderingLOD-6.2.1 \
-lvtkRenderingLabel-6.2.1 \
-lvtkRenderingOpenGL-6.2.1 \
-lvtkRenderingQt-6.2.1 \
-lvtkRenderingVolume-6.2.1 \
-lvtkRenderingVolumeOpenGL-6.2.1 \
-lvtkViewsContext2D-6.2.1 \
-lvtkViewsCore-6.2.1 \
-lvtkViewsInfovis-6.2.1 \
-lvtkViewsQt-6.2.1 \
-lvtkalglib-6.2.1 \
-lvtkexoIIc-6.2.1 \
-lvtkexpat-6.2.1 \
-lvtkfreetype-6.2.1 \
-lvtkftgl-6.2.1 \
-lvtkgl2ps-6.2.1 \
-lvtkhdf5-6.2.1 \
-lvtkhdf5_hl-6.2.1 \
-lvtkjpeg-6.2.1 \
-lvtkjsoncpp-6.2.1 \
-lvtklibxml2-6.2.1 \
-lvtkmetaio-6.2.1 \
-lvtkoggtheora-6.2.1 \
-lvtkpng-6.2.1 \
-lvtkproj4-6.2.1 \
-lvtksqlite-6.2.1 \
-lvtksys-6.2.1 \
-lvtktiff-6.2.1 \
-lvtkverdict-6.2.1 \
-lvtkzlib-6.2.1

VTK安裝路徑一般在/usr/local/include 和 /usr/local/lib下。mac下的動態連結庫字尾是.dylib,如libopencv_core.dylib,配置時需把lib 改成 -l,去掉.dylib。這裡對於有個技巧可以列出所有的連結庫,使用ls -1 /usr/local/lib/libvtk*命令單列列出連結庫,複製文字再替換就行了。

編譯執行例子

修改main.cpp如下

#include "mainwindow.h"
#include <QApplication>

//int main(int argc, char *argv[])
//{
//    QApplication a(argc, argv);
//    MainWindow w;
//    w.show();

//    return a.exec();
//}
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)

#include <vtkVersion.h>
#include <vtkPlaneSource.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>


int main(int, char *[])
{
  // Create a plane
  vtkSmartPointer<vtkPlaneSource> planeSource =
    vtkSmartPointer<vtkPlaneSource>::New();
  planeSource->SetCenter(1.0, 0.0, 0.0);
  planeSource->SetNormal(1.0, 0.0, 1.0);
  planeSource->Update();

  vtkPolyData* plane = planeSource->GetOutput();

  // Create a mapper and actor
  vtkSmartPointer<vtkPolyDataMapper> mapper =
    vtkSmartPointer<vtkPolyDataMapper>::New();
#if VTK_MAJOR_VERSION <= 5
  mapper->SetInput(plane);
#else
  mapper->SetInputData(plane);
#endif

  vtkSmartPointer<vtkActor> actor =
    vtkSmartPointer<vtkActor>::New();
  actor->SetMapper(mapper);

  // Create a renderer, render window and interactor
  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  renderWindowInteractor->SetRenderWindow(renderWindow);

  // Add the actors to the scene
  renderer->AddActor(actor);
  renderer->SetBackground(.1,.2,.3); // Background color dark blue

  // Render and interact
  renderWindow->Render();
  renderWindowInteractor->Start();

  return EXIT_SUCCESS;
}

最後可以編譯運行了:Build the project (Build » Build Project or Ctrl+B) and run it (Build » Run or Ctrl+R).

執行結果
這裡寫圖片描述

References: