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

news2025/1/18 6:49:48

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

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

🍅文末获取源码联系🍅

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

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

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

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

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

文章目录

    • 一、开发环境准备
      • 1.1 必要的工具
      • 1.2 依赖库安装
    • 二、系统功能概述
    • 三、实现步骤
      • 3.1 学生信息管理
      • 3.2 人脸识别核心逻辑
      • 3.3 构建 PyQt5 用户界面
      • 3.4 数据管理与导出
    • 四、运行效果展示
    • 五、总结
    • 6 源码获取:

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

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

image-20241201222632501

视频演示地址

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


一、开发环境准备

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

1.1 必要的工具

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

1.2 依赖库安装

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

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

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

pip install opencv-python PyQt5 dlib numpy pandas

二、系统功能概述

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

image-20241201222728304

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

三、实现步骤

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

image-20241201222755657

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

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


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

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

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


四、运行效果展示

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

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

五、总结

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

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

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

6 源码获取:

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2256272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element Plus中 el-table表头宽度自适应,不换行

在工作中,使用el-table表格进行开发后,遇到了小屏幕显示器上显示表头文字会出现换行展示,比较影响美观,因此需要让表头的宽度变为不换行,且由内容自动撑开。 以下是作为工作记录,用于demo演示教程 先贴个…

GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册

文章目录 GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、GitLab安装配置2.1 安装GitLab所需的依赖包2.2 添加GitLab存储库2.2.1 将GitLab存储…

1.3.3 存储系统

目录 存储器分类存储器的层次结构主存储器高速缓存的特点及组成外存储器的种类和特点 存储器分类 存储器按照所处位置、制作材料、访问方式、寻址方式、工作方式可以分成多种类型。 位置:在主机或主板上的是内存,否则是外存。材料:磁存储器&…

【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码

目录 一、PyQt5介绍: (1)PyQt简介: (2)PyQt API: (3)支持的环境: (4)安装: (5)配置环境变量…

SPT: Revisiting the Power of Prompt for Visual Tuning

方法简介 方法很简单,作者通过实验发现prompt拥有一个良好的初始化是VPT的关键,于是作者就通过在MAE/MoCo进行预训练来得到一个良好的prompt的初始化来提供微调阶段的prompt。 这么简单的方法是怎么催成一篇顶会的呢?值得我们去学习&#xf…

基于事件驱动的websocket简单实现

websocket的实现 什么是websocket? WebSocket 是一种网络通信协议,旨在为客户端和服务器之间提供全双工、实时的通信通道。它是在 HTML5 规范中引入的,可以让浏览器与服务器进行持久化连接,以便实现低延迟的数据交换。 WebSock…

基于协同过滤算法的宠物用品商城的设计与实现(计算机毕业设计)Java Spring 衍生为任何商城系统 毕业论文

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可 操作系统…

文本预处理介绍

文本预处理 文本预处理1.认识文本预处理2.文本处理的基本方法2.1.什么是分词2.2 什么是命名实体化2.3词性标注 3.文本张量的表示方法3.1文本张量表示3.2 one-hot词向量表示 4.Word2vec模型4.1模型介绍4.2word2vec的训练和使用 5.词嵌入word embedding 介绍6.文本数据分析1.文本…

力扣3381.长度可被K整除的子数组的最大元素和

