win8 + VS2012 + OpenCV的安装与配置

前言:

  OpenCV的学习笔记网上已经有很多了,本文并无任何要标新立异之目的,只是为了记录自己的学习历程。不过,网上的很多教程都是早年所写,所用操作系统多是32位的WindowsXP或Vista,所用开发环境也是VS2008以前的版本,而在软件与操作系统版本更新如此之快的今天,大家很可能会遇到一些新的问题,我将尽力思考收集整理我所发现的问题与解决办法,并希望我的这份学习笔记能给现今基于新平台的新入门者一些帮助,也欢迎各路大神的指点,先在此谢过!

Chaper 1.OpenCV的安装与配置

0.我的软硬件平台:

  操作系统——Windows 8 中文企业版 64位

  开发环境——Visual Studio 2012 Ultimate中文版

  OpenCV版本——2.4.7

1.下载与安装OpenCV

  OpenCV的官方发布页是 http://sourceforge.net/projects/opencvlibrary/ ,可以在这里下载最新版的安装包,截至我写到这句话时的最新稳定版本号为2.4.7。下载与安装过程都极为简单,这里直接贴出下载完成和安装完成的截图。

  opencv的安装过程实际上只是一个解压过程,可以不解压在默认路径,解压后的根目录下有两个文件夹,分别是“build”和“source”。

2.操作系统配置

  OpenCV本质上是一个库,该库以DLL(动态链接库)的形式在程序运行时被调用,OpenCV的所有算法的实现和信息都被存储于DLL文件中,这些DLL文件都存放在bin文件夹下。程序运行时调用库的任务由操作系统来完成,因此我们必须要让操作系统知道应该到哪里去寻找这些库,这通过配置系统环境变量来实现。

  依次打开计算机属性-〉高级系统设置-〉“高级”选项卡-〉环境变量,可以看到环境变量的配置页面。

  创建新环境变量,变量名为“OPENCV_DIR”,变量值为"*\opencv\build\x64\vc11",“*”应更换为具体的安装目录;

  编辑环境变量“path”,添加新值“%OPENCV_DIR%\bin”。

3.开发环境配置

  打开VS2012,新建Win32 Console Application项目,建议创建空项目。

  为了能够使用OpenCV,我们必须要做到两点:

  (1)在源程序(.cpp)中指明要用的OpenCV库,即在源文件开头用编译预处理指令“#include”包含所需的头文件(.hpp或.h);

  (2)告诉链接器(linker)要去哪里寻找对应的OpenCV函数和数据结构的实现。

  下面重点说说第二点,第二点做的不对也常常是很多问题出现的根源。在VS2012的体系下,工程由解决方案统一管理,一个解决方案下可以有多个工程,而这多个工程分别按照自己的规则设置进行编译和链接。因此,对于第二点就有了两种实现方法,第一种是本地方式(Local Method),即设置只对当前工程生效,对于其他工程无效;第二种是全局方式,即改变VS2012的默认设置,从而对任何工程都有效。

  Local Method

  按如下方式启动“属性管理器”。

  在“Debug|Win32”上右击鼠标,选择“添加新项目属性表”,然后对新属性表进行命名,在这里我命名为“OpenCV_Debug”,然后确定,完成添加。双击新添加的属性表,打开编辑器,进行如下3步修改

  (1)添加“附加包含目录”

  (2)添加“附加库目录”

(3)添加“附加依赖项”

  依赖项的具体内容是:opencv_calib3d247d.lib,opencv_contrib247d.lib,opencv_core247d.lib,opencv_features2d247d.lib,opencv_flann247d.lib,opencv_gpu247d.lib,opencv_highgui247d.lib,opencv_imgproc247d.lib,opencv_legacy247d.lib,opencv_ml247d.lib,opencv_nonfree247d.lib,opencv_objdetect247d.lib,opencv_ocl247d.lib,opencv_photo247d.lib,opencv_stitching247d.lib,opencv_superres247d.lib,opencv_ts247d.lib,opencv_video247d.lib,opencv_videostab247d.lib(库名与库名之间应用回车区分)。

  以上设置最好都勾选“从父级或项目默认设置继承”。

  对Release|Win32可以完全照此设置新属性表,但是依赖项的名称后都不加字母‘d’,d表示是debug库,由于release不需要debug代码,所以才用非debug库。

  Global Method

  若想要建立全局规则,则不用建立新属性表,直接按照上述步骤,修改“Microsoft.Cpp.Win32.user”的相关项即可,这样设置就会对全部工程生效,即使是接下来创建的新工程。

