OpenCV 3 - 编译更强大的OpenCV(一) - 准备
2016-11-26 03:46
295 查看
这几篇文章将带你编译出一个较为完整的OpenCV库,后续还会带你集成如Eigen、CUDA等模块。
期间本人遇到国内网络导致的错误、CMakeLists的BUG、甚至编译工具的BUG。
我们先从最不容易出错地方的开始。
CMake的配置文件取名为CMakeLists.txt,OpenCV的源代码路径下有一个看起来很复杂的CMakeLists.txt。CMake解析这个文件后可以让你直观地配置OpenCV包含哪些模块,集成哪些库(比如附加的contrib模块、Eigen、CUDA、TBB等),启用什么技术特性(AVX、AVX2、SSSE3等)等等,同时也能较为方便地添加这些组件的文件路径,之后由CMake生成一个用于编译的工程文件,比如我使用VS2015,那CMake就生成一个VS的工程文件,打开后即可编译出想要的东西。
维基百科上的解释是:TBB是Intel大哥开发的一个针对多核多线程处理的C++模板库。
个人对它的认知是:我们用它可以较为简洁地实现一些常用的并行流程,比如
即使你不会使用TBB,我还是很建议你在编译的时候将TBB集成在OpenCV中。因为OpenCV的许多代码也用到了TBB,只不过默认执行的时单线程的串行代码。当你选中
CMake配置时会下载依赖的软件包(如IPP、ffmpeg等),请保证有一个能够稳定访问GitHub raw的网络,如果网络有问题则会下载失败。这个问题可以解决,我会在下面给出解决办法。
为了添加新的特性,不建议将新内容直接追加(覆盖)到原有的库中。一个是一旦编译出问题你整个库就乱了,不如重来;另一个是我对源码和CMakeLists没有达到深度理解的程度,不保证这样稳定或者能用。
https://github.com/opencv/opencv/releases
(PS 3.2.0已经从rc变成release了,编译3.2.0可以完全按着下面几章的走,由于没有bug,所以不用理会走坑所需要做的东西,按部就班添加、按部就班编译、完成,enjoy)
建议添加到书签,如果将来要编译其它(或更新的)版本也可以在此找到。
下载
由于本人C盘是SSD,为了直观和效率,我直接在根目录新建了一个名为
https://github.com/opencv/opencv_contrib/releases
下载同为3.1.0版本的源码,同样将zip压缩包里的文件夹扔进
我们打开官网后点击右上角download now按钮中
我下载的文件名称是
同样把压缩包中的文件夹扔进C:\opencv310\source`中。
期间本人遇到国内网络导致的错误、CMakeLists的BUG、甚至编译工具的BUG。
我们先从最不容易出错地方的开始。
你需要知道
OpenCV虽然会在的提供安装程序中给你一个事先编译好的二进制代码(库),但是这基本上就是一个残血版的OpenCV,所以我们需要对它重新编译来加入一些新的特性,尝试添加令人exciting的contrib模块和TBB支持。何为CMake
CMake是一个自动化搭建Build流程的系统,通过发布者预先编辑好针对CMake的配置文件,开发者可以通过CMake便捷地来调整需要Build的内容。CMake会在配置过程中自动按需调整源码依赖关系等细节。CMake的配置文件取名为CMakeLists.txt,OpenCV的源代码路径下有一个看起来很复杂的CMakeLists.txt。CMake解析这个文件后可以让你直观地配置OpenCV包含哪些模块,集成哪些库(比如附加的contrib模块、Eigen、CUDA、TBB等),启用什么技术特性(AVX、AVX2、SSSE3等)等等,同时也能较为方便地添加这些组件的文件路径,之后由CMake生成一个用于编译的工程文件,比如我使用VS2015,那CMake就生成一个VS的工程文件,打开后即可编译出想要的东西。
何为TBB
Threading Building Blocks (TBB) is a C++ template library developed by Intel for parallel programming on multi-core processors. Using TBB, a computation is broken down into tasks that can run in parallel. The library manages and schedules threads to execute these tasks.维基百科上的解释是:TBB是Intel大哥开发的一个针对多核多线程处理的C++模板库。
个人对它的认知是:我们用它可以较为简洁地实现一些常用的并行流程,比如
parallel_for这个函数,扔进去你的函数入口,便可以用来实现多线程的for逻辑。当然你要使用它的前提在于你能够用TBB让你的程序更高效。
即使你不会使用TBB,我还是很建议你在编译的时候将TBB集成在OpenCV中。因为OpenCV的许多代码也用到了TBB,只不过默认执行的时单线程的串行代码。当你选中
WITH_TBB时,CMake会修改cvconfig.h文件,在里面添加一行#define HAVE_TBB,这样便能在一些模块中切换至TBB版的代码使用并行处理来提高速度。
OpenCV的contrib模块
简言之就是一些技术比较新,但是还不是很适合(性能、稳定性、甚至版权等因素)默认集成在OpenCV中的功能,比如TLD模块。有言在先
OpenCV编译时间比你的普通工程要长得多,不加CUDA一般不超过20分钟,加了CUDA则将近2小时,每个细节或问题都要仔细检查,不要抱着侥幸心理去执行一个不确定问题所在的build,人生苦短,何必碰运气。CMake配置时会下载依赖的软件包(如IPP、ffmpeg等),请保证有一个能够稳定访问GitHub raw的网络,如果网络有问题则会下载失败。这个问题可以解决,我会在下面给出解决办法。
为了添加新的特性,不建议将新内容直接追加(覆盖)到原有的库中。一个是一旦编译出问题你整个库就乱了,不如重来;另一个是我对源码和CMakeLists没有达到深度理解的程度,不保证这样稳定或者能用。
下载必要组件
OpenCV源码
本次编译的版本是OpenCV3.1.0,为了获取最新发布的稳定版本,我们直接访问:https://github.com/opencv/opencv/releases
(PS 3.2.0已经从rc变成release了,编译3.2.0可以完全按着下面几章的走,由于没有bug,所以不用理会走坑所需要做的东西,按部就班添加、按部就班编译、完成,enjoy)
建议添加到书签,如果将来要编译其它(或更新的)版本也可以在此找到。
下载
Source code (zip)并解压到一个不带中文路径的地方。
由于本人C盘是SSD,为了直观和效率,我直接在根目录新建了一个名为
opencv310的文件夹,并把压缩包内的文件夹解压在
C:\opencv310\source\opencv\中。
OpenCV_contrib源码
本次编译的版本是OpenCV3.1.0,为了获取配套的稳定版本,我们直接访问:https://github.com/opencv/opencv_contrib/releases
下载同为3.1.0版本的源码,同样将zip压缩包里的文件夹扔进
C:\opencv310\source\opencv\中。
TBB库
官网https://www.threadingbuildingblocks.org/,但是这个无害的网站被我国禁止访问了(靠)。我们打开官网后点击右上角download now按钮中
All Operating Systems & Previous Releases »字样,选择操作系统即可下载库的压缩包。
我下载的文件名称是
tbb2017_20161004oss_win.zip,更新的版本也可以使用,但一定不要直接下载源码并把目录扔给CMake,我们要下载的是针对操作系统编译好的二进制库。
同样把压缩包中的文件夹扔进C:\opencv310\source`中。
CMake程序
官方下载https://cmake.org/download/,我选择的是发此文时最新的3.7.0的x64安装包cmake-3.7.0-win64-x64.msi,一路下一步,为了方便,别忘了勾选创建桌面快捷方式。
下一节我将示范如何一步一步配置并编译出我们需要的OpenCV
相关文章推荐
- OpenCV 3 - 编译更强大的OpenCV(二) - 拼人品时刻
- OpenCV 3 - 编译更强大的OpenCV(三) - BUG与崩溃齐飞(续1s)一点小补充
- OpenCV 3 - 编译更强大的OpenCV(三) - BUG与崩溃齐飞
- 【转】用VC2008编译最新SVN版本OpenCV源代码
- opencv之在Linux下编译opencv程序的两种方式g++、cmake
- win32下安装mingw32和cmake来编译opencv2.4.9
- opencv和vs 编译生成的程序如何运行在没有安装的电脑上
- arm板中编译opencv3.1.0
- OpenCV3.1编译
- VS2015+CMake编译OpenCV2.4.13静态库
- codeblocks编译opencv3小记
- OPENCV 1.0 RC1 版本安装时的编译错误修正
- 重新编译Opencv:Opencv3.2.0+CUDA7.5+VS2013+Cmake3.8+Quadro K620显卡+Win7系统
- (zybo)Qt&Opencv host编译环境和交叉编译环境的搭建
- Ubuntu 12.04 编译安装 OpenCV2.4.8 过程笔记
- xubuntu编译OpencV2.4.2出现make交叉编译出现错误。
- OpenCv在MinGW编译时问题
- opencv2.2编译小结
- CMake 编译openCV静态库(*.a)for 安卓
- opencv在编译报错的汇总