基于QT和OpenCV的人脸识别系统
The Face Recognition System Based on QT and OpenCV
关键词:ARM,QT,OpenCV,人脸识别,PCA
人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控、出入口控制、视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点。
本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用。
“人脸识别”大致可分为两个阶段:
1.人脸检测 搜索一幅图像,寻找一切人脸区域(此处以绿色矩形显示),然后进行图像处理,清理脸部图像以便于更好地识别。
2.人脸识别 把上一阶段检测处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸对应的人是谁(此处以白色文本显示)。
系统运行时,自动从 USB 摄像头获取 YUV 格式的图片,转换成 QImage 格式并实时显示在 LCD屏上,再将其转换成 IplImage 格式,利用 OpenCV 的 Haar Cascade Face Detector(也称为 Viola-Jones 方法)进行人脸检测,得到一个矩形区域,截取该矩形区域图像进行直方图均衡化处理,进行训练或识别。
系统训练流程:
点击触摸屏上的按钮获取一帧图片,由训练者判断是否加入训练集。当训练集图片足够后, 点击训练按钮,即使用 PCA 方法处理训练集中的人脸图片,生成 XML 文件。
系统识别流程:
点击触摸屏上的按钮,进入识别状态。得到上述的人脸区域图像后,读取 XML 文件,使用PCA 方法将图像与数据库比对,若可信度超过阈值,则在屏幕上显示出人名。
摄像头可获取多幅图像以提高准确度和可靠性,我们采集多幅图像求可信度平均值与阈值比 较,若可信度平均值大于阈值,则登录系统成功,通过串口发送信号并弹出对话框提示信息;若 在规定时间内未登录成功,则记录访问者的人脸并提示登录失败。
多分类器级联结构是很多强分类器的组合,其结构如下图所示:
它是一种由粗到细的结构,其中每一层是 AdaBoost 算法训练得到的一个强分类器,都经过阈 值调整,使得每一层能让全部正例样本通过,而拒绝很大一部分非人脸样本。
本作品使用 OpenCV 中的检测器,使用其自带的一个 XML 文件执行检测。
PCA 方法由 Turk 和 Pentlad 首先提出,它的基础就是 Karhunen-Loeve 变换(简称 KL 变换)。 一幅人脸图像(假设为 50x50 像素)是一个 2500 维空间的数据点,我们利用 PCA 方法将所有人脸 图像数据点投影到 PCA 子空间中进行降维和特征提取。
相对于欧式距离,利用马氏距离作为人脸图像间的距离识别效果较好,但由于本作品主要用 于判断待测人脸是否为数据库中人脸,可信度的计算方法极为关键,而目前最好的可信度的计算 方程是基于欧式距离的:
float confidence = 1.0f – sqrt( it→distance /
(float) (trainFacesNum * eigenVectorsNum) ) / 255.0f;
故本作品仍采用欧式距离。
OpenCV 的人脸检测器获取到人脸图像后,使用直方图均衡化进行图像的预处理,然后调用OpenCV 的库函数进行识别,用上述公式计算出待测人脸可信度。
第 1~4 次测试中,人脸数据库中只有 ORL 数据库的四个人和 A 的人脸数据,此时 B、C 均为“陌生人”,只有 A 能登录系统。
第 5~9 次测试中,人脸数据库中增加了 B 的数据,此时只有 C 为“陌生人”,A、B 均可登 录系统。
测试结果如下图:
测试序号 |
人员编号 |
登录耗时(s) |
识别帧数 |
平均可信度 |
误识别次数 |
1 |
A |
16 |
2 |
0.856 |
0 |
2 |
A |
- |
10 |
0.846 |
0 |
3 |
B |
∞ |
10 |
0.675 |
0 |
4 |
C |
∞ |
10 |
0.778 |
0 |
5 |
A |
- |
10 |
0.878 |
0 |
6 |
B |
- |
10 |
0.906 |
0 |
7 |
C |
∞ |
10 |
0.824 |
0 |
8 |
A |
14 |
2 |
0.883 |
0 |
9 |
B |
11 |
2 |
0.913 |
0 |
注:
1. 登录耗时指某人从坐到摄像头前,摆正角度到登录成功所用时间。
2. 识别帧数表示用于计算平均可信度的图像帧数,均由摄像头连续获取。
3. 系统的可信度阈值设为 0.85。
本作品以友善之臂的 Tiny6410 开发板为平台,使用普通的 USB 摄像头,设计了一个自动人脸识别系统。系统实现了训练、识别人脸的功能,并在实验室环境下完成了测试。
经测试,使用者在未训练时无法登录系统,其可信度与人脸数据库中已有人员的可信度有一 定差值,可以区分数据库内外人脸。使用者经过训练后即可登录系统。
利用摄像头可以连续获取图像的特性,本作品多次计算可信度取平均值的方法一定程度上提高了识别的可靠性。
当然,本作品仍有很多不足的地方,比如由于驱动程序不完善,单靠软件实现的图像采集速度较慢,导致实时性不高;以及未实现活体检测,存在使用主人照片登录系统的可能。
参考文献
[1]黄福珍,苏剑波,人脸检测[M],上海交通大学出版社
[2]Shervini Emami,Introduction to Face Detection and Face Recognition[EB/OL],http://www.shervinemami.info/faceRecognition.html
[3]Robin Hewitt,Seeing With OpenCV - A Five-Part Series,[EB/OL]http://www.cognotics.com/opencv/servo_2007_series/index.html
[4]田捷,杨鑫,生物特征识别理论与应用[M],清华大学出版社
[5]vaibhav420,Face Recognition in C/C++ With Thesis,http://sourceforge.net/projects/facerec
----------------------------------------------------------github wiki-----------------------------------------------------------
中文版:
模仿intel杯格式写的论文:基于QT和OpenCV的人脸识别系统
相关文件下载:http://min.us/m1m2L9JOr或http://dl.dbank.com/c0l7qteyfd这个压缩包里的文件均适用与FriendlyARM的Tiny6410开发板,里面含有我编译出来的OpenCV2.3和QT4.7.3。 请将opencv-lib中的文件放到/lib下,qt4.7.3.tgz解压到/opt下。 里面还有我缩放成70x80大小的ORL人脸数据库和几个xml文件,faceRec是专用于命令行训练的独立程序(其实也可以用于命令行识别)。
这个工程使用了FriendlyARM公司的Tiny6410开发板。事实上PC上的程序更为简单,速度也更快。 此程序可以训练、识别人脸,使用到了QT4.7.3和OpenCV2.3。用普通的USB摄像头通过v4l2接口采集图像,然后用OpenCV的AdaBoost算法检测人脸,再用PCA方法识别。识别出人脸数据库里的人脸就向串口发出字符‘1’。但速度不够理想,1秒1帧左右。在桌面版linux下只要修改摄像头设备名和OpenCV库编译即可使用,欢迎fork。
特别感谢Shervin Emami的http://www.shervinemami.info/faceRecognition.html这篇文章。 我正在尝试将其翻译成中文,还不到50%,希望有人可以一起参与。[译]人脸检测与人脸识别简介
(这个wiki我还会继续完善,很希望广大计算机视觉爱好者们一起把这个工程继续下去...)
您可以自由:
复制、发行、展览、表演、放映、广播或通过信息网络传播本作品 创作演绎作品 惟须遵守下列条件:
署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 非商业性使用 — 您不得将本作品用于商业目的。 相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。
English Version:
An essay that imitate the format of intel cup:The Face Recognition System based on QT and OpenCV
Related downloads:http://min.us/m1m2L9JOrorhttp://dl.dbank.com/c0l7qteyfdThe files in this package are suited to FriendlyARM's Tiny6410,it contains OpenCV2.3 and QT4.7.3,it has been compiled and can be used directly.Please put the files in opencv-lib in folder /lib,and uncompress qt4.7.3.tgz to /opt.It also contains ORL face database which i scaled to 70x80,and some xml files.faceRec is for command-line training in this project(it can also used for command-line recognition).
This project used FriendlyARM's Tiny6410,actually PC's program is much simpler and faster.This program can train and recognize human face.It uses common USB camera to capture images through v4l2,and detect face with AdaBoost algorithm,and then recognize face in PCA method.If it recognized a face in the face database,it will send character '1' to RS232,if a person stand in front of the camera for about a minute and not logged in,then it will send '2'.The speed is not ideal,about 1 frame per second.As for desktop linux,you can just change the device name and complie the desktop version of OpenCV lib,that's enough.Welcome to fork.
Specially thanks to Shervin Emami's article:http://www.shervinemami.info/faceRecognition.htmlI'm trying to translate it into Chinese,but it still doesn't reach to 50%,I hope more people will participate it.[译]人脸检测与人脸识别简介
(I will still improve the wiki,and i hope Computer Vision lovers will continue the project...)
You are free:
to Share — to copy, distribute and transmit the work to Remix — to adapt the work Under the following conditions:
Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). Noncommercial — You may not use this work for commercial purposes. Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.
基于QT和OpenCV的人脸识别系统
The Face Recognition System Based on QT and OpenCV
关键词:ARM,QT,OpenCV,人脸识别,PCA
人脸是一个常见而复杂的视觉模式,人脸所反映的视觉信息在人与人的交流和交往中有着重 要的作用和意义,对人脸进行处理和分析在视频监控、出入口控制、视频会议以及人机交互等领 域都有着广泛的应用前景,因此是模式识别和计算机视觉领域持续的研究热点。
本系统在 FriendlyARM Tiny6410 开发板基础上,利用 OpenCV 计算机视觉库和 QT 图形库,通 过普通的 USB 摄像头实现了自动人脸识别,准确率较高,方便易用。
“人脸识别”大致可分为两个阶段:
1.人脸检测 搜索一幅图像,寻找一切人脸区域(此处以绿色矩形显示),然后进行图像处理,清理脸部图像以便于更好地识别。
2.人脸识别 把上一阶段检测处理得到的人脸图像与数据库中的已知 人脸进行比对,判定人脸对应的人是谁(此处以白色文本显示)。
系统运行时,自动从 USB 摄像头获取 YUV 格式的图片,转换成 QImage 格式并实时显示在 LCD屏上,再将其转换成 IplImage 格式,利用 OpenCV 的 Haar Cascade Face Detector(也称为 Viola-Jones 方法)进行人脸检测,得到一个矩形区域,截取该矩形区域图像进行直方图均衡化处理,进行训练或识别。
系统训练流程:
点击触摸屏上的按钮获取一帧图片,由训练者判断是否加入训练集。当训练集图片足够后, 点击训练按钮,即使用 PCA 方法处理训练集中的人脸图片,生成 XML 文件。
系统识别流程:
点击触摸屏上的按钮,进入识别状态。得到上述的人脸区域图像后,读取 XML 文件,使用PCA 方法将图像与数据库比对,若可信度超过阈值,则在屏幕上显示出人名。
摄像头可获取多幅图像以提高准确度和可靠性,我们采集多幅图像求可信度平均值与阈值比 较,若可信度平均值大于阈值,则登录系统成功,通过串口发送信号并弹出对话框提示信息;若 在规定时间内未登录成功,则记录访问者的人脸并提示登录失败。
多分类器级联结构是很多强分类器的组合,其结构如下图所示:
它是一种由粗到细的结构,其中每一层是 AdaBoost 算法训练得到的一个强分类器,都经过阈 值调整,使得每一层能让全部正例样本通过,而拒绝很大一部分非人脸样本。
本作品使用 OpenCV 中的检测器,使用其自带的一个 XML 文件执行检测。
PCA 方法由 Turk 和 Pentlad 首先提出,它的基础就是 Karhunen-Loeve 变换(简称 KL 变换)。 一幅人脸图像(假设为 50x50 像素)是一个 2500 维空间的数据点,我们利用 PCA 方法将所有人脸 图像数据点投影到 PCA 子空间中进行降维和特征提取。
相对于欧式距离,利用马氏距离作为人脸图像间的距离识别效果较好,但由于本作品主要用 于判断待测人脸是否为数据库中人脸,可信度的计算方法极为关键,而目前最好的可信度的计算 方程是基于欧式距离的:
float confidence = 1.0f – sqrt( it→distance /
(float) (trainFacesNum * eigenVectorsNum) ) / 255.0f;
故本作品仍采用欧式距离。
OpenCV 的人脸检测器获取到人脸图像后,使用直方图均衡化进行图像的预处理,然后调用OpenCV 的库函数进行识别,用上述公式计算出待测人脸可信度。
第 1~4 次测试中,人脸数据库中只有 ORL 数据库的四个人和 A 的人脸数据,此时 B、C 均为“陌生人”,只有 A 能登录系统。
第 5~9 次测试中,人脸数据库中增加了 B 的数据,此时只有 C 为“陌生人”,A、B 均可登 录系统。
测试结果如下图:
测试序号 |
人员编号 |
登录耗时(s) |
识别帧数 |
平均可信度 |
误识别次数 |
1 |
A |
16 |
2 |
0.856 |
0 |
2 |
A |
- |
10 |
0.846 |
0 |
3 |
B |
∞ |
10 |
0.675 |
0 |
4 |
C |
∞ |
10 |
0.778 |
0 |
5 |
A |
- |
10 |
0.878 |
0 |
6 |
B |
- |
10 |
0.906 |
0 |
7 |
C |
∞ |
10 |
0.824 |
0 |
8 |
A |
14 |
2 |
0.883 |
0 |
9 |
B |
11 |
2 |
0.913 |
0 |
注:
1. 登录耗时指某人从坐到摄像头前,摆正角度到登录成功所用时间。
2. 识别帧数表示用于计算平均可信度的图像帧数,均由摄像头连续获取。
3. 系统的可信度阈值设为 0.85。
本作品以友善之臂的 Tiny6410 开发板为平台,使用普通的 USB 摄像头,设计了一个自动人脸识别系统。系统实现了训练、识别人脸的功能,并在实验室环境下完成了测试。
经测试,使用者在未训练时无法登录系统,其可信度与人脸数据库中已有人员的可信度有一 定差值,可以区分数据库内外人脸。使用者经过训练后即可登录系统。
利用摄像头可以连续获取图像的特性,本作品多次计算可信度取平均值的方法一定程度上提高了识别的可靠性。
当然,本作品仍有很多不足的地方,比如由于驱动程序不完善,单靠软件实现的图像采集速度较慢,导致实时性不高;以及未实现活体检测,存在使用主人照片登录系统的可能。
参考文献
[1]黄福珍,苏剑波,人脸检测[M],上海交通大学出版社
[2]Shervini Emami,Introduction to Face Detection and Face Recognition[EB/OL],http://www.shervinemami.info/faceRecognition.html
[3]Robin Hewitt,Seeing With OpenCV - A Five-Part Series,[EB/OL]http://www.cognotics.com/opencv/servo_2007_series/index.html
[4]田捷,杨鑫,生物特征识别理论与应用[M],清华大学出版社
[5]vaibhav420,Face Recognition in C/C++ With Thesis,http://sourceforge.net/projects/facerec
----------------------------------------------------------github wiki-----------------------------------------------------------
中文版:
模仿intel杯格式写的论文:基于QT和OpenCV的人脸识别系统
相关文件下载:http://min.us/m1m2L9JOr或http://dl.dbank.com/c0l7qteyfd这个压缩包里的文件均适用与FriendlyARM的Tiny6410开发板,里面含有我编译出来的OpenCV2.3和QT4.7.3。 请将opencv-lib中的文件放到/lib下,qt4.7.3.tgz解压到/opt下。 里面还有我缩放成70x80大小的ORL人脸数据库和几个xml文件,faceRec是专用于命令行训练的独立程序(其实也可以用于命令行识别)。
这个工程使用了FriendlyARM公司的Tiny6410开发板。事实上PC上的程序更为简单,速度也更快。 此程序可以训练、识别人脸,使用到了QT4.7.3和OpenCV2.3。用普通的USB摄像头通过v4l2接口采集图像,然后用OpenCV的AdaBoost算法检测人脸,再用PCA方法识别。识别出人脸数据库里的人脸就向串口发出字符‘1’。但速度不够理想,1秒1帧左右。在桌面版linux下只要修改摄像头设备名和OpenCV库编译即可使用,欢迎fork。
特别感谢Shervin Emami的http://www.shervinemami.info/faceRecognition.html这篇文章。 我正在尝试将其翻译成中文,还不到50%,希望有人可以一起参与。[译]人脸检测与人脸识别简介
(这个wiki我还会继续完善,很希望广大计算机视觉爱好者们一起把这个工程继续下去...)
您可以自由:
复制、发行、展览、表演、放映、广播或通过信息网络传播本作品 创作演绎作品 惟须遵守下列条件:
署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。 非商业性使用 — 您不得将本作品用于商业目的。 相同方式共享 — 如果您改变、转换本作品或者以本作品为基础进行创作,您只能采用与本协议相同的许可协议发布基于本作品的演绎作品。
English Version:
An essay that imitate the format of intel cup:The Face Recognition System based on QT and OpenCV
Related downloads:http://min.us/m1m2L9JOrorhttp://dl.dbank.com/c0l7qteyfdThe files in this package are suited to FriendlyARM's Tiny6410,it contains OpenCV2.3 and QT4.7.3,it has been compiled and can be used directly.Please put the files in opencv-lib in folder /lib,and uncompress qt4.7.3.tgz to /opt.It also contains ORL face database which i scaled to 70x80,and some xml files.faceRec is for command-line training in this project(it can also used for command-line recognition).
This project used FriendlyARM's Tiny6410,actually PC's program is much simpler and faster.This program can train and recognize human face.It uses common USB camera to capture images through v4l2,and detect face with AdaBoost algorithm,and then recognize face in PCA method.If it recognized a face in the face database,it will send character '1' to RS232,if a person stand in front of the camera for about a minute and not logged in,then it will send '2'.The speed is not ideal,about 1 frame per second.As for desktop linux,you can just change the device name and complie the desktop version of OpenCV lib,that's enough.Welcome to fork.
Specially thanks to Shervin Emami's article:http://www.shervinemami.info/faceRecognition.htmlI'm trying to translate it into Chinese,but it still doesn't reach to 50%,I hope more people will participate it.[译]人脸检测与人脸识别简介
(I will still improve the wiki,and i hope Computer Vision lovers will continue the project...)
You are free:
to Share — to copy, distribute and transmit the work to Remix — to adapt the work Under the following conditions:
Attribution — You must attribute the work in the manner specified by the author or licensor (but not in any way that suggests that they endorse you or your use of the work). Noncommercial — You may not use this work for commercial purposes. Share Alike — If you alter, transform, or build upon this work, you may distribute the resulting work only under the same or similar license to this one.