力扣3381.长度可被K整除的子数组的最大元素和 题目 题目解析及思路 题目要求返回一段长度为K的倍数的最大子数组和 同余前缀和 代码 class Solution { public:long long maxSubarraySum(vector<int>& nums, int k) {int n nums.size();vector<long long>…

第三节、电机定速转动【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍用定时器定时的方式&#xff0c;精准控制脉冲时间&#xff0c;从而控制步进电机速度 一、计算过程 1.1 电机每一步的角速度等于走这一步所花费的时间&#xff0c;走一步角度等于步距角&#xff0c;走一步的时间等于一个脉冲的时间 w s t e p t … ……

【数学建模】线性规划问题及Matlab求解

问题一 题目&#xff1a; 求解下列线性规划问题 解答&#xff1a; 先将题目中求最大值转化为求最小值&#xff0c;则有 我们就可以得到系数列向量: 我们对问题中所给出的不等式约束进行标准化则得到了 就有不等式约束条件下的变系数矩阵和常系数矩阵分别为&#xff1a; 等式…

云计算对定制软件开发的影响

在当代数字世界中&#xff0c;云计算是改变许多行业&#xff08;包括定制软件开发&#xff09;的最伟大的革命性趋势之一。由于这些公司努力寻求更好、更多不同的方式来履行职责&#xff0c;因此云计算与传统的内部部署基础设施相比具有许多不可否认的优势。这种范式转变对定制…

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切

3D 生成重建020-Gaussian Grouping在场景中分割并编辑一切 文章目录 0 论文工作1 方法2 实验结果 0 论文工作 最近提出的高斯Splatting方法实现了高质量的实时三维场景新视角合成。然而&#xff0c;它仅仅关注外观和几何建模&#xff0c;缺乏细粒度的物体级场景理解。为了解决…

GUI的最终选择:Tkinter

Tkinter是Python默认的GUI库&#xff0c;因此使用时直接导入即可&#xff1a;import tkinter 17.1 Tkinter之初体验 代码分析&#xff1a; tkinter.mainloop()通常是程序的最后一行代码&#xff0c;执行后程序进入主事件循环。 17.2 进阶版本 将代码封装成类&#xff1a; 运…

电子商务人工智能指南 3/6 - 聊天机器人和客户服务

介绍 81% 的零售业高管表示&#xff0c; AI 至少在其组织中发挥了中等至完全的作用。然而&#xff0c;78% 的受访零售业高管表示&#xff0c;很难跟上不断发展的 AI 格局。 近年来&#xff0c;电子商务团队加快了适应新客户偏好和创造卓越数字购物体验的需求。采用 AI 不再是一…

嵌入式软件C语言面试常见问题及答案解析(一)

本文中题目列表 1. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)2. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。3. 预处理器标识#error的目的是什么?4. 嵌入式系统中经常要用到无限循环,你怎么样用C编写死循环呢?5. …

从失败中学习:如何将错误转化为学习机会

失败是人生的一部分&#xff0c;无论是在个人生活还是职业生涯中&#xff0c;我们都难免会遇到挫折和错误。然而&#xff0c;失败并不意味着终结&#xff0c;而是一个潜在的学习机会。通过正确的态度和方法&#xff0c;我们可以从失败中汲取经验&#xff0c;转化为成长的动力。…

HarmonyOS NEXT的Navigation,跳转子页面后底部Tab不隐藏问题解决

问题复现 一直以来&#xff0c;首页的Tabs是这么用的&#xff1a; import Home from "../pages/home/Home" import ZhiHu from "../pages/song/Song" import Mine from "../pages/mine/Mine"Entry Component struct Index {State currentIndex…

基础排序算法详解:冒泡排序、选择排序与插入排序

引言 上一章&#xff0c;我们聊到了排序的基本概念和常见算法的分类。这一次&#xff0c;我们从基础开始&#xff0c;深入剖析三种常见的O(n) 排序算法&#xff1a;冒泡排序、选择排序 和 插入排序。 它们是学习排序算法的入门神器&#xff0c;不仅实现简单&#xff0c;还能帮…

番茄钟与Todo List:用Go构建高效的时间管理工具

引言 在当今快节奏的世界中&#xff0c;时间管理和任务组织变得越来越重要。为了帮助用户提高效率&#xff0c;我开发了一个基于Golang的开源项目&#xff0c;基于fyne的ui&#xff0c;它结合了经典的番茄工作法&#xff08;Pomodoro Technique&#xff09;和功能丰富的待办事…