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

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

字段

类型

描述

id

INT

员工ID

name

VARCHAR(50)

员工姓名

employee_id

VARCHAR(20)

员工工号

gender

VARCHAR(10)

性别

face_encoding

BLOB

员工的人脸数据

attendance_records

字段

类型

描述

id

INT

考勤记录ID

person_id

INT

员工ID

date

DATE

考勤日期

status

ENUM('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 result

    def 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 np

def 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 employee
        else:
            print("无法识别该员工的身份!")
            return None
    else:
        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_manager
        self.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人脸识别考勤管理系统,涵盖了从数据库设计到界面实现,再到人脸识别集成的完整过程。通过该系统,企业可以实现高效的考勤管理,减少人为误差,同时提升工作效率。

相关推荐
自不量力的A同学7 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.8 小时前
Mysql
数据库·mysql
全栈前端老曹8 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8638 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道8 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德9 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪9 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
fen_fen17 小时前
Oracle建表语句示例
数据库·oracle
砚边数影19 小时前
数据可视化入门:Matplotlib 基础语法与折线图绘制
数据库·信息可视化·matplotlib·数据可视化·kingbase·数据库平替用金仓·金仓数据库