当前位置: 首页 > article >正文

基于人脸识别和 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
字段类型描述
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 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人脸识别考勤管理系统,涵盖了从数据库设计到界面实现,再到人脸识别集成的完整过程。通过该系统,企业可以实现高效的考勤管理,减少人为误差,同时提升工作效率。


http://www.kler.cn/a/470184.html

相关文章:

  • 代码随想录算法训练营第四十天 | 股票问题
  • [Unity Shader] 【游戏开发】Unity基础光照1-光照模型原理
  • C# 设计模式(结构型模式):外观模式
  • shell脚本总结2
  • 基于GAN和RL的思想来训练对话生成
  • 【视觉SLAM:六、视觉里程计Ⅰ:特征点法】
  • 庐山派K230学习日记5 UART
  • LabVIEW软件侵权分析与应对
  • element组件el-select、el-tree-select有值,不渲染lable
  • GitLab创建用户,设置访问SSH Key
  • 数造科技荣获 2024 年“年度数据资源创新开发企业”
  • 软件体系结构与设计模式
  • 解决GitHub上的README.md文件的图片内容不能正常显示问题
  • Springboot启动报错:Failed to start bean ‘documentationPluginsBootstrapper‘
  • 软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)
  • mybatisX插件的使用,以及打包成配置
  • 阿里云 Pod介绍
  • 如何利用Java爬虫批量获取商品信息案例指南
  • 腾讯云日志服务根据网段过滤非法数据
  • Elasticsearch:基础概念
  • 13、Ollama OCR
  • MATLAB算法实战应用案例精讲-【数模应用】马尔科夫链(附python和R语言代码实现)
  • 机器学习实战——支持向量机(SVM)
  • Babylon.js中的向量操作:BABYLON.Vector3的数学方法
  • java-type-tool 轻量级java type工具类库
  • 第二十六天 RNN在NLP中的应用