在VS2017(VC15)上配置opencv4.0.1环境
在VS2017(VC15)上配置opencv4.0.1环境
作为萌新最初听说到opencv,以为是一个集成开发环境IDE。后来因为毕设原因不得不去使用opencv,才了解到OpenCV是一个广受欢迎的开源计算机视觉库 ,它提供了很多函数,实现很多计算机视觉算法,从最基本的滤波到高级物体检测皆有涵盖。换言之,opencv只不过是一个写好的库,方便在编程的时候对视觉数据进行处理。
网上有各式各样的配置方式,但是大部分都没说每一步做法的原因 ,导致opencv版本不大一样的话,很多人就把所有教程都试个遍,结果还不一定配成功。我个人是很反感这种方式的,所以下文会解释做每一步的原因,了解了做每一步的必要性后,配置不同版本的opencv环境就游刃有余了。
一、下载opencv库
百度搜一下就能找到官网https://opencv.org/,在releases选项页找到下载的地方。Documentation是程序相关说明文档,Sources是opencv的源码,Win pack与Sources的区别是,Win pack不仅包含了源码,还包含了利用源码编译后的库。

下载Win pack解压后得到文件目录如下:

sources文件夹下的是源码,配置环境的话是用不上的,有用的是源码经过编译后的库,位于build文件夹下。
二、开始配置环境
官方只提供了部分语言环境的编译库,一开始我是想着在devc++上配来着,毕竟devc++轻量一点,操作起来也方便简单一点。后来发现官方根本没有提供这个编译库,需要自己用cmake拿源码来编译,查了下好像有点麻烦,索性在VS2017下配算了,官方在opencv4.0.1有提供VS2017(VC15)的编译库,而且只提供了64位版的。
下面我们来看用一个外部导入的库时,需要怎么配置。
以C++为例,编译时需要用到库的头文件(用于include),一般是.h之类的文件;链接时用到静态链接库(.lib),运行时用到动态链接库(.dll或.exe之类)。通俗地说,静态链接库编译后会整合到程序中,而动态链接库不会整合到程序中。动态链接库更像是给运行提供环境,就像平时装游戏时可能要先装什么VC、DX之类环境软件才能玩。
配置系统环境变量
正如前面所说,动态链接库是为运行时提供环境,所以程序在运行时怎么知道动态链接库在什么位置呢。因此我们需要将动态链接库的位置告诉操作系统,方法就是设置系统变量。动态链接库位于build\x64\vc15\bin文件夹下(bin是指二进制文件,说明已经是一个相对独立的程序),于是我们在此电脑属性->高级系统属性->环境变量->系统变量Path下增加上述路径。



这个地方需要填绝对路径,我把我解压的opencv放在D盘的opencv文件夹下,因此具体路径还是要参照你自己文件所在的位置。盲目抄我的路径一般都会出错。
配置VS2017环境
配置编译环境无非是让编译器能找到引用头文件以及相关的静态链接库,引用头文件在build\include\opencv2文件夹下,静态链接库在build\x64\vc15\lib文件夹下,下面所配置的路径都是基于这两个路径。
考虑到不同的工程、项目等可能会用到不同的库,VS2017已经将工具=》选项=》项目和解决方案下的全局VC++目录改成了属性页,每个project项目可以有自己的属性页,甚至各个模式下都可以有自己的属性页。点击 视图=》其他窗口=》属性管理器 打开属性管理器,可以看到如下:

在这里,我的配置方式与网上其他文章所介绍的不太一致。他们的方法是双击Microsoft.Cpp.x64.user这一个属性页去修改,这样就可以一劳永逸,以后都不用再配环境。按照他们的方法配置出现的一个问题就是会导致release模式或debug模式下报异常,导致程序无法正常执行,如下:

其原因是附加依赖项中,他们把带d后缀和不带d后缀的.lib静态链接库写在了一起,带d是属于debug模式下要使用静态链接库,不带d的是release模式下要使用的静态链接库。VS只会取写在前面的静态链接库,因此会导致debug或release模式之一不可用(取决于你把哪个写在前面)。查阅了很多博客以及stack overflow的很多回答,回答基本上都是说这是opencv的一个BUG,其实我个人感觉更像是VS的一个BUG。
另一方面,Microsoft.Cpp.x64.user实际上是位于C:\Users\Admin\AppData\Local\Microsoft\MSBuild\v4.0\下的一个属性页文件,所有项目都会默认使用他,这不太符合项目独立性的设计初衷。
下面是我的一个配置方法。
在Debug | x64处右击新建一个新的属性表opencv_property401d_x64(名字随便起),双击新建的属性表,开始配置包含文件和静态链接库。


在包含目录处配置包含的头文件路径:

在库目录处配置静态链接库位置:

