准备
使用OpenCV 3.1.0进行图像处理时,需要用到surf、sift等匹配算法,在官网下载的安装包解压得到的工具库中,不包含这些算法库(版权还是别的原因),需要自己编译。如果使用2.x版本,这些算法库包含在nonfree中,在3.0之后的版本中,这些算法库包含在xfeature2d中。
首先下载OpenCV-3.1.0的源代码,官网的下载页面: https://opencv.org/releases/page/4/ ,或者直接点击链接下载: https://github.com/opencv/opencv/archive/3.1.0.zip ,仓库地址:https://github.com/opencv/opencv/releases/tag/3.1.0
然后我们需要下载OpenCV的额外模块(Extra Modules),仓库地址:https://github.com/opencv/opencv_contrib ,opencv_contrib的版本需要适配OpenCV的版本,在release页面(https://github.com/opencv/opencv_contrib/releases?after=3.4.1 )找到3.1.0(https://github.com/opencv/opencv_contrib/releases/tag/3.1.0 ),下载源代码
将下载的两个安装包解压到当前文件夹
配置编译生成VS工程文件
编译器的选择:VS2013 or VS2015?
编译需要用到CMake(下载地址:https://cmake.org/download/ ),同时要求电脑上装有VS或Qt(作为编译器使用)。打开CMake,把opencv-3.1.0里边的CMakeLists.txt拖到CMake中,然后把构建目录的文件夹改为opencv-3.1.0-build,如图:
点击Configure进行编译(提示创建文件夹,选“是”),编译器选择目标IDE(如VS2013、VS2015)。
这影响的是最终生成的dll适配的平台版本,如果选择Visual Studio 12 2013,最终在install文件夹中将会生成vc12下的dll和lib,这个版本对应VS工程的平台工具集(vc12对应v120,vc14对应v140,可以在工程的属性页查看并配置)。
第一个错误:FFMpeg下载失败
解决参考:https://blog.csdn.net/yiyuehuan/article/details/52951574
不出意外的话此时会报错:Error in configuration process, project files may be invalid.
检查错误发现:
错误原因:FFMpeg下载失败,有可能是下载链接失效或者无法访问到远程仓库地址(编译旧版本C++库的时候可能存在类似问题),我们首先定位到第三方库的下载配置处:opencv-3.1.0\3rdparty\ffmpeg,打开ffmpeg.cmake
我们先打开第三方库的远程仓库链接(https://github.com/opencv/opencv_3rdparty ),找到分支master_20150703(https://github.com/opencv/opencv_3rdparty/tree/ffmpeg/master_20150703 ),把需要的三个文件手动下载下来,并且将ffmpeg.cmake中的三条下载命令注释掉
1 | # Binary branch name: ffmpeg/master_20150703 |
下载完成并注释后,重新打开CMake,点击Configure
第二个错误:ippicv下载失败
第二个错误出现了:
同样的方法,定位到opencv-3.1.0\3rdparty\ippicv,打开downloader.cmake,查看我们需要手动下载的文件。文件中的意思是,当编译的平台为WIN32且不为ARM时,获取包名为ippicv_windows_20151201.zip的文件,包中的子目录名为ippicv_win;ICV的解压目录为/unpack。
来到远程仓库(https://github.com/opencv/opencv_3rdparty/tree/ippicv/master_20151201 ),在这里面发现了我们需要的文件:
我们在downloader.cmake的同级目录下创建文件夹unpack(cmake文件中指定的解压目录),将下载的ippicv_windows_20151201.zip下载到这个文件夹中,然后解压到当前文件夹(根据cmake文件中的语句进行操作),得到如下目录结构:
接着回头把downloader.cmake中的下载语句注释掉,注释后的文件文本内容为:
1 | # |
完成后打开CMake,点击Configure,不出意外的话此时不会报错了
引入opencv_contrib
找到变量OPENCV_EXTRA_MODULES_PATH,把opencv_contrib-3.1.0的绝对路径填进去,然后点击Generate,就开始生成了
如果这边opencv_contrib的版本和opencv的版本不一样,可能会产生奇怪的错误。解决的最好办法就是版本适配,否则极有可能瞎折腾。生成结束后,CMake中提示如下:
使用VS生成dll和lib
打开opencv-3.1.0-build,使用VS2013(与编译器对应)打开里边的OpenCV.sln文件,在“生成-批生成”中先把ALL_BUILD的两个勾打上,点击“生成”
待其结束后,勾选INSTALL后的两个勾,进行生成
第一个错误:没有生成“object”文件
错误代码:error C2220
提示信息:error C2220: 警告被视为错误 - 没有生成“object”文件
解决方法:把build文件夹清空,打开CMake重新点击Generate,再进行生成
可能出现的一个错误:缺少python27_d.lib
我进行了两次编译,第一次使用opencv-3.1.0.exe解压的source作为源码进行编译,第二次直接下载opencv-3.1.0.zip的源码进行编译。在第一次编译中,遇到一个问题,生成时提示缺少python27_d.lib文件,报错,后来通过修改工程文件解决了这个问题。但是在直接使用源码编译时,并没有出现这个错误。下面是解决这个错误的方法记录。
错误 24 error LNK1104: 无法打开文件“python27_d.lib”
在OpenCV项目的bindings中的opencv_python项目中,点击外部依赖项,在其中找到pyconfig.h和object.h文件,修改其中对python27_d.dll的使用
在pyconfig.h中
将
1 |
修改为:
1 |
|
将
1 | /* For an MSVC DLL, we can nominate the .lib files used by extensions */ |
修改为
1 | /* For an MSVC DLL, we can nominate the .lib files used by extensions */ |
在object.h中
将
1 | /* Py_DEBUG implies Py_TRACE_REFS. */ |
修改为
1 | /* Py_DEBUG implies Py_TRACE_REFS. */ |
整合dll和lib
生成成功后,在opencv-3.1.0-build目录下生成了一个install文件夹,里边的include和x86文件夹是我们最终需要的东西
首先过河拆桥,把3.1.0文件夹重命名为3.1.0-,然后新建3.1.0的空文件夹,把include和x86拷贝到新的3.1.0文件夹下
接着需要区分一下debug和release版本,打开x86/vc12,把staticlib删掉,把lib重命名为lib-,并新建dll和lib文件夹
首先进入dll,新建两个文件夹:debug和release,把bin文件夹中所有以310d.dll结尾的dll文件全部移动到debug文件夹下,以310.dll结尾的dll文件全部移动到release文件夹下。然后把bin删掉。
接着在新建的lib文件夹中同样创建两个文件夹:debug和release,把lib-中所有以310d.lib结尾的lib文件移动到debug文件夹下,……(操作同dll)。然后删掉lib-文件夹。
这样三件套就集齐了,可以把整个3.1.0-文件夹删掉了。
还蛮占空间的