如何用Python代码打造刷脸考勤系统

发布时间:2021-10-28 17:04:11 作者:柒染
来源:亿速云 阅读:237

如何用Python代码打造刷脸考勤系统,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

需求分析

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

我们希望达到的目标是:

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

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

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

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

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

如何用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是距离屏幕最近的面部。

程序框图:

如何用Python代码打造刷脸考勤系统

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

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

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

函数清单

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

def __init__(self)

def initMenu(self):

def initInfoText(self):

def initGallery(self):

def initDatabase(self):

def loadDataBase(self,type):

def insertARow(self,Row,type):

def adapt_array(self,arr):

def convert_array(self,text):

def return_euclidean_distance(feature_1, feature_2):

def OnNewRegisterClicked(self,event):

def getDateAndTime(self):

函数调用关系:箭头指向被调用者

如何用Python代码打造刷脸考勤系统

在线预览地址:

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

程序运行结果

程序主界面

如何用Python代码打造刷脸考勤系统

新建录入

如何用Python代码打造刷脸考勤系统
如何用Python代码打造刷脸考勤系统
如何用Python代码打造刷脸考勤系统

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

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

如何用Python代码打造刷脸考勤系统

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

看到已经录入成功了。

开始打卡

如何用Python代码打造刷脸考勤系统

提示信息打印如下

如何用Python代码打造刷脸考勤系统

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

展示日志

如何用Python代码打造刷脸考勤系统
如何用Python代码打造刷脸考勤系统

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

关于如何用Python代码打造刷脸考勤系统问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

推荐阅读:
  1. 如何用Python制作一个换脸程序
  2. 怎么用Python代码实现刷脸考勤系统

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python

上一篇:linux中scanimage有什么用

下一篇:Mysql数据分组排名实现的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》