配置附加依赖项:


特别说明一下,在配置附加依赖项时需要先查看,静态链接库文件夹下有什么文件,如我的opencv4.0.1静态链接库文件夹D:\opencv\build\x64\vc15\lib下有如下文件。

我们只关注.lib文件,带d结尾的是用于debug模式的静态链接库,不带d结尾的是用于release模式的静态链接库,4.0.1版本比较简洁只剩两个.lib文件了,老版2代左右的opencv有一大堆静态链接库,所以在附加依赖项处要写一大堆。因为我们这里配置的是Debug | x64的属性表,所以我们只把带d结尾的.lib文件写进去。总而言之,此处附加依赖项填写静态依赖库文件夹下所有带d结尾的.lib文件路径,静态依赖库文件夹在4.0.1版本是build\x64\vc15\lib,具体路径可能会因版本而异。
再次说明,上面所填的所有具体的绝对路径一定要根据自己电脑上相关文件的路径去写,不要盲目抄我的。
最后,在Release | x64处右击新建一个新的属性表opencv_property401_x64,双击新建的属性表,配置方法与上面一致,唯一的区别在于,附加依赖项中填写的是所有不带d结尾的.lib文件路径。


配置完成后的属性表结构如下:

这些属性结构表将会应用于其对应的模式,opencv_property401_x64用于release的64位模式,opencv_property401d_x64用于debug的32位模式,因为没有官方提供32位模式的,所以32位下没有对属性页进行设置,因此也不能使用32位模式进行编译。
每种模式的属性表工作方式类似于CSS中的层叠方式,双击项目或Debug | x64之类的也可以进行属性设置,但这类属性页是存储于项目的工程文件中的,不是独立的属性表文件。上述配置完成后的opencv_property401_x64和opencv_property401d_x64是外部的独立属性表文件,建议进行备份保存,以后遇到需要使用opencv库的项目时,直接导入这两个属性表文件即可。
三、最终测试
简单写一个显示图片的C++程序进行配置测试。
图片如下:

代码如下:
- #include<iostream>
 - #include <opencv2/core/core.hpp>
 - #include <opencv2/highgui/highgui.hpp>
 - using namespace cv;
 - int main()
 - {
 - // 读入一张图片(小熊猫)
 - Mat img = imread("picture.png");
 - // 创建一个名为 "小熊猫"窗口
 - namedWindow("小熊猫");
 - // 在窗口中显示小熊猫
 - imshow("小熊猫", img);
 - // 等待6000 ms后窗口自动关闭
 - waitKey(6000);
 - return 0;
 - }
 
把图片放在项目目录下,命名为picture.png,测试运行。

注意debug x64模式和release x64模式都测试下,确保没有问题。
四、一个小bug
在我测试的时候遇到过报这样一个异常。

一开始还以为是配环境出了问题,最后发现把我的搜狗输入法切换成系统默认输入法这个问题就解决了。这个输入法已经在我的程序生涯坑了我不止一次了,我也在想为毛我还没卸这个输入法。
五、参考文章
https://blog.csdn.net/poem_qianmo/article/details/19809337
http://www.opencv.org.cn/forum.php?mod=viewthread&tid=33549
【opencv程序错误解决指南】由于找不到opencv_world401d.dll,无法继续执行代码
- 问题

 - 错误原因
程序引用了.lib文件,却没有找到对应的.dll文件,也就是动态链接库的文件。
Windows系统有两种找到动态链接库文件的方法,①通过C:\Windows路径下有两个目录System32和SysWOW64;②通过系统环境变量中的Path环境变量来寻找。 - 解决方法
这里提供两种解决这种问题的方法:
1)(推荐)在电脑的系统变量的Path中添加.dll文件所对应的文件路径,一般对应的lib文件夹同级目录的bin目录。(如果实在找不到,可以用搜索软件everything进行查找,然后将路径添加进Path中);
2)或者找到C:\Windows路径下有两个目录System32和SysWOW64,找到opencv_world401d.dll,将其分别拷贝到这两个文件夹下面即可。 - 注意
1)有时即使通过上面两步中的一步设置后了路径,但是运行时可能还是显示找不到,这时我们将VS重启一下,一般都可行。
2)带d的.dll是debug模式下需要的,不带d的.dll是release模式下需要的,用上面2)方法时,我们需要根据不同的模式,将不同的.dll文件放到C:\Windows路径下有两个目录System32和SysWOW64下。 
在VS2017(VC15)上配置opencv4.0.1环境的更多相关文章
- 在MacOs上配置Hadoop和Spark环境
		
在MacOs上配置hadoop和spark环境 Setting up Hadoop with Spark on MacOs Instructions 准备环境 如果没有brew,先google怎样安装 ...
 - Delphi for iOS开发指南(1):在Mac上配置你的开发环境
		
