OpenCV人脸识别 - 图文

更新时间:2024-05-01 11:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘 要

人脸检测主要是基于计算机识别的一项数字化技术,用以准确获取人的脸部大小和位置信息,在进行人脸检测时,突出主要的脸部特征,淡化次要的环境、衣着等因素。对于某些情况下,人脸检测也可以计算出人脸,如眼睛,鼻子和嘴等精确的微妙特征。由于在安全检测系统,医学,档案管理,视频会议和人机交互等领域人脸检测系统都有光明的应用前景,因此人脸检测逐渐成为了两个跨学科领域研究的热门话题:人工智能和当前模式识别。本文基于OpenCV视觉库具体的设计并开发了对数字图像中的人脸检测的程序,所采用的人脸检测的原理主要是分类器训练模式(Adaboost算法)提取Haar特征的方法。它在整个软件极其重要的作用,图像中人脸的准确定位和识别都受图像处理好坏的直接影响。本次所设计的软件在图像处理部分所采用的方法是基于Adaboost算法进行Haar特征的提取,在此之上加以通过积分图方法来获取完整的级联分类器结构,进行人脸检测时,OpenCV级联分类器通过Adaboost人脸检测算法进行训练,此后采用不同情况下的实验样本完成精确定位以及检测试验。经过代码的设计和调试,在最后的测试中针对数字图像进行的人脸检测和定位达到了较好的效果,提高了定位和识别的正确率。

关键词:人脸检测,AdaBoost,分类器,OpenCV

Abstract

Face detection is mainly based on computer recognition of a digital technology, face size and location information to accurately obtain the person, during face detection, highlight the main facial features, dilute the secondary environment, clothing, and other factors . For some cases, face detection can also calculate a person's face, such as eyes, nose and mouth, and other subtle features accurate. Because in the field of human security detection systems, medical records management, video conferencing, and human-computer interaction face detection system has bright prospects, and therefore face detection is becoming a two interdisciplinary research fields hot topic: artificial intelligence and The current pattern recognition. This article is based. penCV vision library designed and developed specifically for digital image face detection process, the principles used face detection methods are mainly classifier training mode (Adaboost algorithm) to extract Haar features. It is in the vital role of the software, the image of the human face accurately locate and identify all that is good or bad a direct impact on the image processing. This software is designed image processing method used in part based Haar Adaboost algorithm to extract features, on top of this to be to get the full cascade classifier structure by integrating the diagram method for face detection, OpenCV cascade classifier is trained by Adaboost face detection algorithm, then the use of the experimental sample under different circumstances for accurate positioning and testing. Through design and debugging code, face detection and location in the final test for digital images to achieve better results and improve the accuracy of positioning and recognition.

Keywords: face detection ; AdaBoost ; classifier ; openCV

目 录

摘 要 ........................................................................................................................................................... 1 Abstract .......................................................................................................................................................... 2 第1章 人脸检测概述 ................................................................................................................................ 1

1.1 背景 ............................................................................................................................................... 1 1.2 目前的研究状况 ........................................................................................................................... 1 1.3 研究意义 ....................................................................................................................................... 2 第2章 人脸图像处理技术 ........................................................................................................................ 3

2.1 OpenCV概述 ............................................................................................................................... 3

2.1.1 OpenCV简介 .................................................................................................................... 3 2.1.2 应用领域 ............................................................................................................................ 3 2.1.3 OpenCV的基本结构......................................................................................................... 4 2.1.4 OpenCV的特征.................................................................................................................... 4 2.2 图像预处理 ................................................................................................................................... 5

2.2.1 灰度图像转换 .................................................................................................................... 5 2.2.2 图像噪声消除 .................................................................................................................... 6 2.2.2 图像边缘检测 .................................................................................................................... 6

第3章 人脸检测原理与算法 .................................................................................................................... 7

3.1 人脸识别原理 ............................................................................................................................... 7 3.2 人脸检测方法 ............................................................................................................................... 7 3.3 改进型双重人脸检测 ................................................................................................................... 9 3.4 双眼定位算法 ............................................................................................................................. 10 3.5 双重检测算法的实现 ................................................................................................................. 11 第4章 人脸识别算法与实现 .................................................................................................................. 13

