Shaun 的系统环境:Win10_x64 英文企业版;VS2013-update5 英文旗舰版;CMake-3.6.3-win64-x64 免安装版;Qt-opensource-windows-x86-msvc2013-5.6.2。
*注:Shaun 写的这篇文档主要用来编译 x86 版的动态 debug 库,想编译其它类型的库请自行参考其它资料,做相关改变。( 其实如果想编译 x64 版的可以在用 VS2013 编译时将上方的 Win32 平台选择 x64 平台;想编译 release 版的可以在用 VS2013 编译时将上方的 Debug 模式选择 Release 模式;想编译静态库的可以在用 CMake 生成时取消勾选 BUILD_SHARED_LIBS 选项即可。:-P )
前言
因为 OpenCV-3.2 官方的 release 版只有支持 VS2015 的库,而且不包括扩展包( opencv_contrib )中的库,而由于某些历史原因,Shaun 目前使用的编译器还是 VS2013,又想用用扩展包中一些有趣的算法,在加上上个月 opencv-3.3 还没有正式 release,所以上个月 Shaun 就利用 VS2013 对 opencv-3.2 进行编译。具体编译过程如下:
准备篇
先在 GitHub 上下载对应的 opencv 源码包:opencv-3.2.0 和 opencv_contrib-3.2.0(https://github.com/opencv),扩展包版本一定要和 opencv 版本相同。Shaun 为了添加 Qt 后端显示支持(为了好看和方便 :-P),所以还下载安装了支持 VS2013 的 Qt-5.6.2(http://download.qt.io/archive/qt/)。再下载 CMake-3.6.3-win64-x64 免安装版(https://cmake.org/files/)。至于微软的东西,推荐直接去 MSDN 我告诉你去下载。
由于网上有的资料(具体是哪篇文章 Shaun 忘记了 o(╯□╰)o)说编译时的文件结构可能会影响编译是否成功,再加上为了方便编译管理,Shaun 编译时的文件结构为:
opencv-3.2.0_build
├── build
└── sources
├── opencv-3.2.0
└── opencv_contrib-3.2.04 directories, 0 files
其中 opencv-3.2.0 用来装 opencv-3.2.0.zip 解压后的源码;opencv_contrib-3.2.0 用来装opencv_contrib-3.2.0.zip 解压后的源码;build 用来装 CMake 编译完成后的文件。
编译篇
打开 /cmake-3.6.3-win64-x64/bin/cmake-gui.exe,在 Where is the source code 文本框中选择 /opencv-3.2.0_build/sources/opencv-3.2.0;在 Where to build the binaris 文本框中选择 /opencv-3.2.0_build/build,点击 Configure,在弹出的编译器选择框中选择 Visual Studio 12 2013,一直 Configure 直到红色的条变白。
网上有人在这一步可能会出现ffmpeg not downloaded
和“ippicv_windows_20151201.zip”not downloaded
这两个问题,Shaun 没出现这两个问题,所以没有机会验证 cmake-gui和vs2013编译opencv和opencv_contrib源码 中的解决办法是否正确。
接下来就是添加扩展包,在白色条中找到 OPENCV_EXTRA_MODULES_PATH 文本框,在其中选择 opencv_contrib 源码中 modeles 所在路径:/opencv-3.2.0_build/sources/opencv_contrib-3.2.0/modules。
至于想要支持 OpenGL 和 Qt 就需要勾选 WITH_OPENGL 和 WITH_QT 并 Configure 后选择好 Qt 的安装目录,如果配置好 Qt 的环境变量 Cmake 将会自动选择好 Qt 所在路径。
随后再次反复 Configure 直到界面不再出现红色背景,之后单击 Generate。不出意外的话,你会看到 Configure done 和 Generate done。
Shaun 在这一步出现了 VS2013_CMake_opencv3.1动态库与静态库的配置与编译 中的问题,原因是同时勾选了同时勾选了 BUILD_opencv_world 和 BUILD_opencv_contirb_world,Shaun 的解决办法是将它们全部取消勾选,再次 Configure 和 Generate。
如果上面一切顺利的话就可以进行下一步了:使用 VS2013 编译 OpenCV。打开 /opencv-3.2.0_build/build 目录,将会看到一大堆文件和文件夹,双击 /opencv-3.2.0_build/build 目录下的 OpenCV.sln,用 VS2013 打开。找到 CMakeTargets 中的 INSTALL ,然后右键选择“Project Only”-->“Build Only INSTALL”。
漫长的等待。。。。。。 (╯﹏╰)b
Shaun 在这一步出现了一个问题,具体问题和解决方法详见问题篇。
一切顺利的话,应该会比 Shaun 下面的库多两个,Shaun 最后生成的 Debug 库为:
opencv_aruco320d.lib
opencv_bgsegm320d.lib
opencv_bioinspired320d.lib
opencv_calib3d320d.lib
opencv_ccalib320d.lib
opencv_core320d.lib
opencv_datasets320d.lib
opencv_dnn320d.lib
opencv_dpm320d.lib
opencv_face320d.lib
opencv_features2d320d.lib
opencv_flann320d.lib
opencv_fuzzy320d.lib
opencv_highgui320d.lib
opencv_imgcodecs320d.lib
opencv_imgproc320d.lib
opencv_line_descriptor320d.lib
opencv_ml320d.lib
opencv_objdetect320d.lib
opencv_optflow320d.lib
opencv_phase_unwrapping320d.lib
opencv_photo320d.lib
opencv_plot320d.lib
opencv_reg320d.lib
opencv_rgbd320d.lib
opencv_saliency320d.lib
opencv_shape320d.lib
opencv_stereo320d.lib
opencv_stitching320d.lib
opencv_structured_light320d.lib
opencv_superres320d.lib
opencv_surface_matching320d.lib
opencv_text320d.lib
opencv_tracking320d.lib
opencv_video320d.lib
opencv_videoio320d.lib
opencv_videostab320d.lib
opencv_xfeatures2d320d.lib
opencv_ximgproc320d.lib
opencv_xobjdetect320d.lib
opencv_xphoto320d.lib
共41个。
配置篇
因为 Shaun 只编译了 x86 版动态 debug 库,所以以下环境配置都只针对 x86 版动态 debug 库。(其实要配置 x64 的库就只需将 x86 换成 x64 即可;要配置 release 模式的库就只需在添加附加依赖项中的库文件选择 release 模式的库(即数字后没有 d的 lib);若要配置静态库就需要选择静态库文件夹以及在附加依赖项中添加相应的静态库文件。:-P)
首先把 /opencv-3.2.0_build/build/install 中的文件都提取出来,这和 OpenCV 官方 release 的 opencv 文件结构差不多,具体两层结构如下
.
├── bin
│ └── opencv_waldboost_detectord.exe
├── etc
│ ├── haarcascades
│ └── lbpcascades
├── include
│ ├── opencv
│ └── opencv2
├── LICENSE
├── OpenCVConfig.cmake
├── OpenCVConfig-version.cmake
└── x86
└── vc129 directories, 4 files
x86 文件夹就是 VS2013 生成的对应 VS 版本 32位 的各种库,include 文件夹就是 opencv 的各项模块。Shaun 将其中提取出的文件全部放入了 C:\Program Files\OpenCV\3.2.0\build 文件夹中。
首先配置环境变量,系统(或用户)环境变量如下:
变量名 | 变量值 |
---|---|
Path | C:\Program Files\OpenCV\3.2.0\build\x86\vc12\bin |
OPENCV | C:\Program Files\OpenCV\3.2.0\build |
不然可能会报错:程序“XXXXXX”已退出,返回值为 -1073741701 (0xc000007b)。其中下面那行可以选择不要添加。
然后在 VS 中配置环境。新建工程,然后在“属性管理器”中对应项目下 Debug | Win32 文件夹右键“添加新项目属性表”。(方便一次配置,多次使用,以后再使用只要在相应项目下右键“添加现有属性表”即可),Shaun 新项目属性表取名为:opencv-3.2.0_msvc2013_x86d.props。
接下来就是真正的 VS 环境配置了:
双击打开刚才新建的属性表,选中“VC++目录”,注意在进行以下配置时建议都勾选左下角的“从父级或项目默认设置继承”
“可执行文件目录”中添加:
C:\Program Files\OpenCV\3.2.0\build\x86\vc12\bin
“包含目录”中添加:
C:\Program Files\OpenCV\3.2.0\build\include
C:\Program Files\OpenCV\3.2.0\build\include\opencv
C:\Program Files\OpenCV\3.2.0\build\include\opencv2
“库目录”中添加:
C:\Program Files\OpenCV\3.2.0\build\x86\vc12\lib
选中“链接器” –> “常规”,“附加库目录”中添加:
C:\Program Files\OpenCV\3.2.0\build\x86\vc12\lib
“链接器” –> “输入”,“附加依赖项”中添加 C:\Program Files\OpenCV\3.2.0\build\x86\vc12\lib
中数字后带 d 的库文件,即编译篇中 Shaun 最后生成的 41 个库文件。
配置完之后不要忘了右键该属性表进行保存处理,以便下个项目直接使用,不需要再重复进行配置。
最后附示例程序:
1 |
|
这里必须在 imshow 后加入 waitkey,因为 WaitKey 不止是 Wait Key 而已,它其实还涉及到消息响应,有这个函数 cv 内部的 WndProc 函数才能起作用,才会更新窗口。
最后程序运行成功并显示 lena 图,则说明编译和配置没问题。
问题篇
1、用 VS2013 编译 OpenCV 在漫长的等待阶段出现的问题。
问题描述:CVV 模块报错,TS 模块编译不出来,好在这两个模块都不是很重要,可以忽略,Shaun 强迫症也没到这种程度 O(∩_∩)O~。
解决办法: 在 CVV 模块报错后可在 CMake(不知道具体是 INSTALL 下的 CMake Rules 中的 INSTALL_force.rule,还是 ALL_BUILD 下的 CMakeLists.txt,忘记了 o(╯□╰)o)中添加 -DBUILD_opencv_cvv=OFF
忽略 CVV 模块,从而正常编译其它模块。参考 errors on build opencv with cvv module and qt5 #577。如果实在不行的话就在 CMake 生成的时候取消勾选出错模块,若是用 CMake 重新生成的话不要忘了先把 /opencv-3.2.0_build/build 目录下的文件全部删除干净。
后记
这是以前写的两篇文档,现在再来整理成一篇。
附录
既然能看到这里,说明是想在 VS 下使用 OpenCV,这里推荐一款 VS 下 OpenCV 开发调试神器:Image Watch,效果谁用谁知道。Image Watch 是 VS 的一个插件,不过它只支持 VS2012 及以上版本。使用方法为先设置断点( F9 ),随后在调试( F5 )模式下,鼠标指针悬停在 cv::Mat
类型变量上,即可出现 ,点击查看图标即可显示相应图像。
参考资料
[1] cmake-gui和vs2013编译opencv和opencv_contrib源码(http://livezingy.com/category/opencv/)
[2] VS2013_CMake_opencv3.1动态库与静态库的配置与编译(http://livezingy.com/category/opencv/)
[4] errors on build opencv with cvv module and qt5 #577
[5] VS2013中Image Watch插件的使用(OpenCV)(http://blog.csdn.net/fengbingchun/article/category/721609)