文件齐全后,我们来尝试编译一遍OpenCV:
第一行填入我们解压的OpenCV源文件路径:
本人位置是在C:/opencv310/sources/opencv/opencv-3.1.0
第二行填入我们想存放build工程的地方:
本人设定的是:C:/opencv310/opencv-3.1.0-with-extra_modules-tbb
好了,我们点一下Configure。如果文件夹没有建立,CMake会问你是否建立,这个设计我猜是为了防止build错位置设计的吧,毕竟文件夹必然要建立。
这时,蹦出来一个窗口,让你选择编译器。我安装的是VS2015,平台x64,正常选就是了。
点Finish
然后等待读条,期间CMake会下载依赖的软件包,在我们还没选择额外的功能时,已经默认启用ffmpeg和IPP了。
如果你的网络不好,应该会出现类似如下的红色字体错误信息:
大致发生的事情是有一个文件下载失败,然后校验时发现hash不对,于是终止了configure。
Downloading opencv_ffmpeg.dll…
CMake Error at cmake/OpenCVUtils.cmake:895 (file):
file DOWNLOAD HASH mismatch
for file: [D:/Program Files
(x86)/opencv/sources/3rdparty/ffmpeg/downloads/89c783eee1c47bfc733f08334ec2e31c/opencv_ffmpeg.dll]expected hash: [89c783eee1c47bfc733f08334ec2e31c]
actual hash: [3de6314883587d538b4864070e0a749d]
status: [28;”Timeout was reached”]
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
CMake Error at cmake/OpenCVUtils.cmake:899 (message):
Failed to download opencv_ffmpeg.dll. Status=28;”Timeout was reached”
Call Stack (most recent call first):
3rdparty/ffmpeg/ffmpeg.cmake:10 (ocv_download)
cmake/OpenCVFindLibsVideo.cmake:206 (include)
CMakeLists.txt:536 (include)
首次config耗时较长,主要是下载源码中的3rdparty
文件夹中缺少的文件,如果失败的话直接再点一次configure,还不行的话请下载完整的3rdparty
文件夹,覆盖即可。
如果成功了,我们就可以在CMake里自定义工程:
红色的显示逻辑是这样的:Configure后如果出现新的选项或者有些选项的值发生了变化则用红色显示,这个和致命错误没关系。
既然我们要用到TBB,并要加入额外的contrib源码包,所以在CMake界面中做两件事:
在search栏中输入tbb
,找到WITH_TBB
并勾选。由于我们已经下载了二进制库,所以不需要勾选BUILD_TBB
,否则出错。
在search栏中输入extra_modules_path,将路径设置为C:/opencv310/sources/opencv/opencv_contrib-3.1.0/modules
,也就是contrib源码中的modules
文件夹。
在此提醒两点:
如果你安装了Python、MATLAB、CUDA,则CMake会自动勾选并根据脚本配置对应的模块。
由于本人并没有Python、MATLAB的需求,于是搜索with_matlab
,取消勾选。Python相关选项设置为空即可。
由于我们要先确保编译的正常,所以不加入CUDA这个恐怖的干扰项。搜索with_cuda
,取消勾选。
一切就绪后再点一次configure。
这次会多出来许多选项,如caffe、build那些额外模块等。我们搜索tbb_include
,找到TBB_INCLUDE_DIRS
项,将其定位到tbb库文件夹中的include文件夹:C:/opencv310/sources/tbb2017_20161004oss/include
之后再点一次configure来更新配置,之后仍搜索tbb关键字:
这里CMakeLists出错了,TBB_LIB_DIR并不是正确的路径,我们浏览到子文件夹即可:
我的IDE是VS2015,所以对应的路径应该是:C:/opencv310/sources/tbb2017_20161004oss/lib/intel64/vc14
我在这里被坑了好久,编译的时候由于和tbb相关的代码都无法完成编译,于是输出里一直提示找不到对应的库:
Fatal error linking 1>LINK : fatal error LNK1181: cannot open input file“XXXXXX.lib”
一点一点翻才发现是tbb相关的文件没找到。。。。
修改之后正确继续点configure,至此所有设置都完成了。
下一步我们点generate来生成用于IDE的工程文件。
如果generate成功,则右边按钮会变成Open_Project
,点一下即可打开IDE并载入工程:
我不需要Debug
版本的OpenCV,所以直接改为Release
。
我们右键ZERO_CHECK
项目,点生成来检查以下配置是否有严重问题。
一般情况下会很快跑完,并提示很多类似于下面的信息:
CMake does not need to re-run because
C:/opencv310/opencv-3.1.0-with-extra_modules-tbb/XXXXX/CMakeFiles/generate.stamp is up-to-date.
如果如此,则继续右键INSTALL
来生成,20分钟不到即可完成生成。
期间留意类似于库输出错误,或者找不到某文件等致命错误。
如果有,则检查一下是不是路径错了,或者源文件不完整。
下图这种提示(C4819)无所谓,不会影响编译:
一般情况下一个子项目编译成功会输出一个静态库(.lib),输出类似如下:
正在创建库
C:/opencv310/opencv-3.1.0-with-extra_modules-tbb/lib/Release/opencv_videoio310.lib
和对象
C:/opencv310/opencv-3.1.0-with-extra_modules-tbb/lib/Release/opencv_videoio310.exp
opencv_videoio.vcxproj ->
C:\opencv310\opencv-3.1.0-with-extra_modules-tbb\bin\Release\opencv_videoio310.dll
opencv_videoio.vcxproj ->
耐心等待,如果5分钟左右还没有提示错误,则离完全编译还有一步之遥。
因为你即将结束编译时很可能出现类似报错:
Fatal error linking 1>LINK : fatal error LNK1181: cannot open input file“..\..\opencv_bioinspired310.lib”
这个原因本人猜测了许多,最后顺着输出来找,没想到时编译时CMake的helper程序意外退出了。。
这个问题在GitHub和StackOverflow查了一下,许多人都遇到这个问题,本人CMake版本是3.7.0-stable。
原因是由于CMake是用递归调用正则表达式来解析文件内容的,这样简直作死啊。。。
由于一些文件注释连续使用太多的*
号导致CMake解析时自己崩溃了。而导致崩溃的正是opencv_bioinspired310模块的源文件。
废话少说,这里提供一个修改的方式来避免CMake崩溃:
https://github.com/amroamroamro/opencv_contrib/commit/4e0b7f394daa64f5b6af337d425eecb73f3feeb0
具体说就是打开位于opencv_contrib-3.1.0\modules\bioinspired\src\opencl
文件夹:
打开retina_kernel.cl
,把注释的//*********
改成别的或者删掉即可。
对于编译失败的工程,我建议直接删除,重新configure并generate再进行编译。
至此,编译完成后顺利进行了Install操作(拷贝文件到对应文件夹)
这样我们打开C:\opencv310\opencv-3.1.0-with-extra_modules-tbb\install
,里面就是我们要拷贝出来作为工程配置的文件:
有没有似曾相识的感觉?
这里简单说一下,由于我们在configure的时候并没有选中BUILD_opencv_world和BUILD_opencv_contrib_world,所以库文件是分散的,如果需要像安装程序给你的那样,请选中这两个进行编译。
否则就和OpenCV2的配置方式一样,依赖库文件写一下就是了。