一、需求分析
选题“员工刷脸考勤”,要求采用 python 语言开发,可以通过摄像头添
加员工面部信息,这里就涉及到两个具体的个问题,一个是应该以什么样的
数据来标识每一个员工的面部信息,二是持久化地保存这些信息到数据库中
去。更细地,还涉及表的设计;另一个基本要求是通过摄像头识别员工面部
信息来完成考勤,这个问题基本可以通过遍历数据库里的员工面部数据与当
前摄像头里的员工面部数据的比对来实现,但有一个问题就是假如摄像头里
有多张人脸改怎么处理。扩展要求是导出每日的考勤表,可以拆分为两个部
分,一个是存储考勤信息,一个是展示考勤信息。
我们希望达到的目标是:
(1)仿照通用型软件界面设计的原则,所有的操作都在菜单栏里实现,
一部分区域用于展示摄像头实时读取并由程序加工后的视频流信息,另一部
分区域做控制台输出,打印相关信息,比如提示员工面部信息添加成功、添
加失败及其原因,提示员工打卡成功、打卡失败及其原因;添加面部信息时
人是必须和程序进行交互的,比如输入一些相关的信息,这个时候程序是阻
塞的;但是在打卡的时候,程序是不阻塞的,如果不点击关闭打卡,它会一
直在打卡的模式,等待并识别每一个前来打卡的员工,这比较符合现实的使
用场景。
(2)建表来存储员工信息和考勤信息,每次新建录入员工面部信息时,
要求输入工号、姓名,并查无重后方可录入,录入时只取距离屏幕最近的员
工的面部信息,这是考虑到实际打卡都是依次进行而不是一群人一群人地打
卡,录入时有两种模式可供选择,自动模式:一旦识别到人脸就自动捕获截
图,连续截图达到 10 张就结束录入;手动模式:点击菜单结束录入,不一
定要得到 10 张。结束录入后就开始从刚才捕获的员工面部提取人脸特征数
据并连同之前输入的员工姓名等数据作为一行记录保存到数据库中,如果没
有捕获到员工面部或者刚才捕获的面部信息不是同一个人,这行记录就被丢
弃。
考勤时,须满足三个条件:面部信息已录入、在打卡时间段内、未重复打卡,
只有打卡成功,打卡人姓名及工号、打卡日期及时间才会被当成一行记录保
存到数据库并在控制台输出打卡成功信息,否则会在控制台输出失败及其原
因信息。
总而言之:我们的设计目标是规范化、人性化。
二、总体设计
为了完成上述目标一,程序的界面初始化分为三部分,第一部分初始
化菜单栏,第二部分初始化左边控制台,第三部分初始化右边展示面板,
使这三部分相互独立;数据逻辑部分的初始化分为两部分,第一部分是数