OpenCV实战:智能人脸识别打卡系统

1、介绍

目前,很多公司对员工的考勤同时通过打卡机或者钉钉之类的打卡软件,传统的员工打卡方式有很多,例如点名、签字、刷卡、指纹等等

然而随机机器视觉、计算机视觉的不断发展,算力的不断提升,人工智能对人脸检测的技术趋于成熟,基于人脸识别的智能打卡系统已经成熟。

通过摄像头对人脸特征进行扫描,利用面部特征的差异,识别人员。

人脸打卡的准确性不逊色于指纹打卡,相对于安全性和便捷性来说,甚至更胜一筹

本章将完成一套基于Python + OpenCV 开发的智能人脸识别打卡系统

2、需求介绍

打卡系统有三个核心功能:

  1. 录入打卡人的资料
  2. 员工打卡
  3. 查看打卡记录

项目较为复杂,需要对每个功能进行拆解,如下:

对数据模型的分析本系统不使用第三方数据库,所有数据都以文本文件的形式保存在文件中,因此要规范数据内容和格式,建立统一模型。


若把软件的使用者设定为“公司",那么打卡者身份可设定为“员工”,程序中的数据模型就应该
是员工数据类。每一位员工都有姓名,“姓名”就作为员工类中必备的数据之一。因为员工可能会重名,所以必须使用另一种标记作为员工身份的认证。为每一位员工添加不会重复的员工编号。员工编号的格式为从1开始递增数字,每添加一位新员工,员工编号就+1。员工类中添加“员工编号”。系统中必须保存所有员工的照片用于人脸识别。为了区分每位员工的照片文件,程序使用“员工特征码+随机值.png”的规则为照片文件命名。

如果使用员工编号作为特征码,1号员工和 11号员工的文件名容易发生混淆,所以特征码不能使用员工缤号,而是一种长度一致、复杂性高、不重复的字符串。员工类中添加“特征码”。

员工与编号、姓名、特征码是一对一的关系,但员工与打卡记录是一对多的关系,所以打卡记录可以放在员工类中保存,而不是单独保存在打卡记录模型中。打卡记录需要记录每一个员工的具体打卡时间,并能以报表的形式体现。可以使用字典保存打卡记录模型,员工姓名作为key,该员工的打卡记录列表作为 value。

打卡功能的分析:
人脸打卡依赖于人脸识别功能。本程序可以使用OpenCV提供的人脸识别器实现此功能,建议使用正确率较高的LBPH 识别器,其他识别器也可以考虑,但需要做好测试验证。

LBPH 识别器教程如下:OpenCV实战--人脸识别的三种方法(人脸识别具体到某个人)_使用opencv进行人脸识别的三种方法-CSDN博客

系统可以通过拍照方法保存员工的照片样本。当员工面对摄像头时,敲击【Enter】(回车)键就可以生成一张正面特写照片文件。为了增加识别准确率,每个员工应拍三张照片,也就是敲三Enter 键才能完成录入操作。


OpenCV提供的人脸识别器有一个缺陷:必须比对两种不同样本才能进行判断。如果公司第一次使用打卡系统,系统中没有录入任何员工,缺少比对样本,OpenCV提供的人脸识别器就会报错。因此本系统应该给出几个无人脸的默认样本,保证即使只录入一个员工,该员工也能顺利打卡。

每次员工打卡成功后,都应该记录该员工的打卡时间,然后保存到文件中

对数据维护的分析:
数据维护总结起来就是增、删、改、查四种操作。

简化版的打卡系统可以忽略“改”的操作,由“先删除,再新增”的方式代替。
本系统除了提供录入新员工的功能之外,也应提供删除已有员工的功能。删除员工之前应输入验证码进行验证,以防用户操作失误,误删重要数据。确认执行删除换作后,不仅要删除员工的信息,也要同时删除员工的打卡记录和照片文件。完成删除操作之后,所有数据文件中不再存有被删员工的任何数据。


对考勤报表的分析:
每个公司的考勤制度都不同,很多公司都主动设置“上班时间”和“下班时间”来做考勤的标准。员工要在“上班时间”之前打卡才算正常到岗,在“下班时间”之后打卡才算正常离岗。关在规定时间内打卡的情况属于“打卡异常”,“打卡异常”通常分为三种情况:迟到、早退和缺席(或者叫缺勤)。本系统会分析每一位员工在某一天的打卡记录,如果该员工在“上班时间”前和“下班时间”后都有打卡记录,则认为该员工当天全勤,该员工当天的其他打卡记录会被忽略。但如果该员工在“上班时间”前未能打卡,而是在“上班时间”后到中午12点前打卡,这种情况被视为迟到。如果该员工在“下班时间”后未能打卡,而是在中午12点之后到“下班时间”前打卡,这种情况被视为早退。当天没有打卡记录被视为缺席。

3、系统设计

本章节提供系统设计

3.1 开发环境

环境如下:

3.2 功能结构

