Bootstrap

Windows下 Cmake + VS 编译 OpenCV (+ opencv_contribute)源码

windows下Cmake+VS编译OpenCV源码

这里我使用的是VS2015 update3,默认大家电脑里都有VS了。

1.下载Cmake

点击Cmake官网的下载界面,点击下载对应版本的Cmake就可以了。
在这里插入图片描述

下载完压缩包直接解压,无需安装。
点击开文件夹可以看见:

在这里插入图片描述

最后一步就是把Cmake路径下的bin文件夹路径加入到电脑的环境变量。

2.下载OpenCV源码

OpenCV在图像领域所占的地位就不用多提了,很强的工具,不过涉及到配置的问题,对于初学者来说还是会有一些问题的。

首先进入OpenCV的官网的下载界面,这里主要以OpenCV3的3.1版本为例,其他的版本一样的操作流程。
正常Windows下直接下载Win pack,下载exe文件,然后直接双击解压就可以了。
不过有些时候我们在用C++调用OpenCV时会碰到某些库文件没有的情况,所以一般还是自己下载源码,根据自己的需求生成依赖库会好一些。这里我们就选择 Sources 选项,下载就行了。

在这里插入图片描述

解压到相应路径后,可以看见下面的文件内容:

在这里插入图片描述

3.编译OpenCV

上面第一步将Cmake的bin文件夹加入到环境变量生效以后,直接在cmd里面输入cmake-gui然后回车就可以直接打开cmake了。(这里我使用的是Cmder,界面会比windows自带的cmd界面友好一些,而且可以加入右键菜单直接打开,类似于Ubuntu的Terminal,很方便,推荐大家使用,具体安装方法参见我的另一篇博客-Cmder 加入右键菜单):

在这里插入图片描述

如上图步骤:

1)首先选择source code的路径,就是上面的opencv-3.1.0/opencv-3.1.0

2)手动在opencv-3.1.0里面建一个名字为 build 的文件夹,把 build 文件夹的路径加到这步

3)点击 Configue

4)就会弹出一个选择编译器的界面,选择自己对应的VS版本就行了。

5)点击Finish

文件就开始编译了,第一次编译的话会下载一些依赖的东西,所以需要多等一会。会有如下生成:

Selecting Windows SDK version  to target Windows 10.0.16299.
The CXX compiler identification is MSVC 19.0.24215.1
The C compiler identification is MSVC 19.0.24215.1
Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
Detecting CXX compiler ABI info
Detecting CXX compiler ABI info - done
Detecting CXX compile features
Detecting CXX compile features - done
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe
Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works
Detecting C compiler ABI info
Detecting C compiler ABI info - done
Detecting C compile features
Detecting C compile features - done

......
......  此处省略
......


  Python 3:
Interpreter: C:/Users/Chris_zhang/Anaconda3/python.exe (ver 3.5.2)
Libraries:   C:/Users/Chris_zhang/Anaconda3/libs/python35.lib (ver 3.5.2)
numpy:   C:/Users/Chris_zhang/Anaconda3/lib/site-packages/numpy/core/include (ver 1.14.0)
packages path:   C:/Users/Chris_zhang/Anaconda3/Lib/site-packages

  Python (for build):C:/Users/Chris_zhang/Anaconda3/python.exe

  Java:
ant: NO
JNI: NO
Java wrappers:   NO
Java tests:  NO

  Matlab:Matlab not found or implicitly disabled

  Documentation:
Doxygen: NO
PlantUML:NO

  Tests and samples:
Tests:   YES
Performance tests:   YES
C/C++ Examples:  NO

  Install path:  F:/Software_download/opencv-3.1.0/opencv-3.1.0/build/install

  cvconfig.h is in:  F:/Software_download/opencv-3.1.0/opencv-3.1.0/build
-----------------------------------------------------------------

Configuring done

然后就会得到下面的界面:

在这里插入图片描述

这里根据自己的需求勾选自己需要的选项或者消去自己不需要的选项就可以了,选择完成后点击 Configure 旁边的 Generate ,这个过程很快,最后会得到:

在这里插入图片描述

---------------------------------------------------------------分割线----------------------------------------------------------------------------------
##(17.07.04更1)编译 opencv_3xxworld.lib
openCV 3 版本最方便的一个地方就是将很多的库都集成到了一个 opencv_xxxworld.lib 中, 当我们点击 Configure 以后需要找到 BUILD_opencv_world 这一个选项,并且勾选它,否则,不勾选直接编译点击 Generate 的话还是会生成很多独立的依赖库,在调用添加时不是很方便。
这里写图片描述

