Windows环境下CMake+VS编译OpenCV源码
这里我使用的是VS2015 update3,默认大家电脑里都有VS了。
1.下载Cmake
点击Cmake官网的下载界面,点击下载对应版本的Cmake就可以了。
下载完压缩包直接解压,无需安装。
点击开文件夹可以看见:
最后一步就是把Cmake路径下的bin文件夹路径加入到电脑的环境变量。
2.下载OpenCV源码
OpenCV在图像领域所占的地位就不用多提了,很强的工具,不过涉及到配置的问题,对于初学者来说还是会有一些问题的。
首先进入OpenCV的官网的下载界面,这里主要以OpenCV3的3.1版本为例(随着版本快速更新,可以使用更高版本的openCV),其他的版本一样的操作流程。
正常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
…
… 此处省略
…
然后就会得到下面的界面:
这里根据自己的需求勾选自己需要的选项或者消去自己不需要的选项就可以了,选择完成后点击 Configure 旁边的 Generate ,这个过程很快,最后会得到:
---------------------------------------------------------------分割线----------------------------------------------------------------------------------
##(17.07.04更1)编译 opencv_3xxworld.lib
openCV 3 版本最方便的一个地方就是将很多的库都集成到了一个 opencv_xxxworld.lib 中, 当我们点击 Configure 以后需要找到 BUILD_opencv_world
这一个选项,并且勾选它,否则,不勾选直接编译点击 Generate
的话还是会生成很多独立的依赖库,在调用添加时不是很方便。
##加入opencv_contrib编译(源码编译,如果不需要加入,可直接跳过此步)
当我们需要使用一些第三方的算法,例如kcf跟踪算法等,在OpenCV 3版本以后就多了一个叫 Opencv_contrib 的包,里面相当于是对 openCV 的一个补充,集合了很多优秀的算法,我们如果需要的话就在第三步:
- 1.下载 opencv_contrib
github 地址:https://github.com/opencv/opencv_contrib
假设我们下载完成后会的到一个名字是 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
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文件 “的解决方法