基于人脸识别和 MySQL 的考勤管理系统实现

devtools/2025/1/12 18:27:24/

在现代企业和机构中,考勤管理系统是日常运营中不可或缺的一部分。传统的考勤方式(如打卡、指纹识别等)有时会因为各种原因导致管理效率低下或员工作弊。然而,随着人脸识别技术的飞速发展,基于人脸识别的考勤管理系统正逐渐成为企业的主流选择。本篇文章将重点介绍如何构建一个基于 PyQt5MySQL 的人脸识别考勤系统,结合代码讲解其实现思路。

项目背景

本项目的目的是设计一个用户友好的考勤管理系统,通过人脸识别技术自动记录员工出勤情况。系统将与 MySQL 数据库连接,存储员工信息与考勤记录,并通过 PyQt5 实现界面展示和用户操作。我们将实现的核心功能包括:

  1. 员工管理:包括添加、删除、修改员工信息。
  2. 考勤记录管理:记录员工每天的出勤情况。
  3. 人脸识别技术集成:使用计算机视觉和人脸识别库(如 OpenCV 或 dlib)进行实时身份验证。

完整代码:利用CNN实现人脸识别考勤系统

技术栈

  • PyQt5:用于构建图形用户界面。
  • MySQL:用于存储员工数据和考勤记录。
  • Python:主要编程语言,负责业务逻辑。
  • 人脸识别库(如 OpenCV、dlib、face_recognition):实现人脸识别。

核心功能

  1. 员工管理(增、删、改)
  2. 考勤记录管理
  3. 人脸识别考勤功能
  4. 图形化管理界面


1. 数据库设计与管理

在本系统中,我们首先需要设计两个主要的表:people 表用于存储员工信息,attendance_records 表用于存储考勤记录。

people
字段类型描述
idINT员工ID
nameVARCHAR(50)员工姓名
employee_idVARCHAR(20)员工工号
genderVARCHAR(10)性别
face_encodingBLOB员工的人脸数据
attendance_records
字段类型描述
idINT考勤记录ID
person_idINT员工ID
dateDATE考勤日期
statusENUM('in', 'out')考勤状态(签到/签退)

数据库操作:增删改查

我们将使用 DatabaseManager 类来封装所有与数据库交互的操作,包括查询、插入、更新、删除。

关键代码:数据库管理类
class DatabaseManager:def __init__(self, host='localhost', database='attendance_system', user='root', password='root'):"""初始化数据库连接"""try:self.conn = mysql.connector.connect(host=host, database=database, user=user, password=password)if self.conn.is_connected():print("Database connection successful")except Error as e:QMessageBox.critical(None, "数据库连接", f"连接MySQL数据库时发生错误: {e}")def fetch_employee_by_face_encoding(self, face_encoding):"""根据人脸数据从数据库中查找员工"""cursor = self.conn.cursor()query = "SELECT id, name, employee_id, gender FROM people WHERE face_encoding = %s"cursor.execute(query, (face_encoding,))result = cursor.fetchone()cursor.close()return resultdef insert_person(self, name, employee_id, gender, face_encoding):"""向数据库中添加一个新用户"""try:cursor = self.conn.cursor()query = "INSERT INTO people (name, employee_id, gender, face_encoding) VALUES (%s, %s, %s, %s)"cursor.execute(query, (name, employee_id, gender, face_encoding))self.conn.commit()cursor.close()except mysql.connector.IntegrityError as e:raise e  # 将异常向上抛出,由调用者处理
解释
  • fetch_employee_by_face_encoding:根据人脸特征(通过人脸识别获得的编码)来查询数据库中的员工信息。这是人脸识别考勤系统的核心部分,用来验证员工身份。
  • insert_person:插入新员工到数据库,包括姓名、工号、性别和人脸编码。

2. 人脸识别技术集成

为了实现人脸识别考勤,我们需要使用计算机视觉技术来捕捉并识别员工的面部特征。可以使用 face_recognition 库,它封装了人脸识别的算法,并且使用起来非常方便。

关键代码:人脸识别实现
import face_recognition
import cv2
import numpy as npdef recognize_face(image_path, db_manager):"""人脸识别并验证身份"""# 加载图片并进行人脸识别image = face_recognition.load_image_file(image_path)face_encodings = face_recognition.face_encodings(image)if face_encodings:# 获取第一个识别到的人脸编码face_encoding = face_encodings[0]# 从数据库中查找员工employee = db_manager.fetch_employee_by_face_encoding(face_encoding)if employee:print(f"欢迎,{employee[1]} (员工ID: {employee[2]})")return employeeelse:print("无法识别该员工的身份!")return Noneelse:print("未检测到人脸!")return None
解释
  • recognize_face:此函数使用 face_recognition 库来检测图像中的人脸并生成一个 face_encoding(人脸特征码)。然后通过 DatabaseManager 查找数据库中是否存在该人脸编码的员工记录。

3. 图形界面:管理员界面

