最近要在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源码包,可上官网下载 http://www.vtk.org/download/
关于版本选择,还是那句话,(如果你并不需要最新版本独有的功能或对各版本区别不熟悉,还是下载前一个稳定版吧。) 这里因为我的工程用到了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 Makefilecmake一般需要多次 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).
运行结果