logo

基于Python的人脸识别考勤系统:dlib+OpenCV+PyQt5+SQLite全栈实现指南

作者:快去debug2025.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. 核心流程

  1. 注册流程
    • 用户输入姓名
    • 摄像头采集多张人脸图像
    • dlib计算平均特征向量并存入SQLite
  2. 识别流程
    • 实时检测人脸
    • 计算特征并与数据库比对(欧氏距离)
    • 距离小于阈值则识别成功,记录考勤

四、关键代码实现

1. 人脸特征提取

  1. import dlib
  2. import numpy as np
  3. detector = dlib.get_frontal_face_detector()
  4. predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
  5. recognizer = dlib.face_recognition_model_v1("dlib_face_recognition_resnet_model_v1.dat")
  6. def get_face_feature(img_rgb):
  7. gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
  8. faces = detector(gray, 1)
  9. if len(faces) == 0:
  10. return None
  11. face_rect = faces[0]
  12. shape = predictor(gray, face_rect)
  13. feature = recognizer.compute_face_descriptor(img_rgb, shape)
  14. return np.array(feature)

2. SQLite数据库操作

  1. import sqlite3
  2. class Database:
  3. def __init__(self, db_path="attendance.db"):
  4. self.conn = sqlite3.connect(db_path)
  5. self.cursor = self.conn.cursor()
  6. self._create_tables()
  7. def _create_tables(self):
  8. self.cursor.execute("""
  9. CREATE TABLE IF NOT EXISTS users (
  10. id INTEGER PRIMARY KEY AUTOINCREMENT,
  11. name TEXT NOT NULL,
  12. feature BLOB NOT NULL
  13. )
  14. """)
  15. self.cursor.execute("""
  16. CREATE TABLE IF NOT EXISTS records (
  17. id INTEGER PRIMARY KEY AUTOINCREMENT,
  18. user_id INTEGER NOT NULL,
  19. time TEXT NOT NULL,
  20. status INTEGER NOT NULL,
  21. FOREIGN KEY(user_id) REFERENCES users(id)
  22. )
  23. """)
  24. self.conn.commit()
  25. def add_user(self, name, feature):
  26. self.cursor.execute(
  27. "INSERT INTO users (name, feature) VALUES (?, ?)",
  28. (name, sqlite3.Binary(feature.tobytes()))
  29. )
  30. self.conn.commit()
  31. return self.cursor.lastrowid
  32. def find_user(self, feature):
  33. feature_bytes = feature.tobytes()
  34. self.cursor.execute(
  35. "SELECT id, name FROM users ORDER BY ABS(feature - ?) LIMIT 1",
  36. (sqlite3.Binary(feature_bytes),)
  37. )
  38. return self.cursor.fetchone()

3. PyQt5界面集成

  1. from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton, QLabel, QTableWidget, QTableWidgetItem
  2. from PyQt5.QtCore import Qt, QTimer
  3. import cv2
  4. import numpy as np
  5. class MainWindow(QMainWindow):
  6. def __init__(self):
  7. super().__init__()
  8. self.setWindowTitle("人脸识别考勤系统")
  9. self.setGeometry(100, 100, 800, 600)
  10. # 摄像头初始化
  11. self.cap = cv2.VideoCapture(0)
  12. self.timer = QTimer()
  13. self.timer.timeout.connect(self.update_frame)
  14. self.timer.start(30)
  15. # 界面组件
  16. self.label_camera = QLabel()
  17. self.label_camera.setAlignment(Qt.AlignCenter)
  18. self.btn_register = QPushButton("注册")
  19. self.btn_recognize = QPushButton("识别")
  20. self.table_records = QTableWidget()
  21. self.table_records.setColumnCount(3)
  22. self.table_records.setHorizontalHeaderLabels(["姓名", "时间", "状态"])
  23. # 布局
  24. layout = QVBoxLayout()
  25. layout.addWidget(self.label_camera)
  26. layout.addWidget(self.btn_register)
  27. layout.addWidget(self.btn_recognize)
  28. layout.addWidget(self.table_records)
  29. container = QWidget()
  30. container.setLayout(layout)
  31. self.setCentralWidget(container)
  32. def update_frame(self):
  33. ret, frame = self.cap.read()
  34. if ret:
  35. frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  36. # 此处可添加人脸检测与识别逻辑
  37. self.display_frame(frame_rgb)
  38. def display_frame(self, frame_rgb):
  39. h, w, ch = frame_rgb.shape
  40. bytes_per_line = ch * w
  41. q_img = QImage(frame_rgb.data, w, h, bytes_per_line, QImage.Format_RGB888)
  42. pixmap = QPixmap.fromImage(q_img)
  43. self.label_camera.setPixmap(pixmap.scaled(640, 480, Qt.KeepAspectRatio))
  44. def closeEvent(self, event):
  45. self.cap.release()
  46. event.accept()
  47. if __name__ == "__main__":
  48. app = QApplication([])
  49. window = MainWindow()
  50. window.show()
  51. app.exec_()

五、系统优化与扩展

1. 性能优化

  • 多线程处理:使用QThread分离摄像头采集与识别逻辑,避免界面卡顿
  • 特征向量压缩:将128维浮点数转为16位整数,减少存储空间
  • 批量注册:支持一次采集多张人脸计算平均特征

2. 功能扩展

  • 活体检测:加入眨眼检测防止照片攻击
  • 云端同步:通过HTTP API将考勤数据上传至服务器
  • 移动端适配:使用Kivy框架开发Android/iOS应用

六、毕业设计实现建议

  1. 阶段划分

    • 第1-2周:环境搭建(Python、dlib、OpenCV、PyQt5、SQLite)
    • 第3-4周:人脸检测与特征提取模块开发
    • 第5-6周:数据库设计与基本操作
    • 第7-8周:界面设计与集成测试
    • 第9-10周:优化与文档编写
  2. 测试要点

    • 不同光照条件下的识别率
    • 多人同时出现的处理能力
    • 数据库并发写入性能
  3. 文档撰写

    • 需求分析:明确考勤系统功能需求
    • 系统设计:架构图、模块划分、数据库ER图
    • 测试报告:准确率、召回率、F1值等指标

七、总结

本系统结合dlib的高精度人脸识别、OpenCV的图像处理、PyQt5的跨平台界面和SQLite的轻量级存储,构建了一个完整的Python人脸识别考勤系统。通过模块化设计和关键代码实现,系统具备注册、识别、记录、查询等功能,适合作为计算机专业毕业设计课题。实际开发中,可根据需求进一步优化性能、扩展功能,并注重测试与文档编写,确保项目质量。

相关文章推荐

发表评论

活动