MR 智能打卡系统结构如下:

3.3 员工打卡业务流程

总体流程如下:

员工打卡的流程:

查看记录功能业务流程:

员工管理功能流程:

考勤报表流程:

员工管理、查看记录和考勤报表这三个功能中都涉及了权限管理业务

如果用户想要使用这三个功能,需要登录管理员账号,只有登录成功之后才有权使用

3.4 文件夹目录

4、文件系统设计

为了程序简便,不使用别的数据库,而是采用读取文本文件的方式保存数据

项目所有的数据文件都在data 文件夹中

每个数据文件详细的内容格式

employee_data.txt 文件以字符串的形式保存所有员工数据,数据之间用英文逗号隔开,一行保存一个员工文件

编号、姓名、特征码

lock_record.txt 文件以字符串的形式保存数据,数据格式为打卡记录的字典文件

姓名:打卡时间

work_time.txt 文件以字符串的形式保存数据

上班时间、下班时间

系统会根据这两个时间判断员工是否迟到、早退

user_password.txt 文件以字符串的形式保存数据,数据格式为管理员账号密码

管理员账号:管理员密码

如果要更改管理员账号密码,可以在这里更改

/data/face/文件夹下保存的是所有员工的照片文件,格式为PNG

每张照片的大小都是640X480。每名员工需保存三张照片。该文件夹下还有两个默认的图像文件,文件名分别为1000000000.png和2000000000.png。这是两幅纯色图像,用于辅助训练人脸识别器。人脸识别器使用样本进行训练时,至少要有两个以上的标签分类。如果程序中仅保存了一位员工的照片,人脸识别器无法拿此员工照片与其他样本作对比,人脸识别器就会报错,此时两幅默认图像文件就充当了对比样本,以防止人脸识别器无法完成训练。当程序录入了足够多的员工信息后,这两幅默认图像虽然丧失了功能,但也不会影响识别器的识别能力。

5、数据实体模块设计

entity 包下的 organizations.py 文件用于封装数据模型。该文件中设计了员工类,并提供了一些维
护数据的方法

构建员工类

# 员工类
class Employee:def __init__(self, id, name, code):self.name = name  # 员工编号self.id = id  # 员工姓名self.code = code  # 员工的特征码

变量设定如下:

LOCK_RECORD = dict()  # 打卡记录字典,格式为{姓名:[时间1,时间2]}
EMPLOYEES = list()  # 全体员工列表
MAX_ID = 0  # 目前可用的最大ID
CODE_LEN = 6  # 特征码的默认长度
WORK_TIME = ""  # 上班时间
CLOSING_TIME = ""  # 工下班时间
USERS = dict()  # 管理员账号密码

6、程序使用

这里介绍程序使用的方法,运行main程序如下

6.1 登记照片

输入3,选择员工管理,然后输入1录入新员工即可:

员工管理需要登陆管理员账号!

输入姓名即可:henry

员工的照片数据:

6.2 删除员工信息

删除后,可以发现员工的照片不见了

6.3 查询员工打卡记录

如下:

 

6.4 生成考勤信息

如下:

6.5 自定义上下班时间

如下:

7、总结

更多功能可以自行查看,每一行均有注释,用户可以根据自己需求添加

项目地址:OpenCV实战:基于python的员工上下班人脸识别智能打卡系统资源-CSDN文库

其他资源:OpenCV教程代码:从读取图像到人脸识别的完整教程资源-CSDN文库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用联合(共用体)union验证系统大小端

一:思路 由联合体的特点,可知上图,char c 和 int i 共用四个字节,假设是小端,则由左到右是低地址到高地址,四个字节的内容如图所示01 00 00 00 代码展示: 如果第一个字节是1,则证明…

<Linux> 线程池

目录 前言: 一、线程池概念 (一)池化技术 (二)优点 (三)应用场景 二、线程池的实现 (一)线程池_V1(朴素版) (二)线…

Nginx发布之后可以使用IP访问,不能使用localhost访问, Nginx发布之后可以使用localhost访问,不能使用IP访问,

如标题所说 Nginx发布之后可以使用IP访问,不能使用localhost访问, Nginx发布之后可以使用localhost访问,不能使用IP访问, 修改配置文件也没有用 清除浏览器缓存数据

配置DHCPV6

组网需求 如果大量的企业用户IPv6地址都是手动配置,那么网络管理员工作量大,而且可管理性很差。管理员希望实现公司用户IPv6地址和网络配置参数的自动获取,便于统一管理,实现IPv6的层次布局。 图1 DHCPv6服务器组网图 配置思路 …

自动化改变金融科技文档生命周期

金融科技公司可能处于软件开发的最前沿,但即使是最先进的系统也必须能够支持金融服务领域采用的一系列文档密集型程序。因此,绝大多数金融科技企业都使用数字文档管理解决方案,无论是内部构建的还是由第三方供应商开发的。金融科技公司可以通…

UI自动化测试面试题小结

