APP下载

视频流中的人脸识别系统应用开发

2018-12-17钟啸高红梅

电脑知识与技术 2018年25期
关键词:人脸检测视频流人脸识别

钟啸 高红梅

摘要:随着信息和智能终端技术的发展,生物识别技术在各行各业中得到了广泛的重视.人脸检测与识别属于非接触型身份认证,只是看到脸部就可以实现身份的认证,因而被广泛地应用在安保系统、企业公司、医院学校、研究所等各类机构组织之中。本实验基于特征脸的人脸识别方法,利用OpenCV的第三方库和C++编程,实现了视频流中的人脸识别技术,能够在PC上检测人脸和识别人脸。

关键词:视频流;人脸检测;人脸捕获;人脸识别;OpenCV

中图分类号:TP37 文献标识码:A 文章编号:1009-3044(2018)25-0220-03

目前来说,生物识别技术虽早已有学者提出并实践出来一些成果[1-3],而且已运用到各个应用领域并且影响广泛。但是人脸识别技术方面还需要一些创新性思维和想法,也需要一些创新性想法来为后面的人脸识别技术添枝加叶,提供更多的参考,为以后人脸识别的发展和飞跃打下更多、更牢固的基础。

1研究意义

一方面来说,研究视频流中的人脸识别在一定程度上可以建实和发展人脸识别技术,为后续更高层次人脸识别技术的突破和发展打下一定的基础。

另一方面,研究视频流中的人脸识别方面有很大的实用和应用空间,可以用于公司职员日常考勤,学校学生宿舍查寝等各个不同现实情景,总的来说此项目具有很大的发展和应用的空间。

2技术路线

早在2009年,就有学者总结出了人脸识别的方法[4-6],它们大致上可以归结为三类:基于几何特征的方法、基于模板的方法、基于模型的方法。本实验选定基于模板的方法,利用基于特征脸的方法实现视频流中的人脸识别技术。

3视频流中的人脸识别系统设计

3.1技术支持

實现视频流中的人脸识别技术,先要现视频流中的人脸检测和人脸捕获。本实验开发该原型系统所需要用到的开发工具有:SDK 8.1、VS 2015、Cmake、OpenCV等。(见图1)

C++语言既能够进行C语言面向过程的程序设计,还能够进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以封装、继承和多态为特点的面向对象的程序设计。C++语言不仅仅拥有计算机高效运行的实用性特征,同时它还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。所以,本实验使用了C++语言作为该原型系统的编程语言。然后,本实验需要下载和安装SDK 8.1作为C++语言正常在电脑上运行的基本环境并配置好环境变量。

此项目还用到了OpenCV和Cmake。OpenCV由Intel微处理器研究实验室的视觉交互组开发,是一种用于数字图像处理和计算机视觉的开源数据库[7-8]。OpenCV是由C++语言编写,它的主要接口也是C++语言。此外,OpenCV拥有包括500多个C函数的跨平台的中、高层API。它不依赖于其他的外部库,但它可以使用某些外部库。本实验需要下载OpenCV 3.3.1,并使用Cmake编译它的动态链接库和第三方库。

3.2系统设计

根据实验的目的,所要实现的功能,列出一个总设计框架(图2)再用C++语言编写出相关的程序代码,用于开启摄像头、检查摄像头的运作情况、调用特征脸算法进行人脸识别。

3.3主要工作流程

使用者先要运行第一步程序,从视频流中捕获人脸的图片,并按照指定路径建立文件夹,作为人脸特征对比的后台数据。之后,运行第二步程序,从视频流中检测出人脸并对其进行人脸特征提取,再与先前收集到的人脸数据照片进行特征对比,识别出该人脸。

4人脸识别关键技术的实现

4.1用Cmake编译动态链接库和第三方库

本原型系统利用OpenCV的contrib模块,该模块包含了一些新型人脸识别,立体匹配,人工视网膜模型等可选功能。打开Cmake进入主页面,在第一行源码路径中选择OpenCV源码的文件夹:OpenCV/OpenCV—master。再在第二行选择生成路径:OpenCV/OpenCV—master/build。然后点击“Configure”,第一项选择“Visual Studio 14 2015 Win64”作为编译工具,点击“Finish”完成。最后点击“Generate”生成库。同时,对OpenCV/OpenCV—contrib文件夹也是类似操作生成。

3.2摄像头的开启和检查其运作情况

如上流程图,本实验先要用C++语言写出摄像头启动和检查其运作情况的代码,该模块代码如下:

bool Handle::existsCapture() {

capture.open(0);

bool flag = false;

if (capture.isOpened()) {

flag = true;

cout << "检测到摄像头的存在,可以打开摄像头" << endl;

capture.release();}

else {

cout << "未能够检测到摄像头的存在,无法进行下一步的工作" << endl;}

return flag;}

3.3从视频流中获取图片作为后台数据

首先本实验要实现从视频流中获取实时照片的功能,将所获取的图片作为人脸识别的后台数据,用于与视频流中的人脸特征做对比,该模块代码如下:

