基于人脸检测技术的人数统计系统.docx
《基于人脸检测技术的人数统计系统.docx》由会员分享,可在线阅读,更多相关《基于人脸检测技术的人数统计系统.docx(24页珍藏版)》请在冰豆网上搜索。
基于人脸检测技术的人数统计系统
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2016年春季学期
软件工程开发综合训练课程设计
题目:
基于人脸检测技术的人数统计系统
专业班级:
计算机科学与技术13级4班
姓名:
乔琪
学号:
13240408
指导教师:
曹来成
成绩:
目录
摘要1
1.问题描述2
1.1问题背景2
1.2设计要求2
1.3面部感知系统的重要内容2
2.系统设计3
2.1各功能模块说明3
2.2总体结构设计4
2.3图像预处理的层次图5
3.系统测试5
3.1测试的目的5
3.2测试原则6
3.3测试方案7
3.4测试结果7
3.5测试总结10
参考文献11
总结12
附录(程序源代码)13
摘要
图像拼接(imagemosaic)技术是将一组相互间重叠部分的图像序列进行空间匹配对准,经重采样合成后形成一幅包含各图像序列信息的宽视角场景的、完整的、高清晰的新图像的技术。
图像拼接在摄影测量学、计算机视觉、遥感图像处理、医学图像分析、计算机图形学等领域有着广泛的应用价值。
一般来说,图像拼接的过程由图像获取,图像配准,图像合成三步骤组成,其中图像配准是整个图像拼接的基础。
本文研究了两种图像配准算法:
基于特征和基于变换域的图像配准算法。
在基于特征的配准算法的基础上,提出一种稳健的基于特征点的配准算法。
首先改进Harris角点检测算法,有效提高所提取特征点的速度和精度。
然后利用相似测度NCC(normalizedcrosscorrelation——归一化互相关),通过用双向最大相关系数匹配的方法提取出初始特征点对,用随机采样法RANSAC(RandomSampleConsensus)剔除伪特征点对,实现特征点对的精确匹配。
最后用正确的特征点匹配对实现图像的配准。
本文提出的算法适应性较强,在重复性纹理、旋转角度比较大等较难自动匹配场合下仍可以准确实现图像配准。
关键词:
图像拼接 图像配准 图像融合 全景图
1.问题描述
1.1问题背景:
随着安全入口控制和金融贸易方面应用需要的快速增长,生物统计识别技术得到了新的重视。
目前,微电子和视觉系统方面取得的新进展,使该领域中高性能自动识别技术的实现代价降低到了可以接受的程度。
而人脸识别是所有的生物识别方法中应用最广泛的技术之一,人脸识别技术是一项近年来兴起的,但不大为人所知的新技术。
人们更多的是在电影中看到这种技术的神奇应用:
警察将偷拍到的嫌疑犯的脸部照片,输入到电脑中,与警方数据库中的资料进行比对,并找出该嫌犯的详细资料和犯罪记录。
这并非虚构的情节。
在国外,人脸识别技术早已被大量使用在国家重要部门以及军警等安防部门。
在国内,对于人脸识别技术的研究始于上世纪90年代,目前主要应用在公安、金融、网络安全、物业管理以及考勤等领域。
1.2设计要求:
本设计要求学生开发一个基于人脸检测技术的人数统计系统,可以实现在一张有多张人脸的图像中检测出人脸,并统计出图像中的人数(允许有误差)。
该系统的主要关键技术问题是人脸检测算法。
、要求开发出一个可独立运行的基于人脸检测技术的人数统计系统。
整个系统由图像预处理、人脸检测、人数统计及结果输出等模块组成;
、首先要对人脸/非人脸图像进行预处理,预处理的步骤包括:
对图像进行灰度化、直方图均衡化、中值滤波等操作;
、其次要选择、实现一种人脸检测算法(例如:
基于AdaBoost的人脸检测算法),人脸检测准确率应超过80%。
、系统的开发可以采用C++或Matlab编程语言来实现;
、要求设计的基于人脸检测技术的人数统计系统可独立运行,具有良好的用户交互界面、易操作性和可靠性等。
1.3面部感知系统的重要内容
基于视觉通道信息的面部感知系统,包括人脸检测和跟踪、面部特征定位、面部识别、人脸归类(年龄、种族、性别等的判别)、表情识别、唇读等分系统,如图1-1所式,可以看出,继人脸检测和跟追之后,面部特征定位通常是面部感知的一个必备环节,是后续工作的基础,具有重要的意义。
尽管人脸识别不能说是其他面部感知模块的必备功能,但是,可以肯定的是,利用已知的身份信息,结合特定人的先验知识,可以提高表情分析、唇读和语音识别、手势识别乃至手写体识别的可靠性。
而计算机对使用者身份确认的最直接的应用就是基于特定使用者的环境设置:
如使用者的个性化工作环境,信息的共享和隐私保护等等。
2.系统设计
该人脸检测系统主要有五个部分构成:
图像获取功能、图像预处理功能、人脸定位功能、特征提取功能、识别功能。
2.1各功能模块说明
、图像获取功能:
该模块主要是从摄像头拍照后进行获取图片,也可以从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。
、图像预处理功能:
该模块主要包括图像光线补偿、图像变成灰色、高斯平滑、均衡直方图、实现图像对比度增强、二值化变换等。
、人脸定位功能:
人脸定位是将典型的脸部特征(如眼睛,鼻尖,嘴唇等等)标记出来,在本系统中,定位的特征是眼睛,鼻尖和嘴巴三个。
由于眼睛具有对称性,因此可以很快就能标记出来,而鼻子是在眼睛下面,且嘴巴在鼻子下面,所以只要眼睛标记好,鼻子和嘴巴也能相应的标记出来。
、特征提取功能:
特征提取按以下4个步骤进行:
(1)、提取两只眼睛的距离
(2)、眼睛的倾角度
(3)、眼睛、嘴巴的重心
(4)、用一个矩形标出每一个特征
、识别功能:
该模块通过与库存中的特征向量进行比较,找出与特征最相近的参数,再对该参数进一步分析。
如果分析在我们所确认的范围内,我们就认为该人就是我们所要找的。
然后从库存中提取出该人相关的信息,并显示出来。
如果库存中没有,则给出提示是否对存库作为样本。
2.2总体结构设计
该应用程序的总体结构设计流程图如图2-1所示:
用户
从“文件”菜单中选择“打开”选项
在弹出的“打开”对话框中选择要打开的位图,点击“确定”,应用程序显示所要打开的位图
获取脸部区域
获取特征参数
人脸定位
识别
图像预处理
显示识别结果
图2—1总体结构设计流程图
2.3图像预处理的层次图
如图2-2所示:
图2-2预处理的层次图
3.系统测试
3.1测试的目的:
简单地说,就是替用户受过,测试的最终目的是确保最终交给用户的产品的功能符合用户的需求,把尽可能多的问题在产品交给用户之前发现并改正。
具体地讲,测试一般要达到下列目标:
、确保产品完成了它所承诺或公布的功能,并且所有用户可以访问到的功能都有明确的书面说明------在某种意义上与ISO9001是同一种思想。
产品缺少明确的书面文档,是厂商一种短期行为的表现,也是一种不负责任的表现。
所谓短期行为,是指缺少明确的书面文档既不利于产品最后的顺利交付,容易与用户发生矛盾,影响厂商的声誉和将来与用户的合作关系;同时也不利于产品的后期维护,也使厂商支出超额的用户培训和技术支持费用。
从长期利益看,这是很不划算的。
领测认为接触过的软件产品,很少有向方正这样大大的产品、薄薄的文档。
当然,书面文档的编写和维护工作对于使用快速原型法(RAD)开发的项目是最为重要的、最为困难,也是最容易被忽略的。
最后,书面文档的不健全甚至不正确,也是测试工作中遇到的最大和最头痛的问题,它的直接后果是测试效率低下、测试目标不明确、测试范围不充分,从而导致最终测试的作用不能充分发挥、测试效果不理想。
、确保产品满足性能和效率的要求
使用起来系统运行效率低(性能低)、或用户界面不友好、用户操作不方便(效率低)的产品不能说是一个有竞争力的产品。
用户最关心的不是你的技术有多先进、功能有多强大,而是他能从这些技术、这些功能中得到多少好处。
也就是说,用户关心的是他能从中取出多少,而不是你已经放进去多少。
、确保产品是健壮的和适应用户环境的
健壮性即稳定性,是产品质量的基本要求,尤其对于一个用于事务关键或时间关键的工作环境中。
另外就是不能假设用户的环境(某些项目可能除外),如:
报业用户许多配置是比较低的,而且是和某些第三方产品同时使用的。
通过导入图片,检测人数统计的速度以及准确程度,分别导入一张、两张、三张、四张、五张以及14张人脸的图片,检测程序的正确率。
3.2测试原则:
、应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
、测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。
、在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。
不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。
、充分注意测试中的群集现象。
经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。
应该对错误群集的程序段进行重点测试。
、严格执行测试计划,排除测试的随意性。
测试计划应包括:
所测软件的功能输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的组装方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。
、应当对每一个测试结果做全面的检查。
、妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。
3.3测试方案:
本系统主要由图像处理、人脸定位、特征提取、识别四个部分组成,而图像处理对于后面的工作结果好坏起着至关重要的作用,因此从软件开发的最初阶段我们就要对软件进行不断的测试,对图像处理模块中的各个子模块进行测试以便检测经过处理后的图像效果是否达到预期的效果。
3.4测试结果:
、主界面:
图4—1
在运行程序的主界面有两个菜单选项,分别是菜单和操作。
菜单下包含从图片统计和退出功能,从图片统计即导入图片,还有操作选项里面包含识别,点击“识别”一次即加载图片,点击第二次即识别图片。
、导入图片界面:
图4—2
图4—3
上面两张图分别是导入图片过程中要求选择图片的路径,下面从文件夹导入一张图片。
图4—4
点击“识别”,将会进行加载图片,加载完成之后会有提示,再次点击“识别”,将会识别出如下的结果。
图4—5
正确的识别出图片中总共有14个人,但是在有些情况下也会出现错误,你如下面的情况:
图4—6
明明是两个人,但是识别出来的却是三个人。
但是在整个测试过程中能满足80%的情况下是正确的。
3.5测试总结:
在人脸检测测试的整个人过程中,随机导入图片,测试结果显示,当导入的图图尺寸过大或者人脸亮度较暗时,识别图片时可能会出错,究其原因,可能是在设计的过程中没有添加曝光增亮环节,还有本设计支持的图片格式为jpg。
总体来说,实现了一个基于人脸检测技术的人数统计系统,可以实现在一张有多张人脸的图像中检测出人脸,并统计出图像中的人数(允许有误差)。
该系统的主要关键技术问题是人脸检测算法。
、整个系统由图像预处理、人脸检测、人数统计及结果输出等模块组成;
、预处理的步骤包括:
对图像进行灰度化、直方图均衡化、中值滤波等操作;
、实现了基于AdaBoost的人脸检测算法,人脸检测准确率应超过80%。
、系统的开发采用JAVA编程语言来实现;在eclipse中集成了WindowBuilder,以及使用了opencv2.4.9。
、具有良好的用户交互界面、易操作性和可靠性等。
参考文献
1.侯戬,通用车牌定位系统的研究与实现[D].华南理工大学,2011.
2.王永杰, 裴明涛, 贾云得.多信息融合的快速车牌定位[J].中国图像图形学报,2014,3
3.山世光.面部特征检测与识别的研究与实现.哈尔滨工业大学,1999,7
4.蒋遂平.人脸识别技术及应用简介.中国计算机世界出版社,2003,12
5.徐慧.java数字图像实用工程案例精选.人民邮电出版社,2004,3
6.徐慧.java数字图像模式识别技术及工程实践.北京:
人民邮电出版社,2004,3
7.胡迎春等.人脸图像特征点眼睛的定位与提取.柳州:
广西工学院学报,2003,3
8.周长发.精通java图像处理编程.北京:
电子工业出版社,2004,10
9.张宏林.java数字图像模式识别技术及工程实践.北京:
人民邮电出版社,2003,4
10.何斌等.java数字图像处理.北京:
人民邮电出版社,2001,4
11.黄维通,姚瑞霞.Vc++6.0程序设计教程.北京:
机械工业出版社,2003,4
12.马安鹏.Vc++6.0程序设计导学.北京:
清华大学出版社,2003,6
13.张威等.java程序设计技巧与实例.北京:
中国铁道出版社,2003,3
14.黄维通姚瑞霞著.visualC++程序设计教程.北京:
机械工业出版社,2004,1
总结
在这几周的课设里,面对着诸多的问题和考验,我一次又一次享受了难题解决前的困惑和难题解决后的兴奋。
虽然本次设计的成品还存在着一些问题,但是,对于作者来说,却是不小的收获。
经过几周的课程设计,对我各方面的影响都很大,对此我体会颇多:
1、在设计的过程中,每一个步骤都十分的重要。
设计前,一定要将需求分析工作做透彻,这直接关系到系统开发实现的难易程度和设计的进度。
这就要求我们经常与指导老师和用户交流信息,即使发现设计方向上的错误。
千万不要认为分析工作可有可无,分析做得好,实现起来时就相当轻松。
就像设计数据库系统,建表工作是最重要的一样。
一旦我们将内容和设计思想确定下来以后,不要轻易改动。
确实要改,必须征求指导老师的意见。
一般,指导老师丰富的经验将给我们极大的帮助。
2、熟悉软件开发工具,如eclipse、opencv、WindowBuilder插件等。
这个只要通过动手熟悉就可以了,以前的学习方法是看书看书再看书,上机操作的时间很少,过后就忘了。
经过这次设计,让我清楚的感觉到开发工具的学习是要边看书边动手才学得快、学得牢。
3、要经常与其他人交流,能获得许多有用的信息。
不要怕将自己的作品演示给别人看,别人会帮助你检查出许多你意想不到的错误,开阔你的思路,检验你的设计思想,提出很多有用的建议。
这些建议往往是非常及时的,是你少走弯路,提高开发效率。
只有集思广益,善于借鉴,才能在最短的时间内完成最多的工作。
本次课程设计是针对我们本学期来所学知识而进行的一次全面性的检验,它涵盖的知识面广,涉及到多个领域,需要我们具有较高的综合知识水平及较强的解决问题的能力。
通过这次设计,一方面让我更进一步的熟悉和掌握了Java语言的基本语法以及更深入的了解了算法和eclipse开发工具的使用。
另一方面在动手能力上有了很大的提高,以前学的知识只是“知识”,而现在是将“知识”转化成自身的本领,全面提高了自身解决具体问题的能力。
附录(程序源代码)
主界面程序:
packageyl.facerec;
importorg.opencv.core.Core;
importorg.opencv.core.Mat;
importorg.opencv.core.MatOfRect;
importorg.opencv.core.Point;
importorg.opencv.core.Rect;
importorg.opencv.core.Scalar;
importorg.opencv.highgui.Highgui;
importorg.opencv.objdetect.CascadeClassifier;
publicclassDetectFace{
privateMatimage;
publicintrunDetectFace(){
CascadeClassifierfaceDetector=newCascadeClassifier("./xml/lbpcascade_frontalface.xml");
image=Highgui.imread(MainWindow.getPhotoPath());
System.out.println(MainWindow.getPhotoPath());
MatOfRectfaceDetections=newMatOfRect();
faceDetector.detectMultiScale(image,faceDetections);
for(Rectrect:
faceDetections.toArray()){
Core.rectangle(image,newPoint(rect.x,rect.y),newPoint(rect.x+rect.width,rect.y
+rect.height),newScalar(0,255,0));
}
Highgui.imwrite("tmp/tmp.jpg",image);
returnfaceDetections.toArray().length;
}
}
基于人脸检测的程序:
packageyl.facerec;
importjava.awt.BorderLayout;
importjava.awt.EventQueue;
importjava.awt.Font;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.File;
importjavax.swing.ImageIcon;
importjavax.swing.JFileChooser;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JSplitPane;
importjavax.swing.SwingConstants;
publicclassMainWindow{
privateJFrameframe;
privateJMenuItemmenuItem_Recognize;
privateJMenumenuEdit;
privateJMenumenu_File;
privateJMenuItemmenuItem_FromPicture;
privateJMenuItemmenuItem_Exit;
privateintcountOfPeople,detectCount=0;
privateDetectFacedetectFace;
privatestaticStringphotoPath;
privateJSplitPanesplitPane_FaceRecognition;
privateJScrollPanescrollPane_DisplayPicture_Left;
privateJScrollPanescrollPane_DisplayPicture_Right;
privatestaticJLabellabel_DisplayPicture_Left;
privatestaticJLabellabel_DisplayPicture_Right;
privateJPanelpanelSoounth;
publicstaticvoidmain(String[]args){
EventQueue.invokeLater(newRunnable(){
publicvoidrun(){
try{
MainWindowwindow=newMainWindow();
window.frame.setVisible(true);
}catch(Exceptione){
e.printStackTrace();
}
}
});
}
publicMainWindow(){
detectFace=newDetectFace();
initialize();
}
privatevoidinitialize(){
frame=newJFrame();
frame.setTitle("基于人脸检测的人数统计系统");
frame.setBounds(200,100,800,600);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//--------------------------------------------------------------
JMenuBarmenuBar_MainWindow=newJMenuBar();
frame.setJMenuBar(menuBar_MainWindow);
//--------------------------------------------------------------
menu_File=newJMenu("菜单");
menu_File.setFont(newFont("微软雅黑",Font.PLAIN,14));
menuBar_MainWindow.add(menu_File);
//--------------------------------------------------------------
menuItem_FromPicture=newJMenuItem("从图片统计");
menuItem_FromPicture.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
System.loadLibrary("opencv_java249");
JOptionPane.showMessageDialog(frame,"请打开一张图片!
");
JFileChooserchooser=newJFileChooser("./test/");
intresult=chooser.showOpenDialog(frame);
if(result==JFileChooser.APPROVE_OPTION){
label_DisplayPicture_Right.setIcon(null);
photoPath=chooser.getSelectedFile().getAbsolutePath();
System.out