因为这篇博客经过多次修改,所以里面的内容和配图可能有不是完全比对的地方,但是只要加以理解,关键信息肯定可以Get到的,后面我会在所处视频中对相关信息进行进一步整编,方便理解。
随着OpenCV4的不断发展,工具的使用也推陈出新,这里我们使用vs2017编译OpenCV和Contribute。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220851359-1881099535.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220851756-1942332282.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852054-1452903363.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852301-1618642426.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852552-1924381084.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852940-259985022.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853212-1558299543.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853483-273526834.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853695-534879054.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853929-869657323.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854204-1657745207.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854478-1855920400.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854791-859340898.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855043-735392885.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855445-1763752135.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855675-1828442929.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855927-23737203.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856230-695569604.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856506-1284634254.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856812-1495435964.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857079-512048862.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857365-1053113946.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857680-461287212.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857936-958163047.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220858471-1382674755.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220858845-74999523.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859135-1558342038.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859620-478095281.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859982-519670385.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900267-975407969.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900564-1770963469.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901191-1215695811.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901504-446535858.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901810-1328623889.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902081-2037942223.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902390-308473328.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902767-281746657.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220903347-1779994163.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220904098-1343517820.png)
一、工具的准备
1 tortoisegit www.tortoisegit.org(可选)
2 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件
3 vs2017
二、最新代码的下载(OpenCV和Contribute分别下载)
Http直接下载
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220851359-1881099535.jpg)
或者通过git下载
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220851756-1942332282.png)
或者可以通过"码云“转一下,也就是"码云“在后台把代码从github上背过来,我们直接从"码云“上下载就可以。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852054-1452903363.png)
下载的结果解压后放在一起
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852301-1618642426.png)
三、代码的make
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852552-1924381084.png)
Cmake将原始代码make成为你选择的编译器能够编译的形式,最新版本的cmake已经是3.12.2了。
主要流程为两次Configure->一次Generate->Open Project打开vs进行编译。参数的不同带来了结果的不同。其中注意以下几点
1、64位和32位的选择体现在选择编译器的时候是否选择Win64。我认为一般意义上说,32位的程序可以以兼容模式运行在64位机器上,反过来不可以。那么也就是说32位以效能换取兼容性。使用时根据实际情况选择。建议新手从32位开始
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220852940-259985022.jpg)
如果确认使用2017,则选择它
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853212-1558299543.png)
2、静态库和动态库的选择体现在是否选择BUILD_SHARED_LIBS(默认是选中的)。如果选择静态库,那么最后生成的程序和支持库是打包到一起的,交付起来比较方便;如果是动态库则是分开的。效能问题没有研究过。新上手的选择默认动态库。同时建议将BUILD_opencv_world选中,这样最后的结果是一个文件。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853483-273526834.png)
这个过程中,会下载较多东西,统一下载在.cache文件夹中
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853695-534879054.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220853929-869657323.png)
这里,值得注意的一点是,选择的项目,可以通过搜索的方式进行加速,比如我在cmake中输入"worl",将自动导航到"BUILD_opencv_world"条目中来。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854204-1657745207.png)
这个地方,需要多说一句,CMAKE这个地方是最容易出现问题的地方,一方面是因为CMAKE这里的信息很多,大家有可能会感到无法适应;一方面是因为CMAKE大家接触的比较少,不是很熟悉;再加上CMAKE的过程中,有时需要再从网络上下载一些东西,如果网络不好的话,也会导致失败。在前期的视频中,我总结的具体方法为:"两次Config,一次Generate"这里加以补充:
a、Config的目的主要是让你对CMAKE里面的相关内容进行选择的,第一次Config是把所有需要配置的项目显示出来,然后你进行修改(就是打钩子和去掉钩子),第二次config是为了配置你修改后的内容
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854478-1855920400.png)
所有红色的内容都是可以修改的
b、需要关注的地方,是下面,最好不要有红色,至少不要有error
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220854791-859340898.png)
c、generate就是生成可以被编译器编译的项目,这样我们打开vs2017就可以直接编译了
3、最为重要的,也是和普通OpenCV代码编译不同的地方。其中OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目录
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855043-735392885.png)
特别是这个地方,要将OPENCV_ENABLE_NONFREE打开!!!
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855445-1763752135.png)
编译生成的结果,能够不飘红就可以。
确定,两次config,一次generate
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855675-1828442929.png)
四、代码的编译
打开vs环境,选中批生成,生成install即可,其它的会自动调用(我非常推荐这样做,因为经过实验,这样最省时间,而且达到效果)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220855927-23737203.jpg)
根据机器性能,等待不同的时间
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856230-695569604.jpg)
比较吃CPU
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856506-1284634254.jpg)
如果出现这个错误(我出现了这个错误)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220856812-1495435964.png)
应该是HDF5的问题,所以回过去将其去掉。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857079-512048862.png)
按照我这个方法,最后能够直接成功的。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857365-1053113946.png)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857680-461287212.png)
那么最终生成的文件在哪里?其实是在install中的
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220857936-958163047.png)
可以看到,已经按照容易使用的方式排列好了
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220858471-1382674755.png)
这张图能够帮助看得更清楚:
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220858845-74999523.jpg)
我们最后需要的,显然是.dll文件,它被放置在bin/release目录下面
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859135-1558342038.png)
此外,我们还可以通过比较获得一些信息(左边是不带contrib的,右边是带contrib的)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859620-478095281.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220859982-519670385.jpg)
可以看到,无论是lib的大小,还是include中文件的数量,contrib都要大一些。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900267-975407969.jpg)
这个角度也是可以看到的。
五、在新项目中使用OpenCV
将需要的东西放到一起
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900564-1770963469.png)
动态库模式:
在VC++目录中设定"包含目录"为include地址;"库目录"为提供的lib地址。注意这里的lib地址只是提供了接口信息。![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900820-1169556809.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220900820-1169556809.jpg)
链接器->输入 填入lib名称
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901191-1215695811.jpg)
将dll文件拷贝到PATH目录能够指向的地方,比如"C:WindowsSystem",这个具体的位置只和编译的时候相关,所以多试几次就会找到,一般来说都是system里面
注意在交付的时候需要将支持的dll文件一并提供。
静态库修改(注意静态库和动态库选择其一即可)
设置Include
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901504-446535858.jpg)
设置引入"常规 附加库目录"
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220901810-1328623889.jpg)
设置lib(注意填全,不仅仅是opencv_word,注意后面.lib也要写)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902081-2037942223.png)
注意,需要将"代码生成"的"运行库"改为"多线程调试"。这样就将MFC自己的支持库包含在最后生成的exe中了。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902390-308473328.png)
如果想要在程序设计的过程中,能够直接修改OpenCV自己的代码,添加相关功能,首先将Opencv项目引入
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220902767-281746657.jpg)
而后添加引用设置项目依赖,就可以直接在项目中修改OpenCV的代码,生成符合自己要求的专用类库。更可以通过Pull/request的方法直接申请提交。
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220903053-514810178.png)
最后,编写代码的时候,头文件和命名空间要选择正确,因为我们实现的是shift,所以需要做一个shift操作:
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220903347-1779994163.png)
目前从结果来看![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220903680-302648647.jpg)
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220903680-302648647.jpg)
// opencvtest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include "pch.h"
#include <iostream>
#include <opencv2/core/utility.hpp>
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/xfeatures2d.hpp"
#include <iostream>
#include <ctype.h>
using namespace cv;
using namespace std;
using namespace xfeatures2d;
int main()
{
Mat matSrc = imread("e:/template/lena.jpg");
Mat gray;
Mat draw;
cvtColor(matSrc, gray, COLOR_BGR2GRAY);
Mat descriptors;
std::vector<KeyPoint> keypoints;
// 生产sift结构
Ptr<SiftFeatureDetector> siftFD = SiftFeatureDetector::create();
siftFD->detectAndCompute(gray, Mat(), keypoints, draw);
drawKeypoints(gray, keypoints, gray, Scalar(0, 0, 255), DrawMatchesFlags::DEFAULT);
imshow("gray", gray);
waitKey(0);
return 0 ;
}
如果配置错误,opencv会有自己的显示
![](https://img2018.cnblogs.com/blog/508489/201905/508489-20190505220904098-1343517820.png)
感谢阅读至此,希望有所帮助!