第6章 人脸检测的实现
6.1 OpenCV概述
6.1.1 OpenCV简介
OpenCV是Intel公司支持的开源计算机视觉库。它轻量级而且高效——由一系
列 C函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。1999年在俄罗斯设立的软件开发中心“Software Developmellt Cellter¨开发的。
OpenCV采用C/C++语言编写,可以运行在Linux/Windows/Mac等操作系统上。OpenCV还提供了Python、Ruby、MATLAB以及其他语言的接口。OpenCV的设计目标是执行速度尽量快,主要关注实时应用。它采用优化的C代码编写,能够充分利用多核处理器的优势。如果是希望在Intel平台上得到更快的处理速度,可以购买Intel的高性能多媒体函数库IPP(Integrated Performance Primitives)。IPP库包含许多从底层优化的函数,这些函数涵盖多个应用领域。如果系统已经安装了IPP库,OpenCV会在运行时自动使用相应的IPP库。
OpenCV的一个目标是构建一个简单易用的计算机视觉框架,以帮助开发人员更便捷地设计更复杂的计算机视觉相关应用程序。OpenCV包含的函数有500多个,覆盖了计算机视觉的许多应用领域,如工厂产品检测、医学成像、信息安全、用户界面、摄像机标定、立体视觉和机器人等。因为计算机视觉和机器学习密切相关,所以OpenCV还提供了MLL(Machine Learning Library)机器学习库。该机器学习库侧重于统计方面的模式识别和聚类(clustering)。MLL除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场合。 6.1.2 应用领域
自从OpenCV在1999年1月发布alpha版本开始,它就被广泛用在许多应用领域、产品和研究成果中。相关应用包括卫星地图和电子地图的拼接,扫描图像的对齐,医学图像去噪(消噪或滤波),图像中的物体分析,安全和入侵检测系统,自动监视和安全系统,制造业中的产品质量检测系统,摄像机标定,军事应用,无人飞行器,无人汽车和无人水下机器人。将视觉识别技术用在声谱图上,OpenCV可以进行声音和音乐识别。在斯坦福大学的Stanley机器人项目中,OpenCV是其视觉系统的关键部分。Stanley在DARPA机器人沙漠挑战赛中,赢得了二百万美元奖金。
31
6.1.3 OpenCV的起源
OpenCV诞生于Intel研究中心,其目的是为了促进CPU密集型应用。为了达到这一目的,Intel启动了多个项目,包括实时光线追踪和三维显示墙。一个在Intel工作的OpenCV作者在访问一些大学时,注意到许多顶尖大学中的研究组(如MIT媒体实验室)拥有很好的内部使用的开放计算机视觉库—— (在学生们之间互相传播的代码),这会帮助一个新生从高的起点开始他/她的计算机视觉研究。这样一个新生可以在以前的基础上继续开始研究,而不用从底层写基本函数。
因此,OpenCV的目的是开发一个普遍可用的计算机视觉库。在Intel的性能库团队的帮助下,OpenCV实现了一些核心代码以及算法,并发给Intel俄罗斯的库团队。这就是OpenCV的诞生之地:在与软件性能库团队的合作下,它开始于Intel的研究中心,并在俄罗斯得到实现和优化。
俄罗斯团队的主要负责人是Vadim Pisarevsky,他负责管理项目、写代码并优化OpenCV的大部分代码,在OpenCV中很大一部分功劳都属于他。跟他一起,Victor Eruhimov帮助开发了早期的架构,Valery Kuriakin管理俄罗斯实验室并提供了很大的支持。在开始时,OpenCV有以下三大目标:
(1)为基本的视觉应用提供开放且优化的源代码,以促进视觉研究的发展。能有效地避免“闭门造车”。
(2)通过提供一个通用的架构来传播视觉知识,开发者可以在这个架构上继续开展工作,所以代码应该是非常易读的且可改写。
(3)本库采用的协议不要求商业产品继续开放代码,这使得可移植的、性能被优化的代码可以自由获取,可以促进基于视觉的商业应用的发展。
这些目标说明了OpenCV的缘起。计算机视觉应用的发展会增加对快速处理器的需求。与单独销售软件相比,促进处理器的升级会为Intel带来更多收入。这也许是为什么这个开放且免费的库出现在一家硬件生产企业中,而不是在一家软件公司中。从某种程度上说,在一家硬件公司里,在软件方面会有更多创新的空间。 6.1.4 OpenCV的基本结构
OpenCV主体分为五个模块,其中四个模块如图6-1所示。OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。
32
CV 图像处理和视觉算法 MLL 统计分类器 HighGUI GUI 图像和视频输入/输出 CXCORE 基本结构和算法、XML支持、绘图函数
图6-1 OpenCV的基本结构
图6-1中并没有包含CvAux模块,该模块中一般存放一些即将被淘汰的算法和函数(如基于嵌入式隐马尔可夫模型的人脸识别算法),同时还有一些新出现的实验性的算法和函数(如背景和前景的分割)。 6.1.5 OpenCV的特征
OpenCV的主要特征有以下几个方面:
(1)图像数据的操作 ( 分配、释放、复制、设置和转换)。
(2)图像是视频的输入输出I/O (文件与摄像头的输入、图像和视频文件输出)。 (3)矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。
(4)各种动态数据结构(列表、队列、集合、树、图等)。
(5)基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图、图像金字塔等)。 (6)结构分析(连接部件、轮廓处理、距离变换、各自距计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合、Delaunay 三角划分等)。
(7)摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。
(8)运动分析(光流、运动分割、跟踪)。 (9)目标识别(特征法、隐马尔可夫模型:HMM)。
(10)基本的GUI (图像与视频显示、键盘和鼠标事件处理、滚动条)。 (11)图像标注(线、二次曲线、多边形、画文字)
33
6.2 OpenCV在检测中的应用
6.2.1 编译OpenCV
(1)用CMake导出VC++项目文件
①运行cmake-gui,设置路径为OpenCV安装路径(本文档安装位置为:D:\\Program Files\\OpenCV2.0),并创建子目录D:\\Program Files\\OpenCV2.0\\vc2008,用于存放编译结果。 ②然后点 configure,在弹出的对话框内选择 Visual Studio 9 2008。
③因为是VC++2008的Express版本,不支持OpenMP,所以需要取消ENABLE_OPENMP选项。
(2)编译 OpenCV Debug和Release版本库
完成上一步骤后,将在D:\\Program Files\\OpenCV2.0\\vc2008目录下生成OpenCV.sln的VC Solution File,用VC++ 2008 Express打开OpenCV.sln,然后执行如下操作:
①在Debug下,选择Solution Explorer里的 Solution OpenCV,点右键,运行\Solution\见图6-2);如编译无错误,再选择INSTALL项目,运行\(见图6-3)。 ②在Release下,选择Solution Explorer里的 Solution OpenCV,点右键,运行\(见图6-4);如编译无错误,再选择INSTALL项目,运行\。(见图6-5)
此时,OpenCV的*d.dll文件(for debug)和*.dll文件(for release)将出现在D:\\Program Files\\OpenCV2.0\\vc2008\\bin目录中;OpenCV的*d.lib文件(for debug)和*.lib文件(for release)将出现在D:\\Program Files\\OpenCV2.0\\vc2008\\lib目录;头文件*.h出现在D:\\Program Files\\OpenCV2.0\\vc2008\\include\\opencv中。
可以被VC++ 2008 Express调用的OpenCV动态库生成完毕。
34
图6-2 在Debug下运行\
图6-3 在Debug下编译无误,运行\
35