4.运行测试

  完成上述三步后,用以下代码进行测试。

复制代码

#include <opencv2\highgui\highgui.hpp>

int main(int argc,char** argv)
{
  //在源文件所在目录下提前存放好名为“logo.png”的图片文件,类型也可以为“png”以外的其他图片类型

  IplImage* img = cvLoadImage("logo.png");

  cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE);
  cvShowImage("Example1",img);
  cvWaitKey(0);
  cvReleaseImage(&img);
  cvDestroyWindow("Example1");
}

复制代码

  测试结果是出乎意料的,居然没有编译成功,不断提示“无法解析的外部符号”,这说明肯定是对外部库的引用有问题或是引用的库有问题。于是我回去反复检查了n遍“附加包含目录”,“附加包含库”,“附加依赖项”是否拼写正确,环境变量“OPENCV_DIR”的值是否拼写正确。在确认这些都书写无误后,还是无法成功编译,于是我又怀疑是否还要在path变量中添加值“%OPENCV_DIR%\lib”,但结果仍是不成功。

  此时只能尝试换个库路径,将环境变量“OPENCV_DIR”的值改为“"*\opencv\build\x86\vc11”,即将原来的x64改为x86,这次终于编译运行成功了,运行结果如下,显示出了OpenCV的logo。 

  强调一下,此时我的系统环境变量“OPENCV_DIR”的值为"*\opencv\build\x86\vc11”;path中只添加了“%OPENCV_DIR%\bin”这一项,无“%OPENCV_DIR%\lib”;开发环境采用Global Method,即只在“Microsoft.Cpp.Win32.user”中添加“附加包含目录”,“附加库目录”和“附加依赖项”。

  出于不甘心,有了一次成功运行的经历后,我又将“OPENCV_DIR”的值改回了"*\opencv\build\x64\vc11”,然后删除工程目录下的两个Debug文件夹,再重新编译程序,这一次居然也成功了!?这说明我之前的配置都没有问题?那为什么一开始总是报“无法解析的外部符号”呢?

  于是我又新建了一个工程,添加了另外一份测试代码,然后进行编译,这次编译又失败了。。。。。这说明"*\opencv\build\x64\vc11”本质上还是无法正常工作的,之所以之前可以用了,肯定与用"*\opencv\build\x86\vc11”已经编译成功过一次有关,对于一个没有用"*\opencv\build\x86\vc11”编译过的工程,肯定无法用"*\opencv\build\x64\vc11”一次性编译成功,具体的原因或许与VS2012的某些机制有关,由于知识所限,我现在还无法给出完整的答案,希望有大神能够指点。

  最后值得一提的是,当更改了环境变量的值后,操作未必能马上生效,如果更改后依然编译失败,可以先尝试做以下几步而不要马上否定自己的更改方案,一是完全删除掉工程目录下的两个Debug文件夹,二是关闭掉开发环境后再重新打开,三是重新启动电脑。

  剩下的问题就是,为什么我明明在64位系统下,却无法用"*\opencv\build\x64\vc11”下的库,而只能用"*\opencv\build\x86\vc11”下的库?我将继续思考这个问题,不过至少现在OpenCV可以算是用起来了!

 

Chapter 2 对OpenCV学习笔记(1)遗留问题的思考

  

上篇的最后,留下了一下疑问,为什么明明是在X64系统下,却不能使用“*\opencv\build\x64\vc11”下的库,而只能用“*\opencv\build\x86\vc11”下的库?

今天思考了一下,可能与以下几点有关:

1.操作系统是64位的,开发环境是64位的,所选编译器是否是64位的?VS2012下面至少有两个可选的编译器,一个是win32编译器,一个是x64编译器(在某些安装选项下甚至可能未安装x64编译器,请安装之),我们在配置的时候选用的是哪一个编译器?

2.如果已选择64位编译器,在链接器的高级选项中,是否设置“目标计算机”为“x64”架构,请看图。

3.所使用的opencv库(*.dll,*.lib)是用32位系统编译的还是用64位系统编译的?如果断定所使用的库是32位的,而opencv的目录下又找不到64位的库的话(最新的2.4.7版貌似分别编译了32位版和64位版并分别放置于*\build\x86和*\build\x64下,老版本的未知),则需要自己重新编译64位的库。注意环境变量的设置,这将直接决定你选用的库是什么版本的。

