Windows环境下最新OpenCV和Contribute代码的联合编译【20180926更新红字】

解决这个问题, 目的在于得到并使用最新的彻底版本的代码, 主要方法是对CMake可以熟练使用,而且对编译等基础支持有所了解。
由于这篇博客通过屡次修改,因此里面的内容和配图可能有不是彻底比对的地方,可是只要加以理解,关键信息确定能够Get到的,后面我会在所处视频中对相关信息进行进一步整编,方便理解。
1、工具的准备
1 tortoisegit www.tortoisegit.org(可选)
2 CMake是一个跨平台的安装(编译)工具,能够用简单的语句来描述全部平台的安装(编译过程)。他可以输出各类各样的makefile或者project文件
3 vs2017
2、最新代码的下载(OpenCV和Contribute分别下载)
Http直接下载
或者经过git下载
下载的结果解压后放在一块儿
3、代码的make
Cmake将原始代码make成为你选择的编译器可以编译的形式, 最新版本的cmake已是3.12了。
主要流程为两次Configure->一次Generate->Open Project打开vs进行编译。参数的不一样带来告终果的不一样。其中注意如下几点
一、 64位和32位的选择体如今选择编译器的时候是否选择Win64。我认为通常意义上说,32位的程序能够以兼容模式运行在64位机器上,反过来不能够。那么也就是说32位以效能换取兼容性。 使用时根据实际状况选择。建议新手从32位开始
二、 静态库和动态库的选择体如今是否选择BUILD_SHARED_LIBS(默认是选中的)。若是选择静态库,那么最后生成的程序和支持库是打包到一块儿的,交付起来比较方便;若是是动态库则是分开的。效能问题没有研究过。新上手的选择 默认动态库 。同时建议将BUILD_opencv_world选中,这样最后的结果是一个文件。
这个过程当中,会下载较多东西,统一下载在.cache文件夹中

我提供一个制做课件过程当中的.cache版本ios

连接:https://pan.baidu.com/s/1440uWXUVaiDLFUqc6AF56A 
提取码:v5e7

这里,值得注意的一点是,选择的项目,能够经过搜索的方式进行加速,好比我在cmake中输入"worl",将自动导航到"BUILD_opencv_world"条目中来。
这个地方,须要多说一句,CMAKE这个地方是最容易出现问题的地方,一方面是由于CMAKE这里的信息不少,你们有可能会感到没法适应;一方面是由于CMAKE你们接触的比较少,不是很熟悉;再加上CMAKE的过程当中,有时须要再从网络上下载一些东西,若是网络很差的话,也会致使失败。在前期的视频中,我总结的具体方法为:"两次Config,一次Generate"这里加以补充:
a、 Config的目的主要是让你对CMAKE里面的相关内容进行选择的,第一次Config是把全部须要配置的项目显示出来,而后你进行修改(就是打钩子和去掉钩子),第二次config是为了配置你修改后的内容
全部红色的内容都是能够修改的
b、 须要关注的地方,是下面,最好不要有红色,至少不要有error
c、 generate就是生成能够被编译器编译的项目,这样咱们打开vs2017就能够直接编译了
三、最为重要的,也是和普通OpenCV代码编译不一样的地方。其中OPENCV_EXTRA_MODULES_PATH 中要填入contrib-master下的modules目录
特别是这个地方,要将OPENCV_ENABLE_NONFREE打开!!!
编译生成的结果,可以不飘红就能够。
肯定,两次config,一次generate
4、代码的编译
打开vs环境,选中 批生成,生成install便可,其它的会自动调用(我很是推荐这样作,由于通过实验,这样最省时间,并且达到效果)
根据机器性能,等待不一样的时间
比较吃CPU
若是出现这个错误(我出现了这个错误)

应该是HDF5的问题,因此回过去将其去掉。
按照我这个方法,最后可以直接成功的。
那么最终生成的文件在哪里?实际上是在install中的

能够看到,已经按照容易使用的方式排列好了

这张图可以帮助看得更清楚:
咱们最后须要的,显然是.dll文件,它被放置在bin/release目录下面
此外,咱们还能够经过比较得到一些信息(左边是不带contrib的,右边是带contrib的)
能够看到,不管是lib的大小,仍是include中文件的数量,contrib都要大一些。
这个角度也是能够看到的。
5、在新项目中使用OpenCV
将须要的东西放到一块儿
动态库模式:
在VC++目录中设定"包含目录"为include地址;"库目录"为提供的lib地址。注意这里的lib地址只是提供了接口信息。
连接器->输入 填入lib名称
将dll文件拷贝到PATH目录可以指向的地方,好比"C:\Windows\System", 这个具体的位置只和编译的时候相关,因此多试几回就会找到,通常来讲都是system里面     
注意在交付的时候须要将支持的dll文件一并提供。
静态库修改 (注意静态库和动态库选择其一便可)
设置Include
设置引入"常规 附加库目录"
设置lib(注意填全,不只仅是opencv_word,注意后面.lib也要写)
注意,须要将"代码生成"的"运行库"改成"多线程调试"。这样就将MFC本身的支持库包含在最后生成的exe中了。
若是想要在程序设计的过程当中,可以直接修改OpenCV本身的代码,添加相关功能,首先将Opencv项目引入
然后添加引用设置项目依赖,就能够直接在项目中修改OpenCV的代码,生成符合本身要求的专用类库。更能够经过Pull/request的方法直接申请提交。
    
最后,编写代码的时候,头文件和命名空间要选择正确,由于咱们实现的是shift,因此须要作一个shift操做:


目前从结果来看
// 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( 00255), DrawMatchesFlags : :DEFAULT);
    imshow( "gray", gray);
    waitKey( 0);
     return  0 ;
}
若是配置错误,opencv会有本身的显示
感谢阅读至此,但愿有所帮助!




附件列表

相关文章
相关标签/搜索