Mat frame;

Mat des;

int i = 1;

while (capture.read(frame)) {

char ch = waitKey(20);

findFaces(frame, des);

imshow("人脸检测", frame);

//waitKey(5);

bool flag = false;

switch (ch) {

case 'p':

if (flag) {

if (des.rows>0 && des.cols>0) {

cout << "aaaaaaaaaaaaaa" << endl;

string name = format("D:\\opencv\\img\\002\\%d.jpg", i);

imwrite(name, des);

cout << "save photo:" << name << endl;

i++;

break;

}}

else

{if (des.rows>0 && des.cols>0) {

distinguish(des);}}}}}

3.4视频流中的人脸检测与人脸特征提取

首先本实验要实现从视频流中检测出人脸并提取人脸的特征进行特征脸的记录,用于人脸数据的记录和为下一步进行人脸特征的对比和识别提供了基本对比数据,该模块代码如下:

//绘制矩形 BGR。

rectangle(frame, faces[i], Scalar(0, 0, 255), 1);

//获取矩形中心点。

Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);

//绘制圆形。

ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);

//获取臉部矩形区域。

Mat faceROI = src(faces[i]);

//存储找到的眼睛矩形。

std::vector eyes;

eyes_cascade.detectMultiScale(faceROI,eyes,1.1,2,0 |CASCADE_SCALE_IMAGE,Size(30,30));

for(size_t j=0;j

{Point eye_center(faces[i].x + eyes[j].x + eyes[j].width/2,faces[i].y + eyes[j].y + eyes[j].height/2);

int radius = cvRound((eyes[j].width + eyes[j].height)*0.25);

circle(frame,eye_center,radius,Scalar( 255, 0, 0 ),4,8,0);}

//截取人脸。

Mat facesROI = frame(faces[i]);

//图像缩放。

cv::resize(facesROI, facesROI, Size(128, 128), 0, 0, cv::INTER_LINEAR);

//保存图像。

dst = facesROI;}

return;}

3.5视频流中的人脸特征对比与人脸识别

最后本实验要实现从视频流中捕获人脸,提取人脸特征并与后台人脸数据做对比进行人脸的识别,该模块代码如下:

maptt;

vectorimages;

vectorlabels;

vectorres = listDir(path);

int count = 0;

for (int i = 0; i

if (res[i].find_last_of(".pgm") != -1) {

Mat mat = imread(res[i], CV_LOAD_IMAGE_GRAYSCALE);

resize(mat, mat, Size(128, 128));

images.push_back(mat);

labels.push_back(count);}

else {

count++;

cout << "index:" << count << " " << res[i] << endl;

textRes.insert(pair(count, res[i]));}}

5总结与展望

作为一个学习计算机软件的学生来说,我自身的读代码和写代码的能力显著提高。除此之外,我还学会使用OpenCV、Cmake等一系列工具,对经典的隐马尔可夫模型有了一定认识和了解,对人脸识别技术有了深层次地了解和掌握。我开发的人脸识别原型系统的人脸识别率达到85%以上,显然识别率已经达到一定的水准,但是原型系统并不完美,经过大量的人脸训练,我通过改变人脸识别的背景、环境的光照亮暗、人脸的角度等等一系列因素,发现人脸识别率受人脸识别的背景影响较大,实验说明在不同背景下,人脸识别率才达到50%,但可以通过优化编程代码弥补这一不足。实验还可以做出进一步的延伸,就是研究不同民族的人脸特征,找出不同名族脸部的特点并用几何向量计算并总结出来,由此实现一个额外的功能,就是该系统可以识别人脸所属的民族。

参考文献:

[1] 刘芳.基于FpGA的门禁系统视频监控中的人脸识别技术研究[J].智能应用,2014(4).

[2] 马海兵,白洁.人脸识别技术在智能视频监控系统中的应用[J].现代电子技术,2007(8).

[3] 姜涛.基于OpenCV的智能视频监控系统设计[D].江苏科技大学,

[4] 马小虎,谭延琪.基于鉴别稀疏保持嵌入的人脸识别算法[J].自动化学报, 2014, 40(1): 73-82

[5] 吴巾一,周德龙.人脸识别方法综述[J].计算机应用研究,2009(8).

[6] 孟繁静,王连明.视频人脸识别系统中的最佳人脸捕获[J].东北师大学报,2015(4).

[7] 黄佳.基于OpenCV的计算机视觉技术研究[D].华东理工大学,2013.

[8] 唐致龙.基于OpenCV嵌入式人脸检测系统[D].长安大学,2017.

【通联编辑:唐一东】

猜你喜欢

人脸检测视频流人脸识别
人脸识别 等
基于视频流传输中的拥塞控制研究
揭开人脸识别的神秘面纱
铁路货场智能大门集装箱全景图像采集方法研究
基于人脸特征定位的SNS网站应用组件研究与设计
美国视频流市场首现饱和征兆
基于类独立核稀疏表示的鲁棒人脸识别
基于K-L变换和平均近邻法的人脸识别