4.1 设计思想 ..................................................................................................................................... 13 4.2 程序设计流程 ............................................................................................................................. 13 4.3 代码编写 ..................................................................................................................................... 14

4.3.1 载入图片阶段 .................................................................................................................. 14 4.3.2 图片预处理阶段 .............................................................................................................. 14 4.3.3 加载分类器并进行检测 .................................................................................................. 14 4.3.4 打印检测结果 .................................................................................................................. 15

参考文献...................................................................................................................................................... 16 附录一 人脸检测源程序 ............................................................................................................................ 17

第1章 人脸检测概述

1.1 背景

近年来,随着信号处理理论和计算机的出现及其发展,人们开始用摄像机获取环境图像并将其转换成数字信号,用计算机实现对视觉信息的处理,这就形成了计算机视觉。计算机视觉是当前计算机科学中的一个非常活跃的领域,其基本假设是:可以用计算的方式来模拟人类的视觉机制。

人脸的自动识别是一种重要的生物特征识别技术,与其它身份识别方法相比,人脸识别具有直接、方便、友好等特点,因而人脸自动识别问题的研究不仅具有重要的应用价值,而且具有重要的理论意义。现在,随着科学技术和电子商务的发展,人脸检测的应用背景已经远远超出了人脸识别系统的范畴,在基于内容的检索、数字视频处理、计算机视觉、人机交互等方面都有着重要的应用价值。

人脸识别通过计算机提取人脸的特征,并根据这些特征进行身份验证。人脸与人体的其他生物特征(指纹、虹膜等)一样与生俱来不可改变,它们所具有的唯一性和不易被复制的良好特性为身份鉴别提供了必要的前提,同其他生物特征识别技术相比,人脸识别技术具有操作简单、结果直观、隐蔽性好的优越性。

1.2 目前的研究状况

目前,许多人脸识别系统能够在特定条件(光照、背景、人脸正对摄像头等)下很好地实现人脸识别,识别效率高。但是在实际运用中,各种条件不可能都满足,特别是针对户外监控识别系统,环境变化比较大,现有系统识别效率明显下降。

目前的人脸识别系统所需要解决的问题主要有以下几点:

(1)人脸具有很复杂的细节变化,不同的外貌特征如脸形、肤色等,不同的表情如眼、嘴的开与闭等;

(2)其他物体对人脸的遮挡,如眼镜、头发和头部饰物以及其他外部物体等;另外一方面由于外在条件变化所引起:

1

(3)成像角度的不同也能造成人脸的多姿态,如平面内旋转、深度旋转以及上下旋转,其中深度旋转影响较大;

(4)光照的影响,如图像中的亮度、对比度的变化和阴影等;

(5)图像的成像条件,如摄像设备的焦距、成像距离,图像获得的途径等等。 这些困难都为解决人脸问题造成了难度。如果能找到一些相关的算法并使其能在应用过程中达到实时,将为成功构造出具有实际应用价值的人脸检测系统提供保证。 1.3 研究意义

人脸识别是机器视觉和模式识别领域最富有挑战性的课题之一,同时也具有较为广泛的应用意义。人脸识别技术是一个非常活跃的研究领域,它覆盖了数字图像处理、模式识别、计算机视觉、神经网络、心理学、生理学、数学等诸多学科的内容。如今,虽然在这方面的研究已取得了一些可喜的成果,但是FRT在实际应用中仍面临着很严峻的问题,因为人脸五官的分布是非常相似的,而且人脸本身又是一个柔性物体,表情、姿态或发型、化妆的千变万化都给正确识别带来了相当大的麻烦。如何能正确识别大量的人脸并满足实时性要求是迫切需要解决的问题。

2

第2章 人脸图像处理技术

2.1 OpenCV概述 2.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)机器学习库。该机器学习库侧重于统计方面的模式识别和聚类。MLL除了用在视觉相关的任务中,还可以方便地应用于其他的机器学习场合。

2.1.2 应用领域

