无法打开网站若要访问本地iis网站必须安装下列iis组件传媒网站
随着技术的不断进步,人脸识别技术已经在各行各业得到了广泛的应用,尤其在 考勤管理 上,它提供了更加智能、便捷、精准的解决方案。本篇博客将介绍如何基于 PyQt5 和 MySQL 实现一个 人脸识别考勤系统,并通过具体代码展示如何通过图形界面管理人员考勤数据,结合人脸识别模块,使得考勤系统更加高效和自动化。
完整代码:利用CNN实现人脸识别考勤系统
项目背景
本项目的目标是构建一个基于 人脸识别技术 的考勤系统,其中使用 PyQt5 创建图形用户界面(GUI),MySQL 作为数据存储,利用 人脸识别 实现人员身份验证,并根据验证结果进行考勤记录。系统功能主要包括:
- 人员信息管理:可以添加、删除、修改员工信息。
- 考勤记录管理:员工考勤数据的自动记录与查询。
- 人脸识别验证:通过摄像头对员工进行人脸识别,自动打卡。
技术栈
- PyQt5:构建桌面应用的界面,负责用户与系统的交互。
- MySQL:存储员工信息和考勤数据。
- 人脸识别库(如 OpenCV 和 face_recognition):用于识别人脸并进行考勤打卡。
- Python:处理系统逻辑,控制整个应用的运行。
核心功能
- 用户管理功能(增、删、改、查)
- 考勤记录功能(自动打卡与查询)
- 人脸识别功能(打卡验证)
1. 数据库管理:连接与操作
首先,我们需要一个数据库管理类 DatabaseManager
来封装与 MySQL 数据库的交互。我们存储员工信息(如姓名、员工ID、人脸数据)以及考勤记录(考勤时间和员工ID)。
关键代码:数据库管理
class DatabaseManager:def __init__(self, host='localhost', database='face_attendance', user='root', password='rootyang'):"""初始化数据库连接"""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_data(self, keyword=''):"""从数据库获取数据,支持关键词搜索"""if self.conn and self.conn.is_connected():cursor = self.conn.cursor()query = "SELECT id, name, employee_id, gender FROM people WHERE name LIKE %s OR employee_id LIKE %s"cursor.execute(query, ('%' + keyword + '%', '%' + keyword + '%'))results = cursor.fetchall()cursor.close()return resultsreturn []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 # 将异常向上抛出,由调用者处理def update_person(self, id, name, employee_id, gender, face_encoding):"""更新数据库中的一个用户的信息"""if self.conn and self.conn.is_connected():cursor = self.conn.cursor()query = "UPDATE people SET name=%s, employee_id=%s, gender=%s, face_encoding=%s WHERE id=%s"cursor.execute(query, (name, employee_id, gender, face_encoding, id))self.conn.commit()cursor.close()
解释
face_encoding
:我们将人脸数据(如人脸特征向量)存储在数据库中,供后续的识别验证使用。insert_person
:将员工信息与人脸特征数据插入到数据库中。update_person
:更新员工信息,特别是员工的人脸数据(当员工更新照片时)。
2. 人脸识别与考勤打卡
为了实现人脸识别功能,我们使用 OpenCV 和 face_recognition 库。通过摄像头捕捉员工的面部图像,与数据库中存储的人脸特征进行匹配,从而进行考勤打卡。
关键代码:人脸识别与考勤打卡
import face_recognition
import cv2
import numpy as np
from datetime import datetimeclass AttendanceSystem:def __init__(self, db_manager):self.db_manager = db_managerself.known_faces = [] # 存储所有已知员工的人脸特征self.known_face_names = [] # 存储员工姓名self.load_known_faces()def load_known_faces(self):"""加载数据库中所有员工的人脸数据"""data = self.db_manager.fetch_data()for row in data:face_encoding = np.frombuffer(row[4], dtype=np.float64) # 假设face_encoding存储为二进制数据self.known_faces.append(face_encoding)self.known_face_names.append(row[1]) # 员工姓名def recognize_face(self):"""通过摄像头进行人脸识别并记录考勤"""video_capture = cv2.VideoCapture(0)while True:ret, frame = video_capture.read()rgb_frame = frame[:, :, ::-1] # 转换为RGB格式# 查找所有人脸和对应的面部特征face_locations = face_recognition.face_locations(rgb_frame)face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):matches = face_recognition.compare_faces(self.known_faces, face_encoding)name = "未知员工"if True in matches:first_match_index = matches.index(True)name = self.known_face_names[first_match_index]self.record_attendance(name)# 在图像上画出人脸的位置并标注员工姓名cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)font = cv2.FONT_HERSHEY_DUPLEXcv2.putText(frame, name, (left + 6, bottom - 6), font, 0.5, (255, 255, 255), 1)# 显示图像cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.release()cv2.destroyAllWindows()def record_attendance(self, name):"""记录考勤信息"""time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print(f"{name} 打卡成功,时间:{time_now}")# 记录考勤到数据库cursor = self.db_manager.conn.cursor()cursor.execute("INSERT INTO attendance_records (employee_name, time) VALUES (%s, %s)", (name, time_now))self.db_manager.conn.commit()cursor.close()
解释
- 人脸识别:通过
face_recognition
库识别员工的面部特征,并与数据库中的已知员工数据进行比对。 record_attendance
:如果人脸识别成功,系统会记录当前时间和员工姓名,自动生成考勤记录。load_known_faces
:从数据库加载所有员工的人脸特征数据到内存中,以便进行比对。
3. 用户管理界面:图形界面的设计
为了提供便捷的管理功能,我们使用 PyQt5 构建了一个用户管理界面,支持员工信息的增删改查。
关键代码:管理界面
class AdminUI(QMainWindow):def __init__(self, db_manager, attendance_system):"""初始化界面和组件"""super().__init__()self.db_manager = db_managerself.attendance_system = attendance_systemself.init_ui()def init_ui(self):"""设置UI界面的布局和组件"""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_user)# 开始考勤按钮self.attendance_button = QPushButton("开始考勤")self.attendance_button.clicked.connect(self.attendance_system.recognize_face)main_layout.addWidget(self.add_button)main_layout.addWidget(self.attendance_button)def add_user(self):"""添加新用户的函数"""dialog = UserDialog(self)if dialog.exec_() == QDialog.Accepted:user_data = dialog.get_data()face_encoding = self.attendance_system.get_face_encoding(user_data['employee_id'])self.db_manager.insert_person(user_data['name'], user_data['employee_id'], user_data['gender'], face_encoding)
解释
add_user
:通过弹出对话框添加员工,并将员工的面部特征存储到数据库中。attendance_button
:点击该按钮启动人脸识别功能进行考勤打卡。
总结
通过结合 PyQt5、MySQL 和 人脸识别技术,我们实现了一个智能化的 考勤管理系统。该系统不仅能通过图形界面进行员工信息管理,还能通过人脸识别自动打卡,大大提高了考勤管理的效率。
未来,我们可以进一步拓展系统功能,如员工权限管理、数据分析与报告生成等,使其更加完备和智能化。