OpenCV中Viz模块的安装(VS2015)

背景
因工作需要使用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

经检查这是因为编译器无法解释vtkOBJReadervtkSTLReader这两个类,而根据文档,这两个类属于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环境变量之中。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342