自从OpenCV在1999年1月发布alpha版本开始,它就被广泛用在许多应用领域、产品和研究成果中。相关应用包括卫星地图和电子地图的拼接,扫描图像的对齐,医学图像去噪(消噪或滤波),图像中的物体分析,安全和入侵检测系统,自动监视和安全系

3

统,制造业中的产品质量检测系统,摄像机标定,军事应用,无人飞行器,无人汽车和无人水下机器人。将视觉识别技术用在声谱图上,OpenCV可以进行声音和音乐识别。

2.1.3 OpenCV的基本结构

OpenCV主体分为五个模块,其中四个模块如图2-1所示。OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。

CV 图像处理和视觉算法 MLL 统计分类器 HighGUI GUI 图像和视频输入/输出 CXCORE 基本结构和算法、XML支持、绘图函数

图2-1 OpenCV的基本结构

图2-1中并没有包含CvAux模块,该模块中一般存放一些即将被淘汰的算法和函数(如基于嵌入式隐马尔可夫模型的人脸识别算法),同时还有一些新出现的实验性的算法和函数(如背景和前景的分割)。

2.1.4 OpenCV的特征

OpenCV的主要特征有以下几个方面:

(1)图像数据的操作(分配、释放、复制、设置和转换)。

(2)图像是视频的输入输出I/O(文件与摄像头的输入、图像和视频文件输出)。

4

(3)矩阵和向量的操作以及线性代数的算法程序(矩阵积、解方程、特征值以及奇异值等)。

(4)各种动态数据结构(列表、队列、集合、树、图等)。

(5)基本的数字图像处理(滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图、图像金字塔等)。

(6)结构分析(连接部件、轮廓处理、距离变换、各自距计算、模板匹配、Hough变换、多边形逼近、直线拟合、椭圆拟合、Delaunay 三角划分等)。

(7)摄像头定标(发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计、立体对应)。

(8)运动分析(光流、运动分割、跟踪)。

(9)目标识别(特征法、隐马尔可夫模型:HMM)。

(10)基本的GUI (图像与视频显示、键盘和鼠标事件处理、滚动条)。 (11)图像标注(线、二次曲线、多边形、画文字)。 2.2 图像预处理

由于一些外界条件的不同,例如用干采集图像的设备的性能好坏、现场光照明暗程度不同等,图像通常会存在噪声、清晰度低等缺陷。此外,图像中人脸的绝对坐标及区域大小会随着人离摄像头的远近而改变。要想保证提取到的人脸特征不会受到上述这些因素的影响,则需要在提取特征人脸之前,对图像进行预处理。

2.2.1 灰度图像转换

由于对彩色图像数据的分析比黑白图像要难得多,所以将彩色图像转换成灰度

图是图像预处理的第一步。对图像进行灰度化处理是智能识别的基础,一般采集的图像都是三原色(R, G. B三个分量)。为了提高检测运动目标的速度,需要在特征提取之前将人脸图像进行灰度化,这样就只需要对像素点的灰度值进行处理。

本文采用OpenCV视觉库的接口进行灰度化处理,具体实现是通过使用cvCvtColor()函数,使用RGB2GRAY参数,将RGB彩色图转换为灰度图。

5

2.2.2 图像噪声消除

通常视频可以理解为连续的图像序列,在采集、保存、传输视频图像数据的过程中常会出现噪声干扰现象,噪声会使图像失真,使图像不像原木那样均匀连续地变化,进而会对图像的后续处理产生影响。因此,对视频图像进行检测分析之前,应对输入的图像进行噪声消除,尽最地消除图像中的噪声干扰,有助于准确快速地获取图像的特征,从而也能更好地进行模式识别等复杂处理,同时也能够减少目标检测的计算量。

按影响图像质量的噪声源可将图像噪声分为三类:第一类,阻性元件内部电子自由热运动产生的电子噪声,常用零均值高斯白噪声模型来近似。第二类,由于光电转换引起的泊松噪声(椒盐噪声)。第三类,在感光过程中产生的颗粒噪声。根据噪声与信号之间的关系,噪声也可分为加性噪声和乘性噪声。加性噪声的来源主要有人为噪声、自然噪声、内部噪声,主要表现形式有脉冲噪声和高斯噪声。乘性噪声往往具有随机性,是图像中最普通的噪声,其中一个典型代表是光照变化。

