500行Python代码打造刷脸考勤系统


Posted in Python onJune 03, 2019

需求分析

“员工刷脸考勤”系统,采用Python语言开发,可以通过摄像头添加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的数据来标识每一个员工的面部信息,二是持久化地保存这些信息到数据库中去。更细地,还涉及表的设计;另一个基本要求是通过摄像头识别员工面部信息来完成考勤,这个问题基本可以通过遍历数据库里的员工面部数据与当前摄像头里的员工面部数据的比对来实现,但有一个问题就是假如摄像头里有多张人脸改怎么处理。扩展要求是导出每日的考勤表,可以拆分为两个部分,一个是存储考勤信息,一个是展示考勤信息。

我们希望达到的目标是:

(1)仿照通用型软件界面设计的原则,所有的操作都在菜单栏里实现,一部分区域用于展示摄像头实时读取并由程序加工后的视频流信息,另一部分区域做控制台输出,打印相关信息,比如提示员工面部信息添加成功、添加失败及其原因,提示员工打卡成功、打卡失败及其原因;添加面部信息时人是必须和程序进行交互的,比如输入一些相关的信息,这个时候程序是阻塞的;但是在打卡的时候,程序是不阻塞的,如果不点击关闭打卡,它会一直在打卡的模式,等待并识别每一个前来打卡的员工,这比较符合现实的使用场景。

(2)建表来存储员工信息和考勤信息,每次新建录入员工面部信息时,要求输入工号、姓名,并查无重后方可录入,录入时只取距离屏幕最近的员工的面部信息,这是考虑到实际打卡都是依次进行而不是一群人一群人地打卡,录入时有两种模式可供选择,自动模式:一旦识别到人脸就自动捕获截图,连续截图达到10张就结束录入;手动模式:点击菜单结束录入,不一定要得到10张。结束录入后就开始从刚才捕获的员工面部提取人脸特征数据并连同之前输入的员工姓名等数据作为一行记录保存到数据库中,如果没有捕获到员工面部或者刚才捕获的面部信息不是同一个人,这行记录就被丢弃。

考勤时,须满足三个条件:面部信息已录入、在打卡时间段内、未重复打卡,只有打卡成功,打卡人姓名及工号、打卡日期及时间才会被当成一行记录保存到数据库并在控制台输出打卡成功信息,否则会在控制台输出失败及其原因信息。

总而言之:我们的设计目标是规范化、人性化。

需要源码可以关注、转发,私信小编“01”领取,还有免费Python学习视频资料赠送。

500行Python代码打造刷脸考勤系统

总体设计

为了完成上述目标一,程序的界面初始化分为三部分,第一部分初始化菜单栏,第二部分初始化左边控制台,第三部分初始化右边展示面板,使这三部分相互独立;数据逻辑部分的初始化分为两部分,第一部分是数据库部分的初始化,如果数据库/表不存在就新建,存在则加载相关数据,第二部分是初始化一些需要循环使用的变量,比如新建录入时的员工姓名、工号、截图数目计数器等,每当完成录入时这些数据都应该被重置成初始化以待下一次录入,把这些初始化语句写成一个函数可以提高代码复用度。

上述目标二主要是一些限制性条件,可以通过添加判断语句来实现,比如对输入id的合法性检验:

while self.id == ID_WORKER_UNAVIABLE: 
self.id = wx.GetNumberFromUser(message="请输入您的工号(-1不可用)",prompt="工号", caption="温馨提示", value=ID_WORKER_UNAVIABLE, parent=self.bmp,max=100000000,min=ID_WORKER_UNAVIABLE) 
for knew_id in self.knew_id: 
if knew_id == self.id: 
self.id = ID_WORKER_UNAVIABLE 
wx.MessageBox(message="工号已存在,请重新输入", caption="警告")