列举web自动化中常见的元素定位方式? id:根据id来获取元素,返回单个元素,id值一般是唯一的; name:根据元素的name属性定位; tagName:根据元素的标签名定位; className…

深入理解XML技术(看这一篇就够了)

目录: XMLXML的功能XML基本语法XML组成部分约束DTD约束Schema约束 Jsoup解析器DOMSAXXML常见解析器DOM4JJsoupXPath解析 XML 概念 XML(Extensible Markup Language):可扩展标记语言 可扩展:标签都是自定义的。 发展历…

[ C++ ] STL---仿函数与priority_queue

目录 仿函数 示例一: 示例二 : 常见的仿函数 priority_queue简介 priority_queue的常用接口 priority_queue的模拟实现 基础接口 push() 堆的向上调整算法 堆的插入 pop() 堆的向下调整算法 堆的删除 priority_queue最终实现 仿函数 仿函数&#xff…

MusicHiFi: Fast High-Fidelity Stereo Vocoding

MusicHiFi: Fast High-Fidelity Stereo Vocoding 相关链接:arxiv github 关键字:音乐生成、高保真立体声、立体声编解码器、生成对抗网络、频带扩展 摘要 MusicHiFi是一种高效的高保真立体声编解码器,它通过将低分辨率的mel频谱图转换为音频…

【Vue】Vue集成Element-UI框架

🙋‍ 一日之际在于晨 ⭐本期内容:Vue集成Element-UI框架 🏆系列专栏:从0开始的Vue之旅 文章目录 Element-UI简介安装Element-UInpm安装CDN安装 引入Element-UI测试是否引入成功总结 Element-UI简介 Element-UI官网:点…

极大提高工作效率的 Linux 命令

作为一名软件开发人员,掌握 Linux 命令是必不可少的技能。即使你使用 Windows 或 macOS,你总会遇到需要使用 Linux 命令的场合。例如,大多数 Docker 镜像都基于 Linux 系统。要进行 DevOps 工作,你需要熟悉Linux,至少要…

vue-quill-editor和vue-ueditor-wrap富文本编辑器应用

目录 一、vue-quill-editor 1.1、界面展示 1.2、代码介绍 1.2.1、安装 1.2.2、配置 1.2.3、代码应用 1.2.4、提取内容 二、vue-ueditor-wrap 2.1、界面展示 2.2、代码介绍 2.2.1、安装 2.2.2、配置 2.2.3、代码应用 一、vue-quill-editor 1.1、界面展示 文本输出…

Vue响应式原理全解析

前言 大家好,我是程序员蒿里行。浅浅记录一下面试中的高频问题,请你谈一下Vue响应式原理。 必备前置知识,​​Vue2​​官方文档中​​深入响应式原理​​​及​​Vue3​​官方文档中​​深入响应式系统​​。 什么是响应式 响应式本质是当…

liunx CentOS7 搭建lnmp环境 php nginx mysql

安装一些刚需软件:不懂请自行查询 安装一些需要的软件命令 yum install wget vim net-tools bash* lrzsz tree nmapnc lsof telnet -y 刷新命令 source /usr/share/bash-completion/bash_completion echo source /usr/share/bash-completion/bash_completion &…

UE5 C++ 3D血条 响应人物受伤 案例

一.3Dwidget 1.创建C Userwidget的 MyHealthWidget,声明当前血量和最大血量 UCLASS() class PRACTICEC_API UMyHealthWidget : public UUserWidget {GENERATED_BODY() public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float C…

利用API打造卓越的用户体验

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 正文 1. 数据驱动的设计 2. 功能扩展与整合 3. 实时性与响应性 4. 个性化推荐与定制化服务 结语 我的其他博客 正文 随着数字化时代的…

npm i安装依赖报错,但是cnpm i 却安装成功

问题描述:在a项目中npm i 安装依赖时发生以上报错,但是cnpm i 却成功,而且在其他项目中npm i 安装其他项目依赖也能成功.... 解决办法:删除项目中package-lock.json文件后再npm i 即可

搭建Linux内核开发环境——保姆教程(持续更新中)

搭建Linux内核开发环境——保姆教程(持续更新中) git版本管理汇编器链接器调试器编辑器构建系统模拟器文档工具图形设计工具 在此文中,持续完善,搭建内核开发环境的细节,有需要的小伙伴儿可以持续关注下 git版本管理 …

Ruby选择结构实战

文章目录 一、Ruby选择结构实战概述二、Ruby选择结构实战案例(一)闰年判断1、编写程序,实现功能2、程序的解释说明3、运行程序,查看结果 (二)求解一元二次方程1、编写程序,实现功能2、程序的解释…

Linux--Flappy_bird实现

目录 void handler(int sig): mian: void init_curses() int set_timer(int ms_t); 小鸟的操作: void show_pipe(): void create_list() void clear_pipe() void move_pipe(); test_bird.c完整代码: 代码实现: #includ…