管理员可以通过图形界面管理员工信息并查看考勤记录。我们使用 PyQt5 来构建用户界面,包括员工管理(添加、删除、修改)和考勤记录管理。

关键代码:管理员界面
class AdminUI(QMainWindow):def __init__(self, db_manager):super().__init__()self.db_manager = db_managerself.init_ui()def init_ui(self):self.setWindowTitle("人脸识别考勤管理系统")self.setGeometry(100, 100, 800, 600)main_widget = QWidget()self.setCentralWidget(main_widget)main_layout = QVBoxLayout()main_widget.setLayout(main_layout)# 添加员工按钮self.add_button = QPushButton("添加员工")self.add_button.clicked.connect(self.add_employee)main_layout.addWidget(self.add_button)# 添加考勤按钮self.attendance_button = QPushButton("记录考勤")self.attendance_button.clicked.connect(self.record_attendance)main_layout.addWidget(self.attendance_button)def add_employee(self):"""添加员工信息的函数"""dialog = UserDialog(self)if dialog.exec_() == QDialog.Accepted:employee_data = dialog.get_data()try:face_encoding = self.capture_face_encoding()  # 捕获员工面部特征self.db_manager.insert_person(employee_data['name'], employee_data['employee_id'], employee_data['gender'], face_encoding)except Exception as e:QMessageBox.critical(self, "添加失败", f"添加员工失败: {e}")def capture_face_encoding(self):"""捕获人脸特征码的函数"""# 模拟通过摄像头捕获人脸图像video_capture = cv2.VideoCapture(0)ret, frame = video_capture.read()video_capture.release()if ret:return recognize_face(frame, self.db_manager)return None
解释
  • add_employee:通过弹出对话框让管理员填写员工信息,并使用人脸识别技术捕捉员工的人脸特征码,最后将数据保存到数据库
  • capture_face_encoding:使用电脑摄像头捕捉员工的人脸,并调用 recognize_face 函数来生成人脸编码。

4. 考勤记录管理

管理员可以通过图形界面查看考勤记录,并手动或自动记录员工的签到与签退。


总结

本文介绍了一个基于 PyQt5MySQL人脸识别考勤管理系统,涵盖了从数据库设计到界面实现,再到人脸识别集成的完整过程。通过该系统,企业可以实现高效的考勤管理,减少人为误差,同时提升工作效率。


http://www.ppmy.cn/devtools/149940.html

相关文章

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图(简化表示) 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…

【LeetCode Hot100 贪心算法】 买卖股票的最佳时机、跳跃游戏、划分字母区间

贪心算法 买卖股票的最佳时机买卖股票的最佳时机II跳跃游戏跳跃游戏II划分字母区间 买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的…

C# OpenCV机器视觉:主色提取

在一个忙碌的工作日,小李正对着电脑屏幕上密密麻麻的数据愁眉苦脸,突然,手机铃声大作,打破了办公室的宁静。原来是工厂的张厂长打来的电话:“小李啊,咱们新生产的那批产品,客户要求必须提取出主…

【日常小记】Ubuntu启动后无图形界面且网络配置消失

【日常小记】Ubuntu启动后无图形界面且网络配置消失 解决方法: 1. 输入后恢复网络: #sudo dhclient 2. 重新安装ubuntu-desktop #sudo apt-get install ubuntu-desktop!!!请关注是否能ping通某网站(例如百度&…

X64汇编语言教程(白帽黑客系列课程)(五)

为什么要写这篇教程呢? 本文章仅提供学习,切勿将其用于不法手段! 因为想要成为一名白帽黑客,汇编语言是必须要掌握的! 无论是二进制漏洞挖掘,还是逆向工程!汇编语言,都是硬性基础…

10分钟快速了解OceanGPT(沧渊)

10分钟快速了解OceanGPT(沧渊) 海洋科学任务的大语言模型——OceanGPT OceanGPT是如何训练的?为了训练 OceanGPT (沧渊) ,收集了一个跨越多个领域的海洋科学语料库。由于每个子领域和主题都有其独特的数据特征和模式,因此提出了一个特定于领域的指令生成框架,称为 DoDirec…

第5天:APP应用微信小程序原生态开发H5+Vue技术封装打包反编译抓包点

知识点: 1、基础入门-APP应用-开发架构安全问题 2、基础入门-小程序应用-开发架构安全问题 APP应用开发架构: 1、原生开发 安卓一般使用java语言开发,当然现在也有kotlin语言进行开发。如何开发就涉及到具体编程了,这里就不详说了…

Qt天气预报系统获取天气数据

Qt天气预报系统获取天气数据 1、获取天气数据1.1添加天气类头文件1.2定义今天和未来几天天气数据类1.3定义一个解析JSON数据的函数1.4在mainwindow中添加weatherData.h1.5创建今天天气数据和未来几天天气数据对象1.6添加parseJson定义1.7把解析JSON数据添加进去1.8添加错误1.9解…