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

ops/2025/1/12 4:49:41/

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

相关文章

mac使用 —— win转mac的记录

文件管理 mac沿用了unix的文件树设计,每个文件都有其父文件,最终父文件为根目录。 mac的应用以资源库的方式管理文件,资源库本质也是一个文件夹 常用命令: cd dirname: ~当前用户根目录, ..退回 pwd:当前路径,ls目…

微信小程序获取图片使用session(上篇)

概述&#xff1a; 我们开发微信小程序&#xff0c;从后台获取图片现实的时候&#xff0c;通常采用http get的方式&#xff0c;例如以下代码 <image class"user_logo" src"{{logoUrl}}"></image>变量logoUrl为ur图片l的请求地址 但是对于很多…

ZYNQ初识10(zynq_7010)UART通信实验

基于bi站正点原子讲解视频&#xff1a; 系统框图&#xff08;基于串口的数据回环&#xff09;如下&#xff1a; 以下&#xff0c;是串口接收端的波形图&#xff0c;系统时钟和波特率时钟不同&#xff0c;为异步时钟&#xff0c;&#xff0c;需要先延时两拍&#xff0c;将时钟同…

ReLU激活函数在卷积神经网络中的作用

引言 想象一下&#xff0c;你正在玩一个拼图游戏&#xff0c;需要把许多小图片拼成一幅大画。在这个过程中&#xff0c;有些小图片是亮色的&#xff0c;有些是暗色的。为了让拼好的大画更清晰、更漂亮&#xff0c;你需要把那些太暗的小图片变得更亮一些&#xff0c;同时保持亮…

单向循环链表的约瑟夫环问题

编号为1到n的n个人围成一圈。从编号为1的人开始报数&#xff0c;报到m的人离开。下一个人继续从1开始报数。n-1轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; typedef struct ListNode {int val;struct ListNode* next; }ListNode…

AI绘图咒语分享丨蛇年IP形象如何一键制作

咒语&#xff1a;IP形象&#xff0c;皮克斯风格&#xff0c;C4D&#xff0c;3D&#xff0c;一个可爱的赤壁蛇状生物&#xff0c;毛毡制成&#xff0c;鳞片上有花卉刺绣&#xff0c;呈淡绿色和粉红色。一个可爱的赤壁蛇状生物&#xff0c;由立体建模制成&#xff0c;鳞片上有花卉…

QT转到槽报错The class containing “Ui::MainWindow“ could not be found in...

问题&#xff1a;使用QT时&#xff0c;由于在其他文件当中也有操作UI的情况&#xff0c;所以不得已在其他文件当中包含#include "ui_mainwindow.h"这个UI的头文件&#xff0c;当在UI当中的控件点击转到槽时就会报错 原因是我在qt当中使用了线程&#xff0c;在使用线…

第37周:咖啡豆识别 (Tensorflow实战第七周)

目录 前言 一、前期工作 1.1 设置GPU 1.2 导入数据 输出 二、数据预处理 2.1 加载数据 2.2 可视化数据 2.3 配置数据集 三、构建VGG-16网络 3.1 VGG-16网络介绍 3.2 搭建VGG-16模型 3.2.1 直接调用官方 3.2.2 自建模型 四、编译 4.1 设置动态学习率 五、模型训…