Win8_64bit+VS2012下的OpenCV学习笔记(1)

前言:

  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可以算是用起来了!

posted @ 2013-11-18 22:46  午后阳光*  阅读(1086)  评论(0编辑  收藏  举报