http://cache.baiducontent.com/c?m=9d78d513d99516f11ab7cf690d678c3b584380122ba7a0020fd18438e4732b4050 ...
 - 从零开始在ubuntu上配置深度学习开发环境
		
从零开始在ubuntu上配置深度学习开发环境 昨天一不小心把原来配置好的台式机的开发环境破坏了,调了半天没有调回来,索性就重装一次ubuntu系统.这篇文章主要记录一个简单的.‘傻瓜式’教程. 一.U ...
 - 在windows10下vs2017配置opencv4.0.0
		
第一次配置时,有些.dll文件出错,所以用重新下载opencv配置了一遍,终于可以了,喜极而泣! 一.下载OpenCV4.0 直接到官网https://opencv.org/下载 然后在下个页面选择 ...
 - 在Fedora8上配置Tomcat6.0.37
		
说是配置,其实很简单,解压拷贝是主要的活动,主要还是Tomcat做得很好很方便. 安装Tomcat的前提是把JDK装好,这和Win下是一样的.下面是整个步骤: 第一步,到Tomcat官网下载apach ...
 - 在VS2013上配置OpenCV1.0
		
OpenCV1.0版(下载)基本上已经是老掉牙了,但是不想装新版,只是因为任性.所以就有了这样一个新老搭配.装完回想起来还是挺简单的,但是还是费了我一晚上,所以有必要记录一下. 先在电 ...
 - 配置TC2.0运行环境
		
一. 学习过程 下载TC2.0并打开如图: 这是一个集成的C语言环境包,包括TC.dosbox和一些编译工具,很明显这样我无法判断单个程序的功能,也无法区分哪些程序是必须的. 那么为了搞清楚哪些文件是 ...
 - 在Mac OSX上配置Appium+Android自动化测试环境
		
前提准备 开始正文之前,你需要准备好一些基本条件: 1.安装好Mac OSX 操作系统的设备 2.能够访问中国局域网以外资源的方法(没有也行,但很痛苦) 3.已经安装好 homebrew 4.已经安装 ...
 - Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
		
最近突然想弄一下phonegap,之前一直是听说,没亲自配置开发过.结果配置过程非常艰难啊.特别是android平台的配置,那叫一个麻烦,网上搜了半天都没找到非常好的资料.文章也都是抄来抄去,最烦的就 ...
 
随机推荐
- swift 学习- 16 -- 构造过程 02
			
// 类的继承 和 构造过程 // 类里面的所有的存储型属性 -- 包括所有继承自父类的属性 -- 都必须在构造过程中设置初始值 // Swift 为类类型提供了 两种构造器来确保实例中所有的存储属 ...
 - Swift 学习- 01 -- 基础部分
			
print("世界,你好") var myVariable = 42 myVariable = 50 let myConstant = 42 let implicitinteger ...
 - ios 输入框问题
			
去除ios输入框阴影 input,textarea{-webkit-appearance:none; outline: none; } ios有边框时设置boder-radius:0: 去除默认圆角问 ...
 - 前端html
			
前端html html 是一种描述网页的语言,是超文本标记语言 :hyper Text Markup Lauguage 是一种标记语言[标记语言是一套标记标签 markup tag]使用标记标签来 ...
 - SpringMVC文件下载与JSON格式
			
点击查看上一章 现在JSON这种数据格式是被使用的非常的广泛的,SpringMVC作为目前最受欢迎的框架,它对JSON这种数据格式提供了非常友好的支持,可以说是简单到爆. 在我们SpringMVC中只 ...
 - Metasploit 使用后门和Rootkit维持访问
			
1.内存攻击指的是攻击者利用软件的漏洞,构造恶意的输入导致软件在处理输入数据时出现非预期的错误,将输入数据写入内存中的某些敏感位置,从而劫持软件控制流,转而执行外部的指令代码,造成目标系统获取远程控制 ...
 - noip 初赛复习重点知识点
			
一.进制转化 将k进制数转化为十进制数: 设k进制数为(abcd)k,则对应十进制数为 (小数同理,乘k的负幂次) 将十进制数转成k进制数: 设十进制数为x: t1=x/k,t2=x mod k t1 ...
 - ajax--参数默认值问题
			
注:通过参数默认值,能让参数映射更加灵活,有些参数可以不必传递,如果传递则 覆盖默认.并且永远都是后面的覆盖前面的内容 通过$.extend合并对象 语法1: var newobj= $.extend ...
 - 设置IDEA中的web
 - django linux环境部署
			
一.操作环境: 1操作系统:Ctrip-CentOS-7.1-x86_64-R3 Python版本:2.7.5 Django版本: Django 1.8.19 (LTS) 二.部署流程 pip ins ...