基于 Python、OpenCV 和 PyQt5 的人脸识别上课打卡系统

大家好,我是Java徐师兄,今天为大家带来的是基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。该系统采用 Python 语言开发,开发过程中采用了OpenCV框架,Sqlite db 作为数据库,系统功能完善 ,实用性强 ,可供大学生实战项目参考使用。

博主介绍:✌Java徐师兄、7年大厂程序员经历。全网粉丝13w+、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅

Java项目精品实战案例《100套》

Java微信小程序项目实战《100套》

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人

文章目录

随着人工智能技术的快速发展,人脸识别技术得到了广泛应用。在学校场景中,如何快速、准确地实现学生的上课签到是一个很实用的需求。今天,我们将带大家一起实现一个基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。

这篇文章将从零开始,为新手读者提供详细的代码和实现步骤,即使没有太多基础的同学也能看懂。

视频演示地址

基于 Python 的人脸识别签到打卡系统


一、开发环境准备

在开发之前,我们需要先安装相关的工具和库:

1.1 必要的工具

  1. Python 版本:建议使用 Python 3.8 或以上版本。
  2. IDE:推荐使用 PyCharm 或 VS Code 方便调试和运行。

1.2 依赖库安装

以下是项目中用到的核心 Python 库及其功能:

  • OpenCV:实现人脸检测和识别。
  • PyQt5:构建图形化用户界面。
  • dlib(可选):提供高效的人脸关键点检测。
  • numpy:处理矩阵和数组运算。
  • pandas:管理学生信息及签到数据。

通过以下命令安装这些库:

bash 复制代码
pip install opencv-python PyQt5 dlib numpy pandas

二、系统功能概述

我们的人脸识别签到系统包含以下功能:

  1. 用户界面
    • 提供学生信息管理功能。
    • 启动摄像头进行人脸识别。
    • 显示签到结果和签到记录。
  2. 人脸识别功能
    • 检测学生的人脸。
    • 将人脸与数据库中的信息匹配,确认身份。
  3. 签到记录管理
    • 自动保存签到结果。
    • 支持查询和导出签到记录。

三、实现步骤

下面,我们将逐步实现该签到系统。

3.1 学生信息管理

我们需要为每位学生录入信息,包括学号、姓名以及其人脸照片。通过将人脸特征存储到数据库中,系统可快速识别对应学生。

代码示例:录入学生信息

python 复制代码
import cv2
import os

