OpenCV虽然会在的提供安装程序中给你一个事先编译好的二进制代码(库),但是这基本上就是一个残血版的OpenCV,所以我们需要对它重新编译来加入一些新的特性,尝试添加令人exciting的contrib模块和TBB支持。
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的工程文件,打开后即可编译出想要的东西。
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中的功能,比如TLD模块。
OpenCV编译时间比你的普通工程要长得多,不加CUDA一般不超过20分钟,加了CUDA则将近2小时,每个细节或问题都要仔细检查,不要抱着侥幸心理去执行一个不确定问题所在的build,人生苦短,何必碰运气。
CMake配置时会下载依赖的软件包(如IPP、ffmpeg等),请保证有一个能够稳定访问GitHub raw的网络,如果网络有问题则会下载失败。这个问题可以解决,我会在下面给出解决办法。
为了添加新的特性,不建议将新内容直接追加(覆盖)到原有的库中。一个是一旦编译出问题你整个库就乱了,不如重来;另一个是我对源码和CMakeLists没有达到深度理解的程度,不保证这样稳定或者能用。