##(17.07.04更2)加入opencv_contrib编译(如果不需要加入,可直接跳过此步)
当我们需要使用一些第三方的算法,例如kcf跟踪算法等,在OpenCV 3版本以后就多了一个叫 Opencv_contrib 的包,里面相当于是对 openCV 的一个补充,集合了很多优秀的算法,我们如果需要的话就在第三步:

假设我们下载完成后会的到一个名字是 opencv_contrib-master 的文件夹,下面就是把这个文件夹的路径加入 cmake 过程中:

这里写图片描述

如上图所示,在 Configure 以后,找到 OPENCV_EXTRA_MODULES_PATH 然后将你的opencv_contrib-master 文件夹下的 modules 加入路径当中。
然后再点击 Generate 就配置成功了。

---------------------------------------------------------------分割线---------------------------------------------------------------------------------

4.最后一步-VS编译openCV

这个时候我们再打开 build 文件夹就可以看到生成了很多的文件,选中其中的 OpenCV.sln,用 VS 打开这个工程文件:

在这里插入图片描述

4.1编译Debug版的openCV

OpenCV.sln 打开以后是这样:

在这里插入图片描述

1)首先选择 Debug x64 的平台

2)选择右边的 ALL_BUILD ,右键,选择 生成 或者 重新生成 然后静静等待就可以了

3)最后会全部成功生成

4.2编译Release版的openCV

步骤同上,只是将 Debug 变成 Release,然后右键生成 ALL_BUILD:

在这里插入图片描述

4.3生成结果

可以看到build文件夹下的lib里面就会有两个子文件夹:
在这里插入图片描述

以 Debug 为例,里面包含了下面这些文件:
在这里插入图片描述

而直接下载win pack解压出来的openCV(3.3.0)版本只有build只有下面这些文件:

在这里插入图片描述

直接解压的版本就没有 opencv_ts310d.lib 和 opencv_ts310.lib这个依赖库,如果后续用到的话就会很麻烦,所以刚开始安装,还是直接源码编译,虽然麻烦一点,不过会更方便后续的使用。

5.牛刀小试

下面是一段边缘检测的测试代码:(读者复现时,需要修改的地方我已经在下面代码中注明了)

#include "opencv2/core/utility.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

#include <stdio.h>

using namespace cv;
using namespace std;

int edgeThresh = 1;
Mat image, gray, edge, cedge;

// define a trackbar callback
static void onTrackbar(int, void*)
{
    blur(gray, edge, Size(3,3));
    
    // Run the edge detector on grayscale
    Canny(edge, edge, edgeThresh, edgeThresh*3, 3);
    cedge = Scalar::all(0);
    
    image.copyTo(cedge, edge);
    imshow("Edge map", cedge);
}

static void help()
{
	printf("\nThis sample demonstrates Canny edge detection\n"
  			 "Call:\n"
   	"   /.edge [image_name -- Default is ../data/fruits.jpg]\n\n");
}

const char* keys =
{
	"{help h||}{@image |../data/fruits.jpg|input image name}"
	
};

int main( int argc, const char** argv )
{
    CommandLineParser parser(argc, argv, keys);
    if (parser.has("help"))
    {
	    help();
	    return 0;
    }
		//!!!!这里将 filename 换成你自己图片的绝对路径就可以了,只要修改这一处!!!!
    	string filename = "F:\\Software_download\\opencv-3.1.0\\opencv-3.1.0\\samples\\data\\fruits.jpg";
  
    
    image = imread(filename, 1);
    if(image.empty())
    {
	    printf("Cannot read image file: %s\n", filename.c_str());
	    help();
	    return -1;
    }
    cedge.create(image.size(), image.type());
    cvtColor(image, gray, COLOR_BGR2GRAY);
    
    // Create a window
    namedWindow("Edge map", 1);
    
    // create a toolbar
    createTrackbar("Canny threshold", "Edge map", &edgeThresh, 100, onTrackbar);
    
    // Show the image
    onTrackbar(0, 0);
    
    // Wait for a key stroke; the same function arranges events processing
    waitKey(0);
    	system("pause");
    return 0;
}

将相应的openCV路径包括依赖库添加到工程目录中,运行上面的代码可以得到:

原图:

在这里插入图片描述

处理后的图片:

在这里插入图片描述

###程序可以正常运行,至此 OpenCV 就配置完毕了!

若是跑例程时头文件找不到的相关问题见我的下一篇博客: ”编译OpenCV, /include/opencv2下只有一个opencv.hpp文件 “的解决方法

;