OpenCV消除图像噪声的常用方法有:均值滤波、中值滤波和高斯滤波。均值滤波对高斯噪声有较好的抑制作用,中值滤波适用于处理椒盐噪声。下面简单介绍下这三种去噪方法。

2.2.2 图像边缘检测

在对图像进行目标检测时,图像边缘是重要的提取信息。根据人眼的直观感受,目标图像的边缘信息是最明显的,图像边缘在整个图像中变化差异最大。提取图像边缘的主要依据是目标边缘处像素点的灰度值变化比较剧烈。图像边缘往往处于前景物体与背景图像的交界处,所以一般采用高通滤波器,保留高频信号。

常用的边缘检测方法有:梯度边缘检测、差分边缘检测、Sobel边缘检测算子、Laplace边缘检测算子等。OpenCV中常用于边缘检的函数有:cvSobel(), cvLaplace(),cvCanny()。

6

第3章 人脸检测原理与算法

3.1 人脸识别原理

人脸识别算法的原理:系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。

此方法是把人脸面部器官之间关系编码并准则化的人脸检测方法。这是一种自顶而下的方法,根据人脸面部器官的对称性、灰度差异等先验知识,制定一系列的准则。当图像中的待测区域符合准则,即被检测为人脸。

人脸及器官具有典型的边沿和形状特征,通常人们利用采用Laplacian,Sobel和Canny等算子来提取边沿特征,将这些特征用于人脸的定位。边沿和形状对于光照条件的变化具有很好的鲁棒性,灰度特征对光照比较敏感。

3.2 人脸检测方法

现有的人脸检测方法,人致分为三类:基于人脸几何特征的方法、基于人脸肤色的方法和基于人脸统计理论的方法。 (1)基于人脸几何特征的方法

人脸的几何特征即人脸的而部特征(如眼睛、鼻户、嘴巴、耳朵、肤色等),主要判别标准是人脸轮廓五官的对称性以及各个特征之间相对的位置。典型的基于人脸几何特征的方法有:基于先验知识的人脸检测方法和基于模板的人脸检侧方法.

基于先验知识的检测方法,首先需要确定人脸区域,然后通过前辈总结的先验知识来检验是否存在人脸,例如人脸面部五官的对称性、灰度值的不同等.人脸五官存在一些基本的规律,例如眼睛的形状及对称性,眼睛、鼻子、眉毛和嘴巴处的像素灰度值要大于人脸其他部位,鼻和嘴巴的中心点的连线与两只眼睛的连线是垂直的等.可以将这些特征信息作为一个判别准则.若图像符合这些准则,则确定存在人脸。该算法的优点为人脸特征比较直观、检测容易实现、计算量小。然而,该算法也存在不容忽视的缺点,检测准确率不高。如果人脸表发生变化或人脸偏向的角度不同,则人脸特征的判别准则

7

第4章 人脸识别算法与实现

4.1 设计思想

程序设计的总体思想是通过VS2010编写一个基于OpenCV视觉库的Windows应用程序。首先基于AdaBoost算法的思想,采用windows命令训练多个相近的弱分类器级联成理想的强分类器。然后以OpenCV视觉库的Haartraining函数结构为基础,编写使用训练好的级联分类器进行人脸检测的程序,编写的程序具有读入待检测图片,待检测图片预处理,加载分类器,利用分类器检测人脸,输出检测结果的功能。

4.2 程序设计流程

分类器的训练过程是通过windows命令来完成的,可分为两个阶段:

a.样本集建立:根据人脸数据库样本的属性,设定相应的Windows命令行参数,建立正样本集和负样本集及其相应的样本集说明文件。

b.分类器训练:

利用OpenCV视觉库包含的opencv_createsamples.exe程序建立训练集的VEC文件,在根据训练集的具体数据设定Windows命令行参数,进行人脸检测分类器训练。 根据人脸检测的功能,检测程序的设计流程可详细分为:

