CMake3.11.1+Opencv3.4.0+opencv_contrib3.4+VS2015(vc14)+Win10配置成功

       开门见山,亲测有效!欢迎大家使用。翻译下文章标题:vs2015下Cmake3.10编译Opencv3.4及opencv_contrib3.4在Windows10。

        关于版本:其实没有关系,opencv3一般是vs2012以上版本,感兴趣的可以查一下对应的版本。VS2015是VC14.

      补充:vc8 = Visual Studio 2005,vc9 = Visual Studio 2008,vc10 = Visual Studio 2010,vc11 = Visual Studio 2012,vc12 = Visual Studio 2013,vc14 = Visual Studio 2015

        我就做做笔记,对你有用可以转发,标注出处即可,喜欢分享,喜欢讨论,希望你有好东西也一起分享。在开始的时候,想必大家和我一样有一个疑惑,为什么我们要CMake?看opencv3入门这本书上是说使用CMake来编译OpenCV源代码。

1.原因

      (1)具体解释为:当我们有时想查看OpenCV自带的函数的源代码,比如函数cvCreateImage, 此时我们选中cvCreateImage, 点击鼠标右键->转到定义,我们会很惊讶的发现为什么只看到了cvCreateImage的一个简单声明,而没有源代码呢?这是因为opencv将很多函数被加入了函数库,并被编译成了dll,所以只能看到函数申明,没法看到源代码。下面我们详细解释并讲解如何利用cmake查看opencv的源代码。

我的安装目录在D:/Nyy/image/Opencv_Sourse/opencv34。在这个目录下面还有很多子目录:3rdparty、android、build,data、doc、include、modules、samples和很多cmake文件。build目录是编译生成的目录,就是用openCV源代码编译生成的2进制库文件集(dll、lib和入口头文件include)。对于编程来说,仅仅需要build这一个文件夹就可以了。那么其他文件夹是用来干什么的呢?其实源代码就包含在这些文件夹下面,因为build文件夹就是在其他文件夹的基础上CMake编译生成的。大部分源代码放在modules文件夹下例如,core文件夹下就包含了基本数据类型的定义,imgproc文件夹下包含了常用的数字图像处理函数源代码:如cvCanny()、cvSobel()。

     (2)为何需要自行编译opencv3.4与opencv_contrib3.4

      因为在3.0之后版本的Opencv对Sift、Sufer等新算法没有提供直接编译好的动态库来加载使用,因此必须自己编译。这是因为Sift、Sufer算法专利现在是属于哥伦比亚大学,因此opencv对这部分内容及“所谓的”不稳定模块全都放到opencv_contrib中。且只在它的Github中能够找到,opencv的官网上是没有的。因此对于想使用Sift、Sufer、双目立体匹配算法、结构光等新的算法及有专利权算法的同学需要自行编译。

选择不同的编译器类型,生成高度还原的OpenCV开发时的解决方案工程文件,欣赏OpenCV新版本中总计 六十六多万行的精妙源代码。我们可以对其源代码进行再次编译,得到二进制文件,或者修改原版官方的OpenCV代码,并编译后为自己所用,为深入理解OpenCV的开源魅力迈出了坚实的一步

2:如何利用cmake查看opencv的源代码

 (1)下载opencv3.4与opencv_contrib3.4相对应的版本

     下载需要的Opencv3.4版本源码 https://github.com/opencv/opencv/releases

 两者有什么区别,前者是exe文件,需要经过CMake才能看到源代码,后者其实是一个压缩的opencv文件,下载下来很大,准备说,下面张图可以告诉你是什么。

如果是前者下载下来解压后就是上图全部文件,如果是后者解压后就是sourcrs,而且还花费很多时间。。所以我建议直接下载前者。


    下载需要的opencv_contrib3.4版本源码 (本文.zip文件) https://github.com/opencv/opencv_contrib/releases


 (1)Cmake3.11.1编译Opencv3.4

