随着技术的不断进步,人脸识别技术 已经在各行各业得到了广泛的应用,尤其在 考勤管理 上,它提供了更加智能、便捷、精准的解决方案。本篇博客将介绍如何基于 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 results
return []
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 datetime
class AttendanceSystem:
def __init__(self, db_manager):
self.db_manager = db_manager
self.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_DUPLEX
cv2.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'):
break
video_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_manager
self.attendance_system = attendance_system
self.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 和 人脸识别技术 ,我们实现了一个智能化的 考勤管理系统。该系统不仅能通过图形界面进行员工信息管理,还能通过人脸识别自动打卡,大大提高了考勤管理的效率。
未来,我们可以进一步拓展系统功能,如员工权限管理、数据分析与报告生成等,使其更加完备和智能化。