背景
因工作需要使用openCV中的Viz模块,而默认的OpenCV包是不含viz模块的。故需特别安装,现将安装过程简要记录如下,以作备忘。
OpenCV 2.4.13
VTK 7.1.1
CMake-Gui 3.10.1
Visual Studio 2015
Windows 10 x64
安装过程
0. 安装Cmake
无论是VTK还是OpenCV的安装都需要先使用CMake生成VS工程文件,所以必须在正式开始安装之前准备好CMake。我是用的是Cmake-Gui 3.10.1,可以在这里下载到。CMake的安装很简单,不再赘述。
1. 编译安装VTK
因为OpenCV的viz模块是基于VTK库的,所以在安装viz之前必须先安装VTK库。VTK库的源文件在www.vtk.org可以下载到。我选择了7.1.0版本。将源文件解压到某文件夹,如:D:\VTK-7.1.1
。
打开Cmake-GUI,在第一行where is the source code中选择上面解压的源文件,即D:\VTK-7.1.1
。第二行where to build the binaries选择生成结果的目标位置,这里我选择D:\VTK-7.1.1build
。点击Configure,第一次Configuration时会让你选择生成器。这里选择 "Visual Studio 14 2015"。这里如果选错了,会发生如下错误:
CMake Error at CMakeLists.txt:64 (project):
Failed to run MSBuild command:
MSBuild.exe
to get the value of VCTargetsPath:
这时可以换一个生成结果的目标位置再次点击Configure,然后会再次让你选择生成器。
这个生成过程会持续一小段时间。之后会在Cmake界面出现一系列配置选项。其中需要做三处修改:
- 选中BUild_SHARED_LIBS项
- 取消选中BUILD_EXAMPLES项
- 取消选中BUILD_TESTING项
后两处操作主要是为了加快生成速度。修改完成后点击Generate生成VS工程文件。这个过程持续时间更长。
生成完毕后用管理员身份打开D:\VTK-7.1.1build中的VTK.sln
或者用管理员身份运行VS2015然后从程序内打开这个sln文件。在这个个工程中右键单击ALL_BUILD项目然后选择build。我分别用debug x64和release x64进行了build。这个也要持续很久。
build完ALL_BUILD项目之后,右键单机INSTALL项目,选择Projekt Only ->Build Only INSTALL
以完成安装过程。注意如果之前没有使用管理员身份运行,这里可能会安装失败。至此VTK安装完成。默认安装在C:\Program Files\VTK
2. 编译OpenCV
在网上下载好OpenCV的源代码或windows安装文件。在使用windows安装文件后,源代码和编译后的文件会分别解压到build和source文件夹。但是这个build中是不包含viz模块的。如果要使用viz模块必须自行手动编译。如果使用OpenCV 3.0以上版本,根据相关教程,可能还需要在这里下载OpenCV contrib模块。这个模块集成了一些实验性功能的源代码。但是我是用的是OpenCV 2.4.13版本,viz的源代码已经集成在source文件夹中了,无需单独下载,只需要手动编译。
与VTK安装过程类似,在Cmake的第一行选择Opencv的source文件夹,比如D:\opencv\sources
。第二行选择输出位置,比如D:\opencv-build
。同样的选择生成器为VS 2015完成Configuration。完成后会出现一系列编译选项。其中比较重要的是必须选中WITH_VTK
项并且令VTK_DIR=C:/Program Files/VTK/lib/cmake/vtk-7.1
(VTK安装目录。某些教程也说选择VTKbuild目录,即D:\VTK-7.1.1build
·)。如果没有VTK_DIR选项可能需要先点击一下Generate之后会出现。
这时可能出现下列警告,但是无需理会。
CMake Warning at cmake/OpenCVPackaging.cmake:23 (message):
CPACK_PACKAGE_VERSION does not match version provided by version.hpp
header!
Call Stack (most recent call first):
CMakeLists.txt:1103 (include)
生成之后,同样用管理员身份打开OpenCV.sln工程文件。打开之后分别用release和debug模式build ALL_BUILD模块。然后再同样地分别用release和debug模式build INSTALL。
在这一过程我遇到了下列错误:
1> Creating library D:/opencv-build2/lib/Release/opencv_viz2413.lib and object D:/opencv-build2/lib/Release/opencv_viz2413.exp
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkOBJReader * __cdecl vtkOBJReader::New(void)" (__imp_?New@vtkOBJReader@@SAPEAV1@XZ) referenced in function "public: static class vtkSmartPointer<class vtkOBJReader> __cdecl vtkSmartPointer<class vtkOBJReader>::New(void)" (?New@?$vtkSmartPointer@VvtkOBJReader@@@@SA?AV1@XZ)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkOBJReader * __cdecl vtkOBJReader::SafeDownCast(class vtkObjectBase *)" (__imp_?SafeDownCast@vtkOBJReader@@SAPEAV1@PEAVvtkObjectBase@@@Z) referenced in function "class cv::Mat __cdecl cv::viz::readCloud(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_OutputArray const &,class cv::_OutputArray const &)" (?readCloud@viz@cv@@YA?AVMat@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_OutputArray@2@1@Z)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkSTLReader * __cdecl vtkSTLReader::SafeDownCast(class vtkObjectBase *)" (__imp_?SafeDownCast@vtkSTLReader@@SAPEAV1@PEAVvtkObjectBase@@@Z) referenced in function "class cv::Mat __cdecl cv::viz::readCloud(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class cv::_OutputArray const &,class cv::_OutputArray const &)" (?readCloud@viz@cv@@YA?AVMat@2@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEBV_OutputArray@2@1@Z)
1>vizcore.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class vtkSTLReader * __cdecl vtkSTLReader::New(void)" (__imp_?New@vtkSTLReader@@SAPEAV1@XZ) referenced in function "public: static class vtkSmartPointer<class vtkSTLReader> __cdecl vtkSmartPointer<class vtkSTLReader>::New(void)" (?New@?$vtkSmartPointer@VvtkSTLReader@@@@SA?AV1@XZ)
1>D:\opencv-build2\bin\Release\opencv_viz2413.dll : fatal error LNK1120: 4 unresolved externals
经检查这是因为编译器无法解释vtkOBJReader
和vtkSTLReader
这两个类,而根据文档,这两个类属于vtkIOGeometry模块。所以只需要在编译器配置中加上这一个模块即可。具体的,右键点击opencv_viz
,然后在preperties->Linker->Input->Additional Dependencies
中加入C:\Program Files\VTK\lib\vtkIOGeometry-7.1.lib
即可顺利完成编译过程。
截至目前含有viz模块的OpenCV安装完成。但是要在程序中正常调用还需要配置Visual Studio的编译器设置。这一过程可以参考标准OpenCV在Visual Studio的配置过程。相关的教程和教学视频在网上非常丰富了,此处不再赘述。需要注意的是,在使用viz的时候会间接用到VTK的动态链接库,所以也要将VTK的库的位置加入到windows环境变量之中。