camke的官网:http://www.cmake.org/上下载到,首先转到其下载页面。下载页面的Source distributions处可以下载到cmake软件的源码,如果对这款开源软件感兴趣,不妨看看。

如何安装Cmake3.11.1可网上查找很简单的。打开Cmake3.11.1,百度一下,很简单,和装QQ一样简单。

源码路径“Source code”选择你刚才解压后的Opencv3.4源码,本文解压到了D:/Nyy/image/Opencv_Sourse/opencv34路径下,这个需要按照你的路径自行选择。

编译输出路径“build the binaries”,本文新建文件夹“Opencv34Build”路径为D:/Nyy/image/Opencv_Sourse/Opencv34Build,同样这个需要按照你的路径自行选择。

(注意:图是从参考博客那借用的:https://blog.csdn.net/niuyuanye/article/details/79607770,它是CMake3.10.1,我亲测了可以用的,我帮朋友配置的3.11.1就好啦,所以图就借用上面博主的啦)


单击“configure”;选择如下图设置,单击“Finish”即可开始编译。

这个过程会出现很多错误需耐心反复编译,主要原因是他要从国外网站下载文件,若下载失败就编译不通过,以红色显示

若失败,可在编译输出路径  D:\Nyy\image\Opencv_Sourse\Opencv34Build 中打开CMakeDownloadLog.txt文件里面有下载失败文件的连接及下载文件要保存到本地的路径。之后你自己可手动打开连接自己下载并放到指定的文件夹中最常下载失败的:

opencv_ffmpeg.dll 

opencv_ffmpeg_64.dll 

fmpeg_version.cmake

ippicv_2017u3_win_intel64_general_20170822.zip

(注意:你可能么有那么多的,其实我在帮朋友Cmake时只缺opencv_ffmpeg.dll )

下图(D:\Nyy\image\Opencv_Sourse\Opencv34Build 中的CMakeDownloadLog.txt)是我本次编译时下载失败文件的连接及要保存文件的路径,需要每个都自行下载并放到指定位置即可。


在下载完后放到指定文件夹时需把名字修改名字,首先找到指定存储路径“D:\Nyy\image\Opencv_Sourse\opencv34\.cache\ffmpeg”如下图。如把下载的opencv_ffmpeg.dll名字修改为下面的,其实上面的CMakeDownloadLog.txt里面有名称,相信聪明的你肯定可以轻松复制粘贴的。注意了吗?okB,所以需要下载的,其实也可以不下载,找到---D:\Nyy\image\Opencv_Sourse\opencv34\opencv34Build\3rdparty\ffmpeg\opencv_ffmpeg.dll 把他复制过来,改下文件名就可以了的,其实是一样的。当然如果你不放心,你可以自己下载。


所有下载失败的的文件都可以这样操作,同时需要勾选 BUILD_opencv_world;主要是把所有的lib文件都弄到一个opencv_world340d.lib中方便配置,若不勾选在最后会产生大概38个.lib文件,导致最后配置Opencv3.4到vs2015会太麻烦,有过Opencv2.x配置经验的都知道。勾选 BUILD_EXAMPLES;就是编译OPencv自带的例程。

完成后再次单击“Configure”即可。单击“Configure”直到Cmake3.10没有红色显示为止。顺利的话,一次就消去红色了啦。

3、Cmake3.10编译opencv_contrib3.4

选择OPENCV_EXTRA_MODULES_PATH 把路径选择为解压的opencv_contrib3.4文件中的“modules”即D:\Nyy\image\Opencv_Sourse\opencv_contrib34\modules 。是下图里面找,按拼音字母序号翻一下可以找到的。


如下图:

                             

单击“Configure”在这部分编译中同样会出现下载失败的情况,

同样需要到D:\Nyy\image\Opencv_Sourse\Opencv34Build 中的CMakeDownloadLog.txt中找到下载链接自行下载,并放到指定的位置。此部分下载失败常有:boostdesc_bgm.i   boostdesc_bgm_bi.i  boostdesc_bgm_hd.i  boostdesc_binboost_064.i  及face_landmark_model.dat  同样找到下载并替换。(这里可能需要多次的反复才能完成,需要耐心!!!)

再次单击“Configure”。直到Cmake3.10没有红色显示为止(我很顺利,没有出现红色的,我相信如果你也是按照上面来的肯定没有问题的。)。如下图


最后单击“Generate”完成Cmake3.11.1编译的最后工作。

4、vs2015的最后编译

打来编译输出文件 D:\Nyy\image\Opencv_Sourse\Opencv34Build 找到 Opencv.sln打开工程文件

因为我要编译为Debug X64 因此选择如下图。


此时即可开始编译即:生成->生成解决方案,随后漫长的等待。那个错误是与Python有关不用考虑


选择 CMakeTargets下的INSTALL右键选择仅用于项目->仅生成INSTALL即可,之后会在D:\Nyy\image\Opencv_Sourse\Opencv34Build 找到一个install文件夹即为最后编译生成的Opencv3.4配置需要文件。


5、Opencv3.4与VS2015的配置与测试

(2)、加到环境变量path中

我的是这个D:\Professional\opencv\opencv3.4\build\x64\vc14\bin

vs中的配置与测试:

      1、新建win32控制台应用程序

       2、选择空项目


      3、打开属性管理器

视图->其他窗口->属性管理器 或者 视图->属性管理器(我的已经在主界面了)


      4、修改Microsoft.Cpp.x64.user属性页

右键->属性


          5、修改VC++目录

在包含目中添加:opencv安装目录下build\include 、build\include\opencv 和 build\include\opencv2

在库目录中添加:opencv安装目录下build\x64\vc14\lib




     6、修改链接器

修改输入->附加依赖项:添加opencv_world340d.lib(直接输入)



     7、保存修改

测试:

1、Debug后面改成x64(因为我们前面修改的都是64位的部分)

2、源文件目录下新建main.cpp,输入以下代码(代码中的文件路径自行修改)

#include <opencv2/opencv.hpp>  
#include <iostream>  

using namespace cv;

int main() {
	//读取图片文件  
	Mat src = imread("1.jpg");
	if (src.empty()) {
		printf("文件不存在。。。");
		return -1;
	}
	//创建一个窗口  
	namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);
	//在窗口中显示图片  
	imshow("test opencv setup", src);
	//在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环)  
	//waitKey(0)无限循环等待  
	waitKey(0);

	return 0;
}
可以啦。。。。


测试代码:

测试结果:
#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"  
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/xfeatures2d.hpp"

using namespace cv;

using namespace std;

int main()
{
	Mat img_1 = imread("book1.jpg", CV_LOAD_IMAGE_COLOR);
	Mat img_2 = imread("book2.jpg", CV_LOAD_IMAGE_COLOR);

	Ptr<Feature2D> sift = xfeatures2d::SIFT::create();

	vector<KeyPoint> keypoints_1, keypoints_2;
	Mat descriptors_1, descriptors_2;

	sift->detectAndCompute(img_1, noArray(), keypoints_1, descriptors_1);
	sift->detectAndCompute(img_2, noArray(), keypoints_2, descriptors_2);

	//绘制特征点(关键点)
	drawKeypoints(img_1, keypoints_1, descriptors_1, Scalar(0, 0, 255));
	drawKeypoints(img_2, keypoints_2, descriptors_2, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

	imshow("img_1", descriptors_1);
	imshow("img_2", descriptors_2);
	waitKey(0);

	return 0;

}

这个结果没有错啦  ,但是不报错,可为什么呢?

彩蛋:

                                          

                                          


猜你喜欢

转载自blog.csdn.net/qq_37791134/article/details/80739395