基于Python的人脸识别考勤系统:dlib+OpenCV+PyQt5+SQLite全栈实现指南
2025.10.10 16:23浏览量:1简介:本文详细阐述了一个基于Python的人脸识别考勤系统的设计与实现过程,系统采用dlib进行人脸特征提取,OpenCV处理图像,PyQt5构建图形界面,SQLite作为数据库存储考勤数据,适合作为计算机专业毕业设计参考。
一、项目背景与意义
随着人工智能技术的快速发展,人脸识别技术已广泛应用于安防、金融、教育等多个领域。在考勤管理场景中,传统的手工签到或刷卡方式存在效率低、易代签等问题,而基于人脸识别的考勤系统能够实现无感、高效、准确的身份验证,提升管理效率。本系统结合dlib(人脸特征提取)、OpenCV(图像处理)、PyQt5(图形界面)和SQLite(数据库)四大技术,构建了一个完整的Python人脸识别考勤系统,适合作为计算机专业毕业设计课题。
二、技术选型与优势
1. dlib:高精度人脸特征提取
dlib是一个现代化的C++工具包,包含机器学习算法和人脸识别模块。其基于HOG(方向梯度直方图)特征的人脸检测器,在LFW(Labeled Faces in the Wild)数据集上达到了99.38%的准确率。相比OpenCV的Haar级联检测器,dlib在复杂光照和姿态变化下表现更稳定。本系统使用dlib的get_frontal_face_detector()进行人脸检测,shape_predictor()获取68个人脸关键点,并通过face_recognition_model_v1()计算128维人脸特征向量。
2. OpenCV:高效图像处理
OpenCV是计算机视觉领域的标准库,提供图像加载、预处理、显示等功能。本系统中,OpenCV用于:
- 读取摄像头或视频流:
cv2.VideoCapture() - 图像灰度化:
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 人脸区域裁剪:基于dlib检测结果
- 实时显示:
cv2.imshow()
3. PyQt5:跨平台图形界面
PyQt5是Qt库的Python绑定,支持Windows、Linux、macOS。本系统使用PyQt5设计主界面,包含:
- 摄像头实时预览窗口(
QLabel显示OpenCV图像) - 考勤记录表格(
QTableWidget) - 操作按钮(注册、识别、查询)
- 状态栏显示系统信息
4. SQLite:轻量级数据库
SQLite是嵌入式数据库,无需服务器,适合小型系统。本系统使用SQLite存储:
- 用户信息表(id, name, face_feature)
- 考勤记录表(id, user_id, time, status)
通过sqlite3模块实现增删改查操作。
三、系统架构设计
1. 模块划分
- 数据采集模块:调用摄像头获取图像
- 人脸检测模块:dlib检测人脸并提取特征
- 数据库模块:SQLite存储与查询
- 业务逻辑模块:考勤记录生成与匹配
- 界面模块:PyQt5实现交互
2. 核心流程
- 注册流程:
- 用户输入姓名
- 摄像头采集多张人脸图像
- dlib计算平均特征向量并存入SQLite
- 识别流程:
- 实时检测人脸
- 计算特征并与数据库比对(欧氏距离)
- 距离小于阈值则识别成功,记录考勤
四、关键代码实现
1. 人脸特征提取
import dlibimport numpy as npdetector = dlib.get_frontal_face_detector()predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")recognizer = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")def get_face_feature(img_rgb):gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)faces = detector(gray, 1)if len(faces) == 0:return Noneface_rect = faces[0]shape = predictor(gray, face_rect)feature = recognizer.compute_face_descriptor(img_rgb, shape)return np.array(feature)
2. SQLite数据库操作
import sqlite3class Database:def __init__(self, db_path="attendance.db"):self.conn = sqlite3.connect(db_path)self.cursor = self.conn.cursor()self._create_tables()def _create_tables(self):self.cursor.execute("""CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,feature BLOB NOT NULL)""")self.cursor.execute("""CREATE TABLE IF NOT EXISTS records (id INTEGER PRIMARY KEY AUTOINCREMENT,user_id INTEGER NOT NULL,time TEXT NOT NULL,status INTEGER NOT NULL,FOREIGN KEY(user_id) REFERENCES users(id))""")self.conn.commit()def add_user(self, name, feature):self.cursor.execute("INSERT INTO users (name, feature) VALUES (?, ?)",(name, sqlite3.Binary(feature.tobytes())))self.conn.commit()return self.cursor.lastrowiddef find_user(self, feature):feature_bytes = feature.tobytes()self.cursor.execute("SELECT id, name FROM users ORDER BY ABS(feature - ?) LIMIT 1",(sqlite3.Binary(feature_bytes),))return self.cursor.fetchone()
3. PyQt5界面集成
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QLabel, QTableWidget, QTableWidgetItemfrom PyQt5.QtCore import Qt, QTimerimport cv2import numpy as npclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("人脸识别考勤系统")self.setGeometry(100, 100, 800, 600)# 摄像头初始化self.cap = cv2.VideoCapture(0)self.timer = QTimer()self.timer.timeout.connect(self.update_frame)self.timer.start(30)# 界面组件self.label_camera = QLabel()self.label_camera.setAlignment(Qt.AlignCenter)self.btn_register = QPushButton("注册")self.btn_recognize = QPushButton("识别")self.table_records = QTableWidget()self.table_records.setColumnCount(3)self.table_records.setHorizontalHeaderLabels(["姓名", "时间", "状态"])# 布局layout = QVBoxLayout()layout.addWidget(self.label_camera)layout.addWidget(self.btn_register)layout.addWidget(self.btn_recognize)layout.addWidget(self.table_records)container = QWidget()container.setLayout(layout)self.setCentralWidget(container)def update_frame(self):ret, frame = self.cap.read()if ret:frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 此处可添加人脸检测与识别逻辑self.display_frame(frame_rgb)def display_frame(self, frame_rgb):h, w, ch = frame_rgb.shapebytes_per_line = ch * wq_img = QImage(frame_rgb.data, w, h, bytes_per_line, QImage.Format_RGB888)pixmap = QPixmap.fromImage(q_img)self.label_camera.setPixmap(pixmap.scaled(640, 480, Qt.KeepAspectRatio))def closeEvent(self, event):self.cap.release()event.accept()if __name__ == "__main__":app = QApplication([])window = MainWindow()window.show()app.exec_()
五、系统优化与扩展
1. 性能优化
- 多线程处理:使用
QThread分离摄像头采集与识别逻辑,避免界面卡顿 - 特征向量压缩:将128维浮点数转为16位整数,减少存储空间
- 批量注册:支持一次采集多张人脸计算平均特征
2. 功能扩展
- 活体检测:加入眨眼检测防止照片攻击
- 云端同步:通过HTTP API将考勤数据上传至服务器
- 移动端适配:使用Kivy框架开发Android/iOS应用
六、毕业设计实现建议
阶段划分:
- 第1-2周:环境搭建(Python、dlib、OpenCV、PyQt5、SQLite)
- 第3-4周:人脸检测与特征提取模块开发
- 第5-6周:数据库设计与基本操作
- 第7-8周:界面设计与集成测试
- 第9-10周:优化与文档编写
测试要点:
- 不同光照条件下的识别率
- 多人同时出现的处理能力
- 数据库并发写入性能
文档撰写:
- 需求分析:明确考勤系统功能需求
- 系统设计:架构图、模块划分、数据库ER图
- 测试报告:准确率、召回率、F1值等指标
七、总结
本系统结合dlib的高精度人脸识别、OpenCV的图像处理、PyQt5的跨平台界面和SQLite的轻量级存储,构建了一个完整的Python人脸识别考勤系统。通过模块化设计和关键代码实现,系统具备注册、识别、记录、查询等功能,适合作为计算机专业毕业设计课题。实际开发中,可根据需求进一步优化性能、扩展功能,并注重测试与文档编写,确保项目质量。

发表评论
登录后可评论,请前往 登录 或 注册