def capture_student_face(student_id, student_name):
    # 创建保存人脸数据的文件夹
    if not os.path.exists("student_faces"):
        os.makedirs("student_faces")
    
    # 打开摄像头
    cap = cv2.VideoCapture(0)
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    
    count = 0
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
        
        for (x, y, w, h) in faces:
            count += 1
            face_img = frame[y:y + h, x:x + w]
            filename = f"student_faces/{student_id}_{student_name}_{count}.jpg"
            cv2.imwrite(filename, face_img)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
        
        cv2.imshow("Capture Student Face", frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q') or count >= 10:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    print(f"Captured {count} face images for {student_name}.")

运行该代码,系统会打开摄像头捕捉学生的人脸并保存至本地。


3.2 人脸识别核心逻辑

接下来,我们将实现人脸识别功能。

  1. 提取实时摄像头画面中的人脸特征。
  2. 将特征与数据库中的已存人脸进行比对。

代码示例:人脸识别

python 复制代码
import numpy as np
import face_recognition

def recognize_face():
    # 加载已存人脸数据
    face_data = {}
    for file in os.listdir("student_faces"):
        img = face_recognition.load_image_file(f"student_faces/{file}")
        encoding = face_recognition.face_encodings(img)[0]
        name = file.split("_")[1]
        face_data[name] = encoding

    # 打开摄像头识别
    cap = cv2.VideoCapture(0)
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        face_locations = face_recognition.face_locations(rgb_frame)
        face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

        for face_encoding, face_location in zip(face_encodings, face_locations):
            matches = face_recognition.compare_faces(list(face_data.values()), face_encoding)
            name = "Unknown"

            if True in matches:
                matched_idx = matches.index(True)
                name = list(face_data.keys())[matched_idx]

            # 在画面上显示姓名
            top, right, bottom, left = face_location
            cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2)
            cv2.putText(frame, name, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)

        cv2.imshow("Recognize Face", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

3.3 构建 PyQt5 用户界面

PyQt5 用于构建交互式的图形界面,让用户更直观地使用签到系统。

代码示例:创建界面

python 复制代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabel

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("人脸识别签到系统")
        self.setGeometry(100, 100, 600, 400)

        # 添加按钮
        self.capture_button = QPushButton("录入人脸", self)
        self.capture_button.setGeometry(50, 50, 150, 50)
        self.capture_button.clicked.connect(self.capture_face)

        self.recognize_button = QPushButton("开始签到", self)
        self.recognize_button.setGeometry(50, 150, 150, 50)
        self.recognize_button.clicked.connect(self.start_recognition)

    def capture_face(self):
        student_id = input("请输入学号: ")
        student_name = input("请输入姓名: ")
        capture_student_face(student_id, student_name)

    def start_recognition(self):
        recognize_face()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

3.4 数据管理与导出

签到结果可以使用 Pandas 进行管理,并支持导出到 Excel 文件中。

代码示例:记录签到结果

python 复制代码
import pandas as pd
from datetime import datetime

def save_attendance(name):
    record = {"Name": name, "Time": datetime.now().strftime("%Y-%m-%d %H:%M:%S")}
    if not os.path.exists("attendance.csv"):
        df = pd.DataFrame([record])
    else:
        df = pd.read_csv("attendance.csv")
        df = df.append(record, ignore_index=True)
    df.to_csv("attendance.csv", index=False)
    print(f"{name} 签到成功!")

recognize_face 方法中,每次识别到已知人脸时,调用 save_attendance 保存签到记录。


四、运行效果展示

完整运行程序后,系统将具备以下功能:

  • 录入学生人脸信息。
  • 实时打开摄像头识别人脸。
  • 自动保存签到结果。

五、总结

通过本文,我们实现了一个简单的基于 Python、OpenCV 和 PyQt5 的人脸识别上课签到系统。新手可以根据本文的代码理解基本的图像处理和图形界面设计原理,并在此基础上扩展更多功能,如:

  • 添加未签到人员提醒。
  • 实现多摄像头支持。
  • 优化识别算法,提高准确率。

欢迎大家尝试并分享自己的改进!

6 源码获取:

大家点赞、收藏、关注、评论 啦 、下方卡片点击 👇🏻获取联系方式👇🏻

2022-2024年最全的计算机软件毕业设计选题大全:1000个热门选题推荐✅

Java项目精品实战案例《100套》

Java微信小程序项目实战《100套》

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人

相关推荐
许一世流年 绝不嵩手 cium几秒前
python笔记3
开发语言·笔记·python
---wzy---2 分钟前
我的知识图谱和Neo4j数据库的使用
开发语言·python
人才程序员18 分钟前
详解QtPDF之 QPdfLink
开发语言·c++·qt·pdf·软件工程·界面·c语音
星辰@Sea24 分钟前
使用OpenCV和卡尔曼滤波器进行实时活体检测
人工智能·opencv·计算机视觉
Tronlongtech27 分钟前
基于OpenCV的拆分和合并图像通道实验案例分享_基于RK3568教学实验箱
人工智能·opencv·计算机视觉
算力魔方AIPC34 分钟前
PyTorch 2.5.1: Bugs修复版发布
人工智能·pytorch·python
Joyner201837 分钟前
pytorch中有哪些归一化的方式?
人工智能·pytorch·python
Niuguangshuo38 分钟前
PyTorch 实现动态输入
人工智能·pytorch·python
禾风wyh39 分钟前
【PyTorch】回归问题代码实战
python·算法·机器学习
总有一天你的谜底会解开40 分钟前
pytorch加载预训练权重失败
人工智能·pytorch·python