-
一 为何要自己编译?
-
因为官网下载的安装包解压出来的库使用的编译器与自己的编译器版本不同,所以即使编译项目成功了,但运行时会导致一些莫名其妙的错误。如下,
例如:在安装目录的build目录下看到64位C++接口的库只有vc11和vc12这两个版本,而我目前使用的编译器是Microsoft Visual C++ Compiler 14.0,需要的是vc14的版本,至于mingw的更没有了。
二 编译准备
编译环境是64位win7+vs2015
- 下载安装cmake
- 下载opencv源码
三 使用vs2015编译
step 1 用cmake转换工程文件sln
打开
cmake-gui.exe
选择opencv源代码和构建目录。点击configure配置弹出编译器选项如下
- 可以勾选第一个默认的,点击确认后,它会自动搜索你本地默认的编译环境如下图1,如果OK,会显示configure done如图2
图1
图2
- 也可以自己指定本地其它编译器,先清除上面的配置(点击file–>delete cache),我使用的是vs2015,64位环境,所以选择上述配置,勾选第二项
specify native compilers
,再次点击configure弹出编译器路径填写框如下
msvc的c,c++编译器是下面的cl.exe,32位的x86目录下,还有arm版的自己要编译哪个版本就选哪个吧。
D:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe
如果想用mingw编译那就选择MinGW makefile,不过前提是你要先配置好mingw的编译环境。这里推荐了,直接用QT来编译更省心。
- 可以勾选第一个默认的,点击确认后,它会自动搜索你本地默认的编译环境如下图1,如果OK,会显示configure done如图2
配置好编译器后,配置显示框中显示红色,此时你可以勾选你需要编译模块,特性,测试用例等等。这里勾选上with _qt,with_opengl,去掉build_test。其它自己看着办吧。配置好后点击generator生成工程文件,成功时显示
Generating done
step 2 使用vs2015打开工程编译
上步OK后可以直接点击Open Project使用默认的vs打开工程文件,也可以自己到构建目录下打开OpenCV.sln这个工程文件。打开后如下
默认当前项目是all_build,选择debug,release各生成一次就得到对应的库和插件了
- 安装:
生成的lib和dll,会在构建目录的lib和bin下,这时不要急着手动拷贝,工程里面有个安装工程INSTALL,选择生成,它会自动帮你拷贝到install目录下,并且include目录也拷全了,不用一个一个去找。
step 3 配置运行opencv的环境
修改系统PATH变量,添加opencv的dll所在到目录bin到PATH中去。如果不添加你在运行带有opencv函数的程序时因无法找到dll而无法启动,比如qt上是出现the CDB process terminated错误。
三 使用用QT编译opencv
原来用qt编译opencv更方便,详情请看Qt5.6+MinGW4.9.2+OpenCV3.1+Win10开发环境搭建
,只要在QT kit上配置好cmake,用QT打开opencv项目中的CMakeLists.txt文件就OK了。然后可以直接选用QT里的kit配置,QT就会自动配置相关的编译环境了生成对应编译工程文件,省了手动生成工程的麻烦。
而相应的选择WITH_QT等可以到项目的cmake里选择。构建步骤里选择install就行了,无论是msvc还是mingw都可以选择编译。
又学到一招,今后所有有cmake配置的项目都可以用QT这样子编译了。
四 QT中的opencv配置
1. 添加opencv头文件和库文件
在工程文件.pro中添加opencv的库文件,debug和release都添加了。
```
INCLUDEPATH += F:\BaiduYunDownload\opencv\install\include
win32:CONFIG(release, debug|release):{
LIBS += -LF:\BaiduYunDownload\opencv\install\x64\vc14\lib \
-lopencv_core2413\
-lopencv_highgui2413\
-lopencv_imgproc2413\
-lopencv_calib3d2413\
-lopencv_contrib2413\
-lopencv_features2d2413\
-lopencv_flann2413\
-lopencv_gpu2413\
-lopencv_legacy2413\
-lopencv_ml2413\
-lopencv_nonfree2413\
-lopencv_objdetect2413\
-lopencv_video2413\
-lopencv_videostab2413\
-lopencv_ts2413\
-lopencv_superres2413\
-lopencv_stitching2413\
-lopencv_photo2413\
-lopencv_ocl2413
}
else:win32:CONFIG(debug, debug|release):{
LIBS += -LF:\BaiduYunDownload\opencv\install\x64\vc14\lib \
-lopencv_core2413d\
-lopencv_highgui2413d\
-lopencv_imgproc2413d\
-lopencv_calib3d2413d\
-lopencv_contrib2413d\
-lopencv_features2d2413d\
-lopencv_flann2413d\
-lopencv_gpu2413d\
-lopencv_legacy2413d\
-lopencv_ml2413d\
-lopencv_nonfree2413d\
-lopencv_objdetect2413d\
-lopencv_video2413d\
-lopencv_videostab2413d\
-lopencv_ts2413d\
-lopencv_superres2413d\
-lopencv_stitching2413d\
-lopencv_photo2413d\
-lopencv_ocl2413d
}
```
2. 添加opencv的运行库dll
确保PATH路径中包涵了opencv的dll路径,没有就添加
3. 测试运行
#include "mainwindow.h"
#include <QApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
Mat image=imread("c:\global.png");
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", image);
return a.exec();
}
五 ERROR
vs 编译后include里头文件不全,只有几个。解决方法参考
http://blog.csdn.net/waterbinbin/article/details/52238519进入自己的路径找到OpenCV.sln,使用vs2015打开,然后运行ALL_BUILd编译,运行完后,找到CMakeTargets的INSTALL工程,同样编译一次,注意debug,release的Win32,以及如果要生成64位的,也要重新Cmake后再重新编译一次。
编译INSTALL工程后找到install目录就有所有的include,lib,bin了。
用qt测试opencv总出来 the CDB process terminated
原因1:可能是你的编译器版本和编译opencv库的版本不一致导致,这个自己编译一次opencv
原因2:没有配置好opencv的dll的环境变量,在系统环境变量path路径上加入opencv的dll的路径,如我的是F:\BaiduYunDownload\opencv\install\x64\vc14\bin\
这样可能要注销或重启机子才生效,qt里直接到项目里修改下系统的PATH变量也行。不用注销或重启机子。