---------------------------------------------------------------------------------------------------------------------

现在,我的opencv2.4.7在win8 64bit+VS2012 64bit下使用64位库(\x64\vc11)已经可以完美运行了,将方法记录如下,算是对上篇的补充:

1.打开“配置管理器”,点击“平台”旁边的箭头,选择“新建”,如果你已经安装了64位的编译器,那么在弹出的对话框中就可以创建新的“x64”平台,创建完成后,将“活动解决方案平台”选为“x64”。

2.打开“属性管理器”,可以看到其中多了两个新的属性页,

展开“Debug|Win32”和“Debug|x64”,比较他们的第一个属性表(称之为全局属性表),可以看到一个标明了“Win32”,一个标明了“x64”。在这里,我们采用Global Method,对“Microsoft.Cpp.x64.user”按照上篇设置"Microsoft.Cpp.Win32.user"的方法进行设置。

3.双击“Microsoft.Cpp.x64.user”,弹出属性页,三步走设置其属性:“附加包含目录”-->“附加库目录”-->“附加依赖项”。依赖项的具体内容与上篇一致。

4.更改环境变量“OPENCV_DIR”的值为“*\opencv\build\x64\vc11”,“*”仍然是要替换为opencv的实际安装目录。

5.选择调试平台为“x64”,finished!

后记:

  现在返回去思考,为什么一开始无法使用“*\opencv\build\x64\vc11”下的库呢?

  主要原因就是一开始我选择的调试平台为“Win32”(从我所配置的属性表名称“Microsoft.Cpp.Win32.user”就可以看出来),所以我一直在用32位的编译器引用64位的外部库,因此就一直报“无法解析的外部符号”,当我换了32位的外部库(“*\opencv\build\x86\vc11”下的)后马上就编译成功了。因此,其他的配置都是没有问题的,环境变量的设置也是没有问题的,真正的问题在于,如果要使用64位的库就必须要调用64位的编译器;如果要使用32位的编译器编译,就只能引用32位的外部库。注意一一对应。

 

Chapter 3 另外一篇帖子上看到的关于32bit和64bit之争的观点。

 转一篇文章,解析64位技术,原作出处:http://bbs.pcbeta.com/viewthread-407723-1-1.html

------------------------------------------------------------------------------------------------------

  简单来说,现在争论的人主要围绕着windows的x86和x64版本, 但其实这个争论根本和32bit和64bit没有直接关联,只有间接关联而已。因为大部分都搞错了一个重要的基础,就是x64不代表64bit,代表64bit的东西叫做IA64。
  说一大堆专业术语恐怕大部分人都懒得看,也看不懂,就简单说概念性的东西。
  真正意义上纯64bit的东西只有intel的IA64,它完全不兼容x86运算,需要用到x86-to-IA-64的解码器才能进行x86运算,但是性能损失很厉害。
  x64这个东西准确来说应该是x86拓展x64技术,amd和intel的东西根本都是一个性质。这个技术是用来解决64bit系统处理x86代码需要损失性能的关键,因为它是直接使用x86的cpu拓展到64bit,使x86的cpu即可以处理x86运算,也可以处理64bit运算。和IA64的解码器可以说是完全反过来的东西,IA64的解码器是让64bit的cpu处理被转换成64bit的32bit代码,而x64则是x86的cpu直接处理32bit和64bit的运算。
  而争论的关键就在于32bit和64bit的软件,实际上现在我们使用的所谓64bit cpu都是x64的cpu,64bit的cpu只有Intel的安腾系列而已,也只有他们可以安装安腾服务器版原生纯64bit的windows。
  而x64的本质就是用来同时处理32bit和64bit,所以在x64上面根本无谓软件的32bit和64bit之分,因为两者都可以非常顺利的运用在x64的构架上面,只是64bit的软件效率比32bit的软件要高得多,但是不代表32bit的软件在x64上面会出现问题,当然这里不包括那些使用16位安装代码的程序,x64抛弃了16位,这你去问微软。
  换句话说,想要x64只运行64bit的时代是不会到来,因为x64就是为了同时运行x86和64bit而出现的东西,那个时代只会属于安腾cpu,而不是我们现在手里的拥有x64技术的x86 cpu。32bit的代码在x64中永远也不回消失,因为那就是x64出现的目的。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值