a. 读取待检测图像:使用OpenDlg.GetPathName()函数找到指定的待检测图像,并判断待检测图像的格式是否符合程序检测的要求,拒绝可能引起程序崩溃的错误文件格式。

b. 待检测图像预处理:利用OpenCV视觉库中所包含的功能函数,对格式符合要求的待检测图像进行预处理,对原图像进行灰度化处理和直方图均衡化,使图像中可能存在的人脸特征突出,降低图像噪声。

c. 加载分类器:在本地找到并加载指定的分类器文件。

d. 人脸检测:使用cvHaarDetectObjects()函数,快速确定图像中的haar特征,并利用成功加载的分类器对经过预处理的待检测图像进行准确并高效的人脸检测和定位。

OpenCV中已经包含有训练好的分类器文件,我们只需要配置好环境,使用它即可。

13

4.3 代码编写 4.3.1 载入图片阶段

使用MFC编程函数。penDlg()载入待检测的数字图像源文件,通过图像文件格式设定语句:JPG file format,可以设定所载入的图像为JPG或BMP或二者皆可的文件。

4.3.2 图片预处理阶段

为保证检测的效率和准确性,要预先将载入的图像转化为灰度图像在进行处理,这里使用。penCV库的。vCreateImage()创建首地址并分配存储空间函数再进行处理。

Ipllmage* Gray_Img二cvCreateImage (cvSize (img->width, img->height), 8, 1);

对图片做过灰度化处理以后,还需要考虑所有待检测图像间的差异,为确保检测结果的准确,特别是面对一些明显偏暗或偏亮的图片时,如果不对待检测图片做出调整图像的局部特征会直接影响检测的结果,因此需要对待检测的图像在预处理阶段做出对比度调整或直方图调整。

由于待检测的图像一般在尺寸,色彩,分辨率等方面不同于训练集中所用到的图像,这些图像的来源不同,背景不同,光照情况导致的亮度也有明显的差异,因此即使对这些待检测图像做对比度调整也不能够得到像调整训练集图像那样统一化的结果,因此待检测图像的预处理不适合做对比度调整,但对这些图像做灰度直方图均衡却能得到理想的效果,灰度直方图均衡化能够让过亮或过暗的图像灰度分布更加均匀,能够更好的突出图像中的人脸。

这一部分的预处理操作使用OpenCV视觉库自带的。vEqualizeHist()函数来完成。

4.3.3 加载分类器并进行检测

将训练好的分类器放在程序跟目录下,并使用下列语句指定分类器名称: const char* cascade name二\

在编写程序代码时,可以简单便捷地利用人脸的Haar特征分类器,实现方式也非常简单,运用函数cvHaarDetectObjects()即可,该函数来自OpenCV视觉库,是一种非

14

常经典的函数,常用于检测某些特定图像目标。

4.3.4 打印检测结果

当程序检测到图片中存在的人脸之后并确定位置之后,会在原图片中按人脸的所占比例以圆形标记在原图片中标出。

15

参考文献

[1] 周德华,毛敏峰,徐浩.一种多人脸跟踪算法的研究与实现[J],电视技术,2005,275(5):88~90.

[2] 王伟;张佑生;方芳;人脸检测与识别技术综述[J]. 2006,5

[3] 高建坡,王煜坚,杨浩等.一种基于KL变换的椭圆模型肤色检测方法[J].电子与信息学报.2007,V01.29,No.7.

[4] 李刚,高政、人脸自动识别方法综述、计算机应用研究、2003, Vol 8:4-9

[5] 高建坡,王煜坚,杨浩等.一种基于KL变换的椭圆模型肤色检测方法[J].电子与信息学报.2007,V01.29,No.7.

[6] 高建坡.视频序列中的人脸检测与跟踪算法研究.东南大学博士学位论文.2007,3. [7] 基于五官特征定位的人脸识别技术在防盗门中的应用[D]中国海洋大学:2006

[8] Huang F J,Chen T.Tracking of multiple faces for human—computer interfaces and virtualenvironments[C].IEEE Intl.Conf.on Multimedia and Expo.New York,July 2000.

[9] 张翠平,苏光大人脸识别技术综述中国图像图形学报[J]2000 年11 期

