基于OpenCV+Python的人脸识别上课签到系统

随着科技的发展,传统的签到方式逐渐被现代化的电子签到系统取代。人脸识别技术因其高效性和准确性,成为一个理想的签到方式。本教程将详细介绍如何使用OpenCV和Python构建一个基本的人脸识别上课签到系统。

一、环境准备

在开始之前,请确保你已经安装了以下软件和库:

  1. Python(推荐使用3.x版本)
  2. OpenCV库:可以用命令 pip install opencv-python 安装
  3. NumPy:用于处理数据,安装命令为 pip install numpy
  4. face_recognition库:用于人脸识别,可以用命令 pip install face_recognition 安装

二、系统架构

我们的系统架构主要包括以下几个部分:

  1. 数据采集:通过摄像头捕捉到的图像并进行人脸识别。
  2. 人脸库:存储学生的面部特征信息。
  3. 签到记录:将识别到的学生信息记录到签到名单中。

三、代码实现

以下是实现人脸识别签到系统的基本代码示例:

1. 数据采集与人脸识别

首先,我们需要从摄像头获取图像并进行人脸识别。

import cv2
import face_recognition
import numpy as np
import os
import datetime

# 定义签到名单
attendance = {}

# 加载学生图像并生成人脸特征
def load_known_face(known_faces_dir):
    known_faces = {}
    for filename in os.listdir(known_faces_dir):
        if filename.endswith('.jpg') or filename.endswith('.png'):
            student_name = os.path.splitext(filename)[0]
            image = face_recognition.load_image_file(os.path.join(known_faces_dir, filename))
            encoding = face_recognition.face_encodings(image)[0]
            known_faces[student_name] = encoding
    return known_faces

# 检测人脸并进行签到
def mark_attendance(known_faces):
    video_capture = cv2.VideoCapture(0)

    while True:
        ret, frame = video_capture.read()
        # 转换颜色空间
        rgb_frame = frame[:, :, ::-1]

        # 找到当前帧中的所有人脸
        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(known_faces.values()), face_encoding)
            name = "Unknown"

            # 如果有匹配,则取出对应的姓名
            if True in matches:
                first_match_index = matches.index(True)
                name = list(known_faces.keys())[first_match_index]
                if name not in attendance:
                    attendance[name] = str(datetime.datetime.now())

            # 画出人脸框
            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.5, (255, 255, 255), 2)

        # 显示结果
        cv2.imshow('Video', frame)

        # 按'q'键退出
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    video_capture.release()
    cv2.destroyAllWindows()
    save_attendance()

# 保存签到记录
def save_attendance():
    with open('attendance.csv', 'w') as f:
        for student, time in attendance.items():
            f.write(f"{student},{time}\n")

# 主程序
if __name__ == "__main__":
    known_faces = load_known_face('known_faces')  # 这里是存储学生照片的文件夹
    mark_attendance(known_faces)

2. 代码分析

  • load_known_face:该函数从指定目录中加载学生的图像,生成其特征编码,并存储在字典中。
  • mark_attendance:通过网络摄像头获取实时视频流,进行人脸识别,并记录签到信息。
  • save_attendance:将签到记录以CSV格式保存到文件中。

四、总结

通过本教程,我们实现了一个简单的人脸识别上课签到系统。该系统能够实时检测人脸,并记录学生的签到信息,具有良好的实用性。后续,可以进一步优化,增加错误处理、加强安全性等功能,让系统更加完善。希望本教程能对你有所帮助,鼓励你进行更多的探索与实践!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部