基于OpenCV的人脸识别签到系统


1 项目概述

1.1项目要求

当今社会,科学技术呈现着井喷式的发展情况,新理论的不断提出及新技术的实时应用,给人们的生活带来了日新月异的变化。在这些新技术新应用中,物联网、人工智能、大数据等名词被人们纷纷提起,产业领域的智能化产品层出不穷,其中人脸识别就是一个典型应用。

本项目构建一个基于OpenCV + Python的人脸识别上课签到系统。人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能。人脸检测是在一张图片中把人脸定位出来,完成的是搜寻的功能。

1.2项目内容及方案

项目用到的第三方库包括:opencv-python、opencv-contrib-python、pillow、tk、xlrd、xlwt、xlutils。OpenCV是一个开源的计算机视觉库,应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。此外,OpenCV还提供了机器学习模块,可以使用正态贝叶斯、K近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。关于人脸识别,OpenCV提供了三种人脸识别方法,分别是LBPH方法、EigenFishfaces方法、Fisherfaces方法。

本项目采用LBPH方法,分四步实现:

第一步,通过调用摄像头进行人脸图像采集,建立人脸图像库。

第二步,对人脸图像库中的人脸图像提取特征信息(LBPH),并训练成模型,存储起来形成特征库。

第三步,开启摄像头实时跟踪人脸,获取人脸特征信息,然后将获取的人脸特征信息与学习阶段建立的特征库进行比对,将识别的信息呈现在画面中。

第四步,设计人脸识别签到系统的GUI界面。

2 项目原理

2.1人脸采集

人脸采集用到了OpenCV库和xlrd库。首先使用xlrd.open_workbook函数读取考勤记录表,使用sheet_by_index函数指定到索引值对应的表格,进而使用col_values获取表格第二列的值,表格第二列对应学生学号,当学生输入学号之后,将该学号与前面获取的所有学号进行比对,检查输入是否有误。

使用cv2.VideoCapture函数打开摄像头,使用cv2.CascadeClassifier加载预训练好的分类器模型haarcascade_frontalface_default.xml。当摄像头打开成功后,读取摄像头拍摄到的图像,将读回的图像转换成灰度图像,利用预训练好的分类器模型,使用detectMultiScale函数检测灰度图像,判断图像中是否有人脸。

如果检测到人脸在图像中用矩形框将人脸框出,并且在图像上添加关于按键操作的文本内容。监控键盘,如果点击了键盘上的‘S’按键就保存截取到的人脸图像并给图片命名,可以连续保存多张图片,输出采集的图片是第几张,方便查看,如果点击了键盘上的‘Esc’按键则退出采集,并最终输出学生学号和采集到的人脸图片总数。该过程中采集到的所有人脸图片全部都按照名字和学号命名好保存在了dataset文件夹中。

2.2提取人脸特征,建立特征库

该步骤使用cv2.face.LBPHFaceRecognizer_create()函数提取人脸特征。对上一步骤dataset文件夹中命名并保存好的图片进行重新整理,首先获取文件夹中的图片清单,遍历所有图片,将图片转换成灰度图像,进而转换为数组类型,利用预训练好的关于人脸识别的分类器模型,使用detectMultiScale函数检测灰度图像,判断图像中是否有人脸。

如果检测到人脸,将人脸数据和对应的学号数据分别存放在两个数组中,将人脸数据使用LBPH方法进行训练,进而提取脸部特征,保存训练好的文件trainer.yml,从而建立了一个前文采集到的人脸的特征库。这里的dataset包含全班同学采集到的人脸照片,所以最终训练好的特征库应该可以识别班里所有同学的脸。

2.3人脸比对并签到

打开摄像头,加载预训练好的关于人脸识别的分类器模型,读取上一步骤保存好的训练文件,即读取提取到的人脸特征库。打开摄像头,读取摄像头拍摄到的图像,将读回的图像转换成灰度图像,利用预训练好的分类器模型,使用detectMultiScale函数检测灰度图像,判断图像中是否有人脸。如果检测到人脸在图像中用矩形框将人脸框出,利用摄像头捕捉到的人脸特征与特征库的人脸特征比对进而进行预测,获得预测到的学号和预测指标。如果预测指标小于70则将对应学号在第几行输出,并且做好比对记录,获得该学号对应的学生名字。

如果比对成功了五次及以上,就在对应的result文件夹中的签到表中签到对应的名字,并输出签到成功,签到过程中使用time库记录签到的时间。在表格中名字后面用红色字体写出签到的名字,用黄色字体写出签到的时间,并且保存签到好的表格。

2.4设计GUI界面

本项目使用tkinter库设计GUI界面,tkinter是python自带的图形用户界面编辑库。

该界面只使用了比较基础的组件:标签和按键。设置按键的显示格式和对应的功能函数,为功能函数添加命名,连接到前面写好的程序中,实现界面所需的采集人脸图片、训练数据并创建人脸特征库、人脸比对并签到、查看签到表、查看项目说明文档、退出界面,一共七个功能。使用os.system函数即可将功能函数链接到.py文件,使用title函数和geometry函数设置窗口标题和位置,使用mainloop函数使整个签到系统运行起来,并实现循环,即不断点击按键实现响应功能,直到点击退出按键才会退出系统。


文章作者: BoBoRing
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BoBoRing !
评论
  目录