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的安裝
下載VTK原始碼包,可上官網下載
關於版本選擇,還是那句話,(如果你並不需要最新版本獨有的功能或對各版本區別不熟悉,還是下載前一個穩定版吧。) 這裡因為我的工程用到了vtkRenderingFreeTypeOpenGL模組,而這個模組在VTK6.3被更改捨棄,所以為了正常執行我已有的工程,我選擇了VTK6.2。在此提供多版本下載地址https://gitlab.kitware.com/vtk/vtk/tags解壓VTK原始碼包
進入目錄建立build資料夾,存放編譯檔案
通過cmake配置並編譯,這裡可以用cmake GUI工具,或者直接在終端下用命令列ccmake配置。新手推薦使用GUI。
以下為 cmake GUI介面,選擇你的VTK目錄及其build目錄,按左下角的configure配置,選擇生成Unix Makefile
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
- 終端到 build目錄下,執行
make -j8
,其中-j8
為多執行緒執行命令,加速編譯過程 - 最後安裝
make install -j8
,這樣就安裝王完成了。
開啟Qt Creator建立新工程
- 新建工程 > New Project
- 選擇專案Application > Qt Widgets Application > next
- 工程名tesVTK,工程路徑
- 之後一直預設選擇,建立完成。
工程建立之後的目錄如下
☁ 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).
執行結果