[10] Viola P,Jones M.Rapid object detection using a boosted cascade of simple feature[c].In:Proceedings of IEEE Conference on Computer Vision and Pattern Recognition,Kauai,Hawaii,USA,2001,1:I-51l-518

[11] Viola P.,Jones M. J.、Robust Real-Time Face Detection、International Journal of Computer Vision 57(2), 137-154, 2004

[12] 张宏林. visual C++ 数字图像模式识别技术及工程实践. 北京:人民邮电出版社,2003年4月

16

附录一 人脸检测源程序

#include \

#include \

#include #include #include #include #include #include #include #include #include

#ifdef _EiC #define WIN32 #endif

static CvMemStorage* storage = 0;

static CvHaarClassifierCascade* cascade = 0;

void detect_and_draw( IplImage* image );

const char* cascade_name =

\/* \

int main( int argc, char** argv ) {

CvCapture* capture = 0;

IplImage *frame, *frame_copy = 0; int optlen = strlen(\ const char* input_name;

if( argc > 1 && strncmp( argv[1], \ {

cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; }

17

else {

cascade_name = \ input_name = argc > 1 ? argv[1]:0; }

cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );

if( !cascade ) {

fprintf( stderr, \ fprintf( stderr,

\ return -1; }

storage = cvCreateMemStorage(0);

if( !input_name || (isdigit(input_name[0]) && input_name[1] == '\\0') )

capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' ); else

capture = cvCaptureFromAVI( input_name );

cvNamedWindow( \

if( capture ) {

for(;;) {

if( !cvGrabFrame( capture )) break;

frame = cvRetrieveFrame( capture ); if( !frame ) break;

if( !frame_copy )

frame_copy = cvCreateImage( cvSize(frame->width,frame->height),

IPL_DEPTH_8U, frame->nChannels ); if( frame->origin == IPL_ORIGIN_TL ) cvCopy( frame, frame_copy, 0 ); else

cvFlip( frame, frame_copy, 0 );

detect_and_draw( frame_copy );

18

if( cvWaitKey( 10 ) >= 0 ) break; }

cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } else {

const char* filename = input_name ? input_name : (char*)\ IplImage* image = cvLoadImage( filename, 1 );

if( image ) {

detect_and_draw( image ); cvWaitKey(0);

cvReleaseImage( &image ); } else {

/* assume it is a text file containing the

list of the image filenames to be processed - one per line */ FILE* f = fopen( filename, \ if( f ) {

char buf[1000+1];

while( fgets( buf, 1000, f ) ) {

int len = (int)strlen(buf);

while( len > 0 && isspace(buf[len-1]) ) len--; buf[len] = '\\0';

image = cvLoadImage( buf, 1 ); if( image ) {

detect_and_draw( image ); cvWaitKey(0);

cvReleaseImage( &image ); } }

fclose(f); } }

19

}

cvDestroyWindow(\

return 0; }

void detect_and_draw( IplImage* img ) {

static CvScalar colors[] = {

{{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };

double scale = 1.3;

IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale), cvRound (img->height/scale)), 8, 1 ); int i;

cvCvtColor( img, gray, CV_BGR2GRAY );

cvResize( gray, small_img, CV_INTER_LINEAR ); cvEqualizeHist( small_img, small_img ); cvClearMemStorage( storage );

if( cascade ) {

double t = (double)cvGetTickCount();

CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 0/*CV_HAAR_DO_CANNY_PRUNING*/,

cvSize(30, 30) ); t = (double)cvGetTickCount() - t;

printf( \

20

2,

for( i = 0; i < (faces ? faces->total : 0); i++ ) {

CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); CvPoint center; int radius;

center.x = cvRound((r->x + r->width*0.5)*scale); center.y = cvRound((r->y + r->height*0.5)*scale); radius = cvRound((r->width + r->height)*0.25*scale); cvCircle( img, center, radius, colors[i%8], 3, 8, 0 ); } }

cvShowImage( \ cvReleaseImage( &gray );

cvReleaseImage( &small_img ); }

21

本文来源:https://www.bwwdw.com/article/w8qg.html

Top