基于嵌入式和OpenCV 技术的人脸识别考勤系统
2019-11-18严正国王家冰
严正国,王家冰
(西安石油大学光电油气测井与检测国家教育部重点实验室,西安710065)
0 引言
当今社会,大多数公司、企业都会对员工的上、下班进行考勤。当前的卡片打卡机防作弊机制不完全,只要手中有他人的卡片就可以替代打卡,市面上也出现了指纹式打卡机,这种打卡机指纹容易磨损,同时指纹套等物品的出现也说明了指纹打卡的不可靠性。如今,生物特征识别技术应用需求广泛,而人脸识别技术又以其非强制性、非接触性、并发性和普遍性的特点,得到了广泛的应用。嵌入式系统作为时下最流行的智能设备开发平台,通过OpenCV 这个资源丰富的跨平台计算机视觉库,将人脸识别技术与嵌入式系统相结合,显著提高了开发的效率。
1 系统整体框架设计
系统总体设计方案主要包括以下两个内容:
一是嵌入式硬件系统的搭建,主要包括了硬件平台的选择、Bootloader 的移植,Linux 内核的裁剪与移植和根文件系统的构建。
二是软件系统的编程,主要涵盖了对基于OpenCV的人脸识别技术的研究与应用程序的设计和编写。
2 系统硬件设计
本设计选用了mini2440 开发板,其采用的微控制器是三星公司推出的S3C2440A,基于ARM920T 核心,具有性能高、功耗低、成本低的特点。
2.1 Bootloader的移植
Bootloader 是开机启动系统时的一小段程序,通过这段程序来初始化硬件与建立内存空间的映射表,从而建立适当的软硬件环境。u-boot 是最常用的一种Bootloader,它是一个开源的通用引导程序,同时支持x86、ARM 和PowerPC 等多种处理器架构。
(1)网上下载相应版本的u-boot.bin 到虚拟机的tftpboot。
(2)在开发板上配置TFTP 服务器的IP 地址,setenv serverip 192.168.1.xx(虚拟机ip 地址),并通过tftp 把u-boot.bin 下载到开发板内存。
图1 系统流程图
(3)在开发板上烧写u-boot.bin。
2.2 Linux内核的裁剪和移植
需要对内核进行适当的修改才能更好适配开发板,需要对内核进行配置并重新Makefile。
(1)官网下载与开发板对应的内核版本,make${PLATFORM}_defconfig 确定平台。
(2)make menuconfig 进入图形化界面配置内核信息,进行内核裁剪。
(3)make uImage 编译内核源码。
(4)tftp 0x30008000 uImage 在uboot 环境下载内核镜像,bootm 0x30008000 启动内核。
图2 内核裁剪界面
2.3 根文件系统的构建
在Linux 系统我们也需要把磁盘和Flash 分为多个分区,便于日常的使用,常用的存储设备文件系统类型有jffs2、yaffs2、ubifs、ramdisk、nfs,等等。在网上下载一个常用的根文件系统放到虚拟机nfs 目录中,然后通过nfs 挂载的方式实现根文件系统的搭建。
图3 开发板根文件系统
3 系统软件设计
根据设计的需求决定采用Qt Creator 作为图形应用程序开发工具,Qt Creator 是一个跨平台的C++图形用户界面应用程序框架,它为应用程序开发者提供建立艺术级图形界面所需的所有功能。使用Qt Creator主要是因为它跨平台,支持Windows 和Linux 等平台;函数接口简单,易于编程;开发效率高,有成熟的软件框架,可以快速地编写应用程序;支持嵌入式开发。
OpenCV 是一个开源的跨平台计算机视觉库,它为我们提供了大量的图像处理的C 语言函数和C++类,供学习者免费使用。我们可以在嵌入式Linux 环境下对OpenCV 库进行编译,将编译好的OpenCV 库移植到开发板的根文件系统的/usr/lib 目录,人脸识别的具体识别方法将利用OpenCV 的函数进行编写。
图形的界面的开发主要使用QtGUIApplication 的进行设计,主要界面包含了摄像头、人脸识别方法以及必要的功能按钮。
图4 Qt Creator设计界面
图5 软件流程图
人脸识别模块的编写主要使用了OpenCV 中的FaceRecognizer 类,主要的功能是实现了对于摄像头采集的图片的训练和预测,分别对应train 和predict 函数。训练的时候,将照片的信息保存在vector
//创建人脸识别类
Ptr
Ptr
Ptr
//训练
faceClass->train(images,labels);
fisherClass->train(images,labels);
lpbhClass->train(images,labels);
//保存训练的分类器
faceClass->save("faceClass.xml");
fisherClass->save("fisherClass.xml");
lpbhClass->save("lpbhClass.xml");
//加载分类器
faceClass->load("faceClass.xml");
fisherClass->load("fisherClass.xml");
lpbhClass->load("lpbhClass.xml");
//使用训练好的分类器进行预测。
int faceResult=faceClass->predict(src_5);
训练和预测时使用的人脸识别方法是特征脸EigenFace、Fisher 脸FisherFace、LBP 直方图LBPHFace,分别调用函数cv::face::EigenFaceRecognizer::create、cv::face::FisherFaceRecognizer::create 和 cv::face::LBPHFaceRecognizer::create 建立模型。
识别结果如图6 所示,正确识别了组名、用户名并返回了预测值,我们可以看到预测值达到91.35。根据笔者试验,一般预测值达到80 以上时,识别结果均准确无误,成功实现了人脸识别。
图6 人脸识别结果
4 结语
通过开源的OpenCV 计算机视觉库,使得人脸识别技术在嵌入式系统得以实现,可以根据实际需求具体定制人脸识别设备,在嵌入式生物识别领域具有一定的应用前景。但本设计亦有考虑不足之处,在实际工程中还需要进一步优化与改进。
(1)系统在经过长时间的运行之后,是否还能保持设备可靠的运行。
(2)信息采集模块由于实际应用的不确定性,如果获取的照片角度不佳或光照不足,是否会对人脸识别模块造成影响。