其中ID_WORKER_UNAVIABLE是id的初始化值-1,不可用,self.knew.id是从数据库里加载出来的id列表,如果id非法(已重复或者不在0~100000000,就会一直有新的弹窗来提示输入id。

再比如对拒绝多张人脸时、只处理距离屏幕最近的员工的面部信息:

if len(dets) != 0: 
biggest_face = dets[0] 
#取占比最大的脸 
maxArea = 0 
for det in dets: 
 w = det.right() - det.left() 
 h = det.top()-det.bottom() 
 if w*h > maxArea: 
 biggest_face = det 
 maxArea = w*h

dets是侦测到的所有面部数组,biggest_face是距离屏幕最近的面部。

程序框图:

500行Python代码打造刷脸考勤系统

注:图片如看不清也可在线预览

https://www.processon.com/view/link/5bbcc953e4b08faf8c7324a1

本程序的设计思想大致可分为以下几个方面

面向对象的原则,整个程序的主体就是一个WAS(WorkAttendanceSystem)类,所有的实现都围绕这个类展开。 界面和数据逻辑分离的原则,WAS类的初始化过程包括界面的初始化和数据初始化,两者相互独立。 代码封装原则,多次调用的语句集写成接口供调用,没有冗余的代码。 接口隔离原则:使用多个专门的接口,而不是使用单一的总接口。 函数清单

注:所有类内的函数的第一个参数为self,表明该函数属于该类,后面不再赘述

def __init__(self)

WAS类的构造函数,主要是完成一些初始化操作,如初始化菜单、信息打印面板、主展示面板以及初始化加载数据库、初始化循环使用的变量。

def initMenu(self):

完成菜单的初始化显示,点击事件绑定。

def initInfoText(self):

完成左边信息提示面板的初始化显示。

def initGallery(self):

完成右边主展示面板的初始化显示。

def initDatabase(self):

数据库的初始化,建立数据库连接(如果数据库inspurer.db不存在则先新建),如果数据库中不存在员工信息worker_info和考勤logcat这两个表,则依次创建。

def loadDataBase(self,type):

该模块函数完成从数据库读取数据的操作,包括读取员工信息和考勤信息,第二个参数type用于标识是加载员工信息还是考勤信息,一方面,可以统一接口,打开数据库和得到游标、关闭连接是一样的,将两个读取接口合二为一,提高代码复用度;另一方面,可以减少加载的工作量,减少IO,提高程序运行速度;最后,因为读取信息前对上一次读取的信息列表做了清空处理,用type标识可以避免读取一个表时对另一个表造成的误操作。

def insertARow(self,Row,type):

该模块函数完成写数据库操作,第二个参数为准备写的一条记录,第三个参数type表示要对哪一个表进行写操作。

def adapt_array(self,arr):

将提取的人脸特征信息(列表)压缩,入口参数就是待压缩的数据,出口参数是压缩后的数据,用于写入数据库。

def convert_array(self,text):

将读取出来的数据解压缩成人脸特征信息,入口参数是待解压得数据,出口参数是解压后的数据。

def return_euclidean_distance(feature_1, feature_2):

计算两个人脸的欧式距离,入口参数是两个人脸的特征数据,出口参数是判定的结果,欧式距离大于0.4判为不同,不大于判为相同。

def OnNewRegisterClicked(self,event):

见名知义,菜单新建录入的监听事件,参数event为事件信息,其他几个菜单的(OnFinishRegisterClicked,OnStartPunchCardClicked, OnEndPunchCardClicked, OnOpenLogcatClicked,OnCloseLogcatClicked)类似,在此不再赘述。

def getDateAndTime(self):

得到当前日期和时间,并组装成特定格式作为出口参数返回。 函数调用关系:箭头指向被调用者

500行Python代码打造刷脸考勤系统

在线预览地址:

https://www.processon.com/view/link/5bbe0b0de4b0534c9bfbecb4

程序运行结果 程序主界面

500行Python代码打造刷脸考勤系统

新建录入

500行Python代码打造刷脸考勤系统
500行Python代码打造刷脸考勤系统
500行Python代码打造刷脸考勤系统

我们看到,信息栏有人脸数据重复警告,本次录入取消。

于是我们把数据库数据删了重来。

500行Python代码打造刷脸考勤系统

下面是打印的日志信息(为保证格式,复制到记事本中截的图)

看到已经录入成功了。

开始打卡

500行Python代码打造刷脸考勤系统

提示信息打印如下

500行Python代码打造刷脸考勤系统

迟到与否的临界时间是9:00

展示日志

500行Python代码打造刷脸考勤系统
500行Python代码打造刷脸考勤系统

只有已经录入且第一次成功签到才会写进到数据库,无论迟到与否。

总结

以上所述是小编给大家介绍的500行Python代码打造刷脸考勤系统,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
用Python写的图片蜘蛛人代码
Aug 27 Python
DJANGO-ALLAUTH社交用户系统的安装配置
Nov 18 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
Python中的连接符(+、+=)示例详解
Jan 13 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
python实现学生信息管理系统
Apr 05 Python
wtfPython—Python中一组有趣微妙的代码【收藏】
Aug 31 Python
python3实现钉钉消息推送的方法示例
Mar 14 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
Python学习笔记之pandas索引列、过滤、分组、求和功能示例
Jun 03 #Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 #Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
Jun 03 #Python
Python3 实现文件批量重命名示例代码
Jun 03 #Python
我就是这样学习Python中的列表
Jun 02 #Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 #Python
python实现感知机线性分类模型示例代码
Jun 02 #Python
You might like
PHP面向对象法则
2012/02/23 PHP
基于php-fpm 参数的深入理解
2013/06/03 PHP
编写安全 PHP应用程序的七个习惯深入分析
2013/06/08 PHP
一个很简单的办法实现TD的加亮效果.
2006/06/29 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
textarea中的手动换行处理的jquery代码
2011/02/26 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
Javascript中获取对象的原型对象的方法小结
2015/02/25 Javascript
Adapter适配器模式在JavaScript设计模式编程中的运用分析
2016/05/18 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
使用jQuery mobile NuGet让你的网站在移动设备上同样精彩
2019/06/18 jQuery
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
vue实现户籍管理系统
2020/05/29 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[23:21]Ti4 冒泡赛第二轮DK vs C9 2
2014/07/14 DOTA
[56:45]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第一局
2016/02/28 DOTA
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
python迭代器实例简析
2014/09/25 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
2018/01/04 Python
Python+Pandas 获取数据库并加入DataFrame的实例
2018/07/25 Python
python编写计算器功能
2019/10/25 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
荣耀商城:HIHONOR
2020/11/03 全球购物
平面设计的岗位职责
2013/11/08 职场文书
门诊挂号室室长岗位职责
2013/11/27 职场文书
路政管理毕业自荐书范文
2014/02/10 职场文书
公司担保书格式范文
2014/05/12 职场文书
学校运动会广播稿范文
2014/10/02 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
青年人初次创业的“五不要”
2019/08/23 职场文书
nginx反向代理配置去除前缀案例教程
2021/07/26 Servers
浅谈Node的内存泄露问题
2022/05/06 NodeJs