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

大家好,我是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 osdef 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 = 0while True:ret, frame = cap.read()if not ret:breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)for (x, y, w, h) in faces:count += 1face_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:breakcap.release()cv2.destroyAllWindows()print(f"Captured {count} face images for {student_name}.")

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


3.2 人脸识别核心逻辑

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

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

代码示例:人脸识别

import numpy as np
import face_recognitiondef 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:breakrgb_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_locationcv2.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'):breakcap.release()cv2.destroyAllWindows()

3.3 构建 PyQt5 用户界面

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

代码示例:创建界面

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLabelclass 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 datetimedef 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.mzph.cn/news/888102.shtml

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

相关文章

智能化业务校验框架:动态设计与应用实践

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 (一)商品spu校验信息数据 (二)商品sku校验信息数据 (三)组包商品校验信息数据 (四)商品数据校验数据持有者 &…

idea2024加载flowable6.8.1.36遇到的问题-idea启动flowable问题flowable源码启动问题

代码下载地址: https://gitee.com/hanpenghu_admin_admin/flowable6.8.1.git 1.首先是通过顶层目录maven clean install 发现很多子模块并不会install本地mavenStore库,这导致了,一堆相互依赖的模块报错找不到,所以需要根据报错…

web安全从0到1:burp-suite3

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…

深度学习模型: BERT(Bidirectional Encoder Representations from Transformers)详解

一、引言 自然语言处理(NLP)领域在过去几十年取得了显著的进展。从早期基于规则的方法到统计机器学习方法,再到如今基于深度学习的模型,NLP 不断向着更高的准确性和效率迈进。BERT 的出现为 NLP 带来了新的突破,它能够…

ESP8266 (ESP-01S)烧录固件 和 了解与单片机通信必需的AT指令

ESP8266(ESP-01s)烧录固件 工具: 需要安装的原装出厂固件库: ESP8266 --接线-- VCC 3.3(外接开发板) GND GND(外接开发板) IO0 GND(外接…

<三>51单片机PWM开发SG90和超声测距

目录 1,PWM开发SG90 1.1简介 1.2控制舵机 1.3编程实现 2,超声测距 2.1简介 2.2,超声波测距代码实现 1,PWM开发SG90 1.1简介 PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等…

【Python爬虫五十个小案例】爬取猫眼电影Top100

博客主页:小馒头学python 本文专栏: Python爬虫五十个小案例 专栏简介:分享五十个Python爬虫小案例 🐍引言 猫眼电影是国内知名的电影票务与资讯平台,其中Top100榜单是影迷和电影产业观察者关注的重点。通过爬取猫眼电影Top10…

springboot信息化在线教学平台的设计与实现(代码+数据库+LW)

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足,创建了一个计算机管理信息化在线教学平台的方案。文章介绍了信息化在线教…

Hadoop批量计算实验

参考: Hadoop(一)之实验一CentOS7配置Hadoop系统:配置CentOS和下载安装包_基于虚拟机cents7搭建hadoop实验目的-CSDN博客 --------------------------------------------------------- 一、安装Vmware 二、创建虚拟机 1.安装centos7 ①打开VMware,点击新建虚拟机。 …

Flink四大基石之Time (时间语义) 的使用详解

目录 一、引言 二、Time 的分类及 EventTime 的重要性 Time 分类详述 EventTime 重要性凸显 三、Watermark 机制详解 核心原理 Watermark能解决什么问题,如何解决的? Watermark图解原理 举例 总结 多并行度的水印触发 Watermark代码演示 需求 代码演示&#xff…

Ubuntu 操作系统

一、简介 Ubuntu 是一个基于 Linux 的开源操作系统,它由 Canonical Ltd. 公司维护和资助。Ubuntu 以其易用性、强大的社区支持和定期的安全更新而闻名,一个一桌面应用为主的操作系统。 二、用户使用 1、常规用户的登陆方式 在登录时一般使用普通用户&…

Apifox Echo - 简单而强大的API测试服务

什么是Apifox Echo? Apifox Echo 是由 Apifox 官方推出的一个专业的接口请求和返回数据服务平台。它的主要目的是帮助开发人员和测试人员更好地学习和测试API接口。 核心特点 简单易用 提供简洁的HTTP请求和响应服务操作界面直观,上手容易服务地址统一: https://echo.api…

Linux笔记---进程:进程等待

1. 进程等待的概念 进程等待是指父进程通过系统调用wait或waitpid来对子进程进行状态检测与回收的功能。 当子进程退出时,如果父进程不读取子进程的退出状态,子进程就会成为僵尸进程,造成内存泄漏的问题。因此,父进程需要调用wa…

常见靶场的搭建

漏洞靶场 渗透测试(漏洞挖掘)切忌纸上谈兵,学习渗透测试(漏洞挖掘)知识的过程中,我们通常需要一个包含漏洞的测试环境来进行训练。而在非授权情况下,对于网站进行渗透测试攻击,是触及…

AtomicIntegerFieldUpdater能否降低内存

1. 代码如下: import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition new AtomicInteger(0);final AtomicInteger wrotePosition new Atom…

从零开始:使用Vite和pnpm搭建Vue3项目实战指南

目录 一、Node.js的下载和安装 1、打开Node.js官网(Node.js — Run JavaScript Everywhere) 2、点击下载按钮,下载完成后,打开文件,一直按Next按钮,直到 3、下载完成后,找到文件所在位置,然…

立创庐山派 K230 RTSP 推流

立创庐山派使用的是K230芯片,按照教程刷了canmv固件,下载canmv ide,使用嘉楠社区的rtsp和wlan例程,修改成连接wifi以及RTSP推流例程 # Description: This example demonstrates how to stream video and audio to the network us…

数据湖的概念(包含数据中台、数据湖、数据仓库、数据集市的区别)--了解数据湖,这一篇就够了

文章目录 一、数据湖概念1、企业对数据的困扰2、什么是数据湖3、数据中台、数据湖、数据仓库、数据集市的区别 网上看了好多有关数据湖的帖子,还有数据中台、数据湖、数据仓库、数据集市的区别的帖子,发现帖子写的都很多,而且专业名词很多&am…

springboot kafka在kafka server AUTH变动后consumer自动销毁

前言 笔者使用了kafka用来传输数据,笔者在今年10月写了文章,怎么使用配置化实现kafka的装载:springboot kafka多数据源,通过配置动态加载发送者和消费者-CSDN博客 不过在实际运行中,kafka broker是加密的&#xff0c…

在Windows下编译支持https的wsdl2h

下载源码 在官网下载源码 安装Openssl 下载OpenSSL并安装,安装完成后需要将OpenSSL的路径添加到环境变量中 配置VS 1、打开工程 2、因为前面安装的OpenSLL是64位的,因此需要创建一个X64的配置 打开配置管理器,然后选择新建&#xff0…