当前位置: 首页 > article >正文

Python基于OpenCV和PyQt5的人脸识别上课签到系统【附源码】

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

🍅文末获取源码联系🍅

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

2024-2025年Java毕业设计选题推荐
Python基于Django的微博热搜、微博舆论可视化系统,附源码
基于Python Django的北极星招聘数据可视化系统

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

文章目录

    • 第一章 项目简介
    • 第二章 技术栈
    • 第三章 系统功能简介
      • 3.1 用户界面
      • 3.2 人脸识别功能
      • 3.3 签到记录管理
    • 第四章 实现步骤详解
      • 4.1 学生信息录入
      • 4.2 人脸识别核心功能
      • 4.3 使用PyQt5创建用户界面
      • 4.4 数据管理与导出
    • 第五章 运行效果展示
    • 第六章 推荐阅读
    • 第七章 源码获取:

第一章 项目简介

随着人工智能技术的飞速进步,人脸识别技术已经深入到我们生活的方方面面。在学校环境中,如何高效、准确地完成学生的上课签到成为了一个亟待解决的问题。今天将为大家介绍一个Python基于OpenCV和PyQt5的人脸识别上课签到系统。

Python基本OpenCV和PyQt5的人脸识别上课签到系统(V2.0)

第二章 技术栈

前端使用 PyQt5

sqlite 数据库

框架 opencv, dlib

第三章 系统功能简介

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

3.1 用户界面

(1)提供学生信息管理功能。
(2)启动摄像头进行人脸识别。
(3)显示签到结果和签到记录。

3.2 人脸识别功能

(1)检测学生的人脸。
(2)将人脸与数据库中的信息匹配,确认身份。

3.3 签到记录管理

(1)自动保存签到结果。
(2)支持查询和导出签到记录。

第四章 实现步骤详解

接下来,我们将一步步实现这个签到系统。

4.1 学生信息录入

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

代码示例:录入学生信息

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}.")

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

4.2 人脸识别核心功能

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

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

代码示例:人脸识别

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()

4.3 使用PyQt5创建用户界面

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

代码示例:创建界面

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_())

4.4 数据管理与导出

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

代码示例:记录签到结果

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保存签到记录。

第五章 运行效果展示

完整运行程序后,系统将具备以下功能:
(1)录入学生人脸信息。
(2)实时打开摄像头识别人脸。
(3)自动保存签到结果。

第六章 推荐阅读

基于Python的循环神经网络的情感分类系统设计与实现,附源码
Python基于人脸识别的实验室智能门禁系统的设计与实现,附源码
Java基于微信小程序的讲座预约系统的研究与实现,附源码
Java基于微信小程序的校园订餐系统
Java基于SpringBoot的在线学习平台
Python基于django框架的Boss直聘数据分析与可视化系统
基于Python的机器学习的文本分类系统
基于Python dlib的人脸识别的上课考勤管理系统(V2.0)
Java 基于 SpringBoot+Vue 的公司人事管理系统的研究与实现(V2.0)

第七章 源码获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

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

Python毕业设计

Java 大学生实战精品项目

Java微信小程序精品项目

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


http://www.kler.cn/a/512082.html

相关文章:

  • PHP语言的语法糖
  • Docker配置国内镜像源
  • flutter 使用google_mlkit_image_labeling做图片识别
  • 华为HuaweiCloudStack(一)介绍与架构
  • 《在ArkTS中实现模型的可视化调试和监控:探索与实践》
  • 自定义BeanPostProcessor实现自动注入标注了特定注解的Bean
  • Navicat 导出表结构后运行查询失败ERROR 1064 (42000): You have an error in your SQL syntax;
  • Vue3轮播图左右联动
  • Astropay之坑
  • IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力
  • 【TVM教程】为 ARM CPU 自动调优卷积网络
  • WPF MVVM 模式如何监听IsVisibleChanged 事件
  • AI预测福彩3D采取888=3策略+和值012路+胆码预测2025年1月20日新模型预测第1弹
  • OSCP - Proving Grounds - BullyBox
  • 基于SpringBoot的个人博客系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 单行文本框控件
  • (4)Vue 3 + Vite + Axios + Pinia + Tailwind CSS搭建一个基础框架
  • STL—stack与queue
  • 区块链 智能合约安全 | 回滚攻击
  • 【QT】 控件 -- 按钮类(Button)
  • 图解Git——分布式Git《Pro Git》
  • Java虚拟机相关八股一>jvm分区,类加载(双亲委派模型),GC
  • 2025.1.16——四、get_post 传参方式
  • VIVADO ILA IP进阶使用之任意设置ILA的采样频率
  • 人形机器人将制造iPhone!
  • 在Spring Boot中使用SeeEmitter类实现EventStream流式编程将实时事件推送至客户端