计算机视觉实验.docx
- 文档编号:9859583
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:15
- 大小:1.30MB
计算机视觉实验.docx
《计算机视觉实验.docx》由会员分享,可在线阅读,更多相关《计算机视觉实验.docx(15页珍藏版)》请在冰豆网上搜索。
计算机视觉实验
计算机视觉实验报告
学校:
华侨大学
班级:
10级计算机科学与技术
(2)班
实验名称:
基于opencv的人脸识别
小组成员:
姓名:
王佳丽学号:
1019213017
姓名:
郭丹萍学号:
姓名:
陈嘉学号:
任课教师:
钟必能
一.Opencv简介
OpenCV于1999年由Intel建立,如今由WillowGarage提供支持。
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
最新版本是2.4.7。
OpenCV拥有包括500多个C函数的跨平台的中、高层API。
它不依赖于其它的外部库——尽管也可以使用某些外部库。
OpenCV为Intel®IntegratedPerformancePrimitives(IPP)提供了透明接口。
这意味着如果有为特定处理器优化的的IPP库,OpenCV将在运行时自动加载这些库。
OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和单片机系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。
Opencv具有其自身优势,主要体现在:
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(IntegratedPerformancePrimitives)得到更快的处理速度。
右图为OpenCV与当前其他主流视觉函数库的性能比较。
Opencv的应用领域很广,包括、人机互动、物体识别、图象分割、人脸识别、动作识别、运动跟踪、机器人、运动分析、机器视觉、结构分析
二.人脸识别简介
人脸识别,是北京中研众力科技有限公司基于人的脸部特征信息进行身份识别的一种生物识别技术。
用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部的一系列相关技术,通常也叫做人像识别、面部识别。
人脸与人体的其它生物特征(指纹、虹膜等)一样与生俱来,它的唯一性和不易被复制的良好特性为身份鉴别提供了必要的前提,与其它类型的生物识别比较人脸识别具有如下特点:
非强制性:
用户不需要专门配合人脸采集设备,几乎可以在无意识的状态下就可获取人脸图像,这样的取样方式没有“强制性”;
非接触性:
用户不需要和设备直接接触就能获取人脸图像;
并发性:
在实际应用场景下可以进行多个人脸的分拣、判断及识别;
除此之外,还符合视觉特性:
“以貌识人”的特性,以及操作简单、结果直观、隐蔽性好等特点。
人脸识别系统主要包括四个组成部分,分别为:
人脸图像采集及检测、人脸图像预处理、人脸图像特征提取以及匹配与识别。
人脸识别主要用于身份识别。
由于视频监控正在快速普及,众多的视频监控应用迫切需要一种远距离、用户非配合状态下的快速身份识别技术,以求远距离快速确认人员身份,实现智能预警。
人脸识别技术无疑是最佳的选择,采用快速人脸检测技术可以从监控视频图象中实时查找人脸,并与人脸数据库进行实时比对,从而实现快速身份识别。
人脸识别的主要产品有人脸识别门禁是基于先进的人脸识别技术,结合成熟的ID卡和指纹识别技术而推出的安全实用的门禁产品。
产品采用分体式设计,人脸、指纹和ID卡信息的采集和生物信息识别及门禁控制内外分离,实用性高、安全可靠。
系统采用网络信息加密传输,支持远程进行控制和管理,可广泛应用于银行、军队、公检法、智能楼宇等重点区域的门禁安全控制。
一般来说,人脸识别系统包括图像摄取、人脸定位、图像预处理、以及人脸识别(身份确认或者身份查找)。
系统输入一般是一张或者一系列含有未确定身份的人脸图像,以及人脸数据库中的若干已知身份的人脸图象或者相应的编码,而其输出则是一系列相似度得分,表明待识别的人脸的身份。
人脸识别算法分类
基于人脸特征点的识别算法(Feature-basedrecognitionalgorithms)。
基于整幅人脸图像的识别算法(Appearance-basedrecognitionalgorithms)。
基于模板的识别算法(Template-basedrecognitionalgorithms)。
利用神经网络进行识别的算法(Recognitionalgorithmsusingneuralnetwork)。
基于光照估计模型理论
提出了基于Gamma灰度矫正的光照预处理方法,并且在光照估计模型的基础上,进行相应的光照补偿和光照平衡策略。
优化的形变统计校正理论
基于统计形变的校正理论,优化人脸姿态;
强化迭代理论
强化迭代理论是对DLFA人脸检测算法的有效扩展;
独创的实时特征识别理论
该理论侧重于人脸实时数据的中间值处理,从而可以在识别速率和识别效能之间,达到最佳的匹配效果
人脸识别的优势在于其自然性和不被被测个体察觉的特点。
所谓自然性,是指该识别方式同人类(甚至其他生物)进行个体识别时所利用的生物特征相同。
例如人脸识别,人类也是通过观察比较人脸区分和确认身份的,另外具有自然性的识别还有语音识别、体形识别等,而指纹识别、虹膜识别等都不具有自然性,因为人类或者其他生物并不通过此类生物特征区别个体。
不被察觉的特点对于一种识别方法也很重要,这会使该识别方法不令人反感,并且因为不容易引起人的注意而不容易被欺骗。
人脸识别具有这方面的特点,它完全利用可见光获取人脸图像信息,而不同于指纹识别或者虹膜识别,需要利用电子压力传感器采集指纹,或者利用红外线采集虹膜图像,这些特殊的采集方式很容易被人察觉,从而更有可能被伪装欺骗。
人脸识别被认为是生物特征识别领域甚至人工智能领域最困难的研究课题之一。
人脸识别的困难主要是人脸作为生物特征的特点所带来的。
比如相似性:
不同个体之间的区别不大,所有的人脸的结构都相似,甚至人脸器官的结构外形都很相似。
这样的特点对于利用人脸进行定位是有利的,但是对于利用人脸区分人类个体是不利的。
易变性:
人脸的外形很不稳定,人可以通过脸部的变化产生很多表情,而在不同观察角度,人脸的视觉图像也相差很大,另外,人脸识别还受光照条件(例如白天和夜晚,室内和室外等)、人脸的很多遮盖物(例如口罩、墨镜、头发、胡须等)、年龄等多方面因素的影响。
在人脸识别中,第一类的变化是应该放大而作为区分个体的标准的,而第二类的变化应该消除,因为它们可以代表同一个个体。
通常称第一类变化为类间变化(inter-classdifference),而称第二类变化为类内变化(intra-classdifference)。
对于人脸,类内变化往往大于类间变化,从而使在受类内变化干扰的情况下利用类间变化区分个体变得异常困难。
随着技术的进一步成熟和社会认同度的提高,人脸识别技术将应用在更多的领域。
包括刑侦破案、门禁系统、摄像监视、网络应用、身份识别、信息安全、娱乐应用等。
三.Opencv实现人脸识别实验过程
1.opencv环境配置(win7+vs2010+opencv2.3.1)
①下载OpenCV2.3.1 1. 从 下载 OpenCV for Windows(也即 OpenCV-2.3.1-2. 将 OpenCV-2.3.1-win-superpack.exe 解压并放到某个路径目录下,例如 D:
\OpenCV2.3.1。
其目录结构
②配置环境变量
右击“我的电脑”选“属性”,点“高级系统属性”,点“环境变量”,在用户变量中新建两个用户变量, PATH D:
\OpenCV2.3.1\build
OPENCV D:
\OpenCV2.3.1\build\x86\vc10\bin 如下图所示。
③配置VS2010
在“工具”->“选项”->“项目与解决方案”->“VC++ 目录”中 选择“视图”——“其他窗口”——“属性管理器”,如下图所示
双击Debug | Win32下的“Microsoft.Cpp.Win32.user”,如下图所示。
在弹出的配置框中配置,选择“VC++目录”。
1、在“包含目录”中的结尾处(若结尾处无英文状态下的“;”则需自行添加“;”,下同)加入以下内容 $(opencv)\include\opencv;$(opencv)\include\opencv2;$(opencv)\include; 2、在库目录中的结尾处加入以下内容添加:
$(opencv)\x86\vc10\lib;
注:
$(opencv)\include\opencv是告诉VC去“opencv”这个变量中的文件夹下的\include\opencv路径中
如下图所示。
在“链接器”-“输入”-“附加依赖选项”中的结尾处加入以下内容:
$(opencv)\x86\vc10\lib\opencv_core231d.lib;$(opencv)\x86\vc10\lib\opencv_highgui231d.lib;$(opencv 如下图所示
点击确定,至此OpenCV的配置完成
四.Opencv人脸识别步骤
1、训练分类器
目前人脸检测分类器大都是基于haar特征利用Adaboost学习算法训练的。
目标检测方法最初由PaulViola[Viola01]提出,并由RainerLienhart[Lienhart02]对这一方法进行了改善.首先,利用样本(大约几百幅样本图片)的harr特征进行分类器训练,得到一个级联的boosted分类器。
训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如人脸或汽车等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小(例如,20x20)。
分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。
检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。
为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。
为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。
所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描。
分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。
在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。
目前支持这种分类器的boosting技术有四种:
DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost。
"boosted"即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。
基础分类器是至少有两个叶结点的决策树分类器。
Haar特征是基础分类器的输入,主要描述如下。
目前的算法主要利用下面的Harr特征。
2、利用分类器进行检测
对于分类器的使用大致要经过三个阶段,从文件中加载分类器、利用分类器进行检测、检测完成后释放分类器。
这三个阶段对应三个函数,cvLoadHaarClassifierCascade、cvHaarDetectObjects、cvReleaseHaarClassifierCascade。
这三个函数包含在库文件opencv_objdetect231d.lib中,级联分类器训练中采用的检测目标的尺寸。
这个信息在分类器中没有存储,因此要单独指出。
函数cvLoadHaarClassifierCascade用于从文件中装载训练好的利用哈尔特征的级联分类器,或者从OpenCV中嵌入的分类器数据库中导入。
分类器的训练可以应用函数haartraining(详细察看opencv/apps/haartraining)这个数值是在训练分类器时就确定好的,修改它并不能改变检测的范围或精度。
从文件中导入分类器,可以使用函数cvLoad。
b、CvSeq*cvHaarDetectObjects(constCvArr*image,CvHaarClassifierCascade*cascade,CvMemStorage*storage,doublescale_factor=1.1,intmin_neighbors=3,intflags=0,CvSizemin_size=cvSize(0,0));
image
被检图像
cascade
harr分类器级联的内部标识形式
storage
用来存储检测到的一序列候选目标矩形框的内存区域。
scale_factor
在前后两次相继的扫描中,搜索窗口的比例系数。
例如1.1指将搜索窗口依次扩大10%。
min_neighbors
构成检测目标的相邻矩形的最小个数(缺省-1)。
如果组成检测目标的小矩形的个数和小于min_neighbors-1都会被排除。
如果min_neighbors为0,则函数不做任何操作就返回所有的被检候选矩形框,这种设定值一般用在用户自定义对检测结果的组合程序上。
操作方式。
当前唯一可以定义的操作方式是CV_HAAR_DO_CANNY_PRUNING。
如果被设定,函数利用Canny边缘检测器
排除一些边缘很少或者很多的图像区域,因为这样的区域一般不含被检目标。
人脸检测中通过设定阈值使用了这种方法,并因此提高了检测速度。
检测窗口的最小尺寸。
缺省的情况下被设为分类器训练时采用的样本尺寸(人脸检测中缺省大小是~20×20)。
函数cvHaarDetectObjects使用针对某目标物体训练的级联分类器在图像中找到包含目标物体的矩形区域,并且将这些区域作为一序列的矩形框返回。
函数以不同比例大小的扫描窗口对图像进行几次搜索(察看cvSetImagesForHaarClassifierCascade)。
每次都要对图像中的这些重叠区域利用cvRunHaarClassifierCascade进行检测。
有时候也会利用某些继承(heuristics)技术以减少分析的候选区域,例如利用Canny裁减(prunning)方法。
函数在处理和收集到候选的方框(全部通过级联分类器各层的区域)之后,接着对这些区域进行组合并且返回一系列各个足够大的组合中的平均矩形。
调节程序中的缺省参数(scale_factor=1.1,min_neighbors=3,flags=0)用于对目标进行更精确同时也是耗时较长的进一步检测。
为了能对视频图像进行更快的实时检测,参数设置通常是:
scale_factor=1.2,min_neighbors=2,flags=CV_HAAR_DO_CANNY_PRUNING,min_size=
五.代码
#include"opencv2/objdetect/objdetect.hpp"
#include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp"
#include
#include
usingnamespacestd;
usingnamespacecv;
/**函数声明*/
voiddetectAndDisplay(Matframe);
/**全局变量*/
stringface_cascade_name="haarcascade_frontalface_alt.xml";
stringeyes_cascade_name="haarcascade_eye_tree_eyeglasses.xml";
CascadeClassifierface_cascade;
CascadeClassifiereyes_cascade;
stringwindow_name="Capture-Facedetection";
RNGrng(12345);
/**@主函数*/
intmain(intargc,constchar**argv)
{
CvCapture*capture;
Matframe;
//--1.加载级联分类器文件
if(!
face_cascade.load(face_cascade_name)){printf("--(!
)Errorloading\n");return-1;};
if(!
eyes_cascade.load(eyes_cascade_name)){printf("--(!
)Errorloading\n");return-1;};
//--2.打开内置摄像头视频流
capture=cvCaptureFromCAM(-1);
if(capture)
{
while(true)
{
frame=cvQueryFrame(capture);
//--3.对当前帧使用分类器进行检测
if(!
frame.empty())
{detectAndDisplay(frame);}
Else
{printf("--(!
)Nocapturedframe--Break!
");break;}
intc=waitKey(10);
if((char)c=='c'){break;}
}
}
return0;
}
/**@函数detectAndDisplay*/
voiddetectAndDisplay(Matframe)
{
std:
:
vector
Matframe_gray;
cvtColor(frame,frame_gray,CV_BGR2GRAY);
equalizeHist(frame_gray,frame_gray);
//--多尺寸检测人脸
face_cascade.detectMultiScale(frame_gray,faces,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
for(inti=0;i { Pointcenter(faces[i].x+faces[i].width*0.5,faces[i].y+faces[i].height*0.5); ellipse(frame,center,Size(faces[i].width*0.5,faces[i].height*0.5),0,0,360,Scalar(255,0,255),4,8,0); MatfaceROI=frame_gray(faces[i]); std: : vector //--在每张人脸上检测双眼 eyes_cascade.detectMultiScale(faceROI,eyes,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30)); for(intj=0;j { Pointcenter(faces[i].x+eyes[j].x+eyes[j].width*0.5,faces[i].y+eyes[j].y+eyes[j].height*0.5); intradius=cvRound((eyes[j].width+eyes[i].height)*0.25); circle(frame,center,radius,Scalar(255,0,0),4,8,0); } } //--显示结果图像 imshow(window_name,frame); } 六.实验结果
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 视觉 实验