• 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”,变量值为"*opencvuildx64vc11",“*”应更换为具体的安装目录;

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

    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 <opencv2highguihighgui.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”的值改为“"*opencvuildx86vc11”,即将原来的x64改为x86,这次终于编译运行成功了,运行结果如下,显示出了OpenCV的logo。 

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

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

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

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

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

  • 相关阅读:
    find命令
    shell编程基础
    grep命令
    awk命令
    结对项目之需求分析与原型模型设计
    使用Git进行代码管理的心得
    软件工程的实践项目的自我目标
    第五次作业——团队项目——需求规格说明书
    调研android开发环境的发展演变
    结对编程总结
  • 原文地址:https://www.cnblogs.com/marcworld/p/3430432.html
Copyright © 2020-2023  润新知