基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

本项目结合了上一篇文章基于face_recognition库实现人脸识别,通过利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备”刷脸打卡”、”新学生注册”等功能。

一、界面效果

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition
在主界面分别按下”新学生注册”按钮和”刷脸打卡”按钮的过程效果如图:
基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

; 二、开发环境

Windows10+python3.5.5+Vs Code(开发工具)

三、开发准备

在桌面新建一个工作薄,命名为Data.xlsx(见文章最后,附完整程序和表格链接)其中有两个小表格,分别是”学生信息表”和”学生考勤表”,在第一列和第二列填写如下信息。见文末链接。

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

; 四、实现过程

1. 导入相关库函数
注意face_recognition库没有的话需要pip install face_recognition进行安装。

import cv2
import openpyxl
import os
import time
import tkinter.messagebox
from tkinter import *
import face_recognition

2. 主界面程序设计
(主界面程序放在最后,这里提前解释)主界面放置了一个”刷脸打卡”、”新学生注册”、”退出系统”按钮。


top = Tk()
top.title("考勤系统")
top.geometry("500x300")

main_frame = Frame(top)
main_frame.place(relwidth=1,relheight= 1)
Label(main_frame,text = "智能课堂考勤系统",bg = "white",font = ("黑体",20),
width = 35,height = 2).place(x = 0,y = 0)
Button(main_frame,text = "刷脸打卡",bg = "green",font = ("黑体",12),width = 12,height = 2,
command = take_photo).place(x = 30,y = 150)
Button(main_frame,text = "新学生注册",bg = "green",font = ("黑体",12),width = 12,height = 2,
command = register).place(x = 200,y = 150)
Button(main_frame,text = "退出系统",bg = "green",font = ("黑体",12),width = 12,height = 2,
command = top.destroy).place(x =360,y = 150)

path = "C:/Users/Administrator/Desktop/class/face/"
path0 = "C:/Users/Administrator/Desktop/class/"
top.mainloop()

3. 拍照函数get_photo()
该函数用于调用笔记本摄像头或者其他外接摄像头。打开摄像头,然后通过capture.read()获取其中某一帧图像,通过cv2.imwrite()将图像保存到指定的路径,参数img是拍摄的图片名称,也包含指定的路经。


def get_photo(img):
    capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    ref,frame=capture.read()
    cv2.imwrite(img,frame)
    cv2.imshow(img,frame)
    cv2.waitKey(1000)
    cv2.destroyAllWindows()
    return img

4. 刷脸打卡函数take_photo()
在主界面按下”刷脸打卡”按钮后,跳转到该函数。通过调用get_photo()函数来拍摄一张学生刷脸的临时图片,将该图片进行图像处理编码后,通过os.listdir()方法遍历face文件夹里面的图片(这些图片同样需要进行图像处理编码),然后通过face_recognition.compare_faces进行人脸对比,人脸对比成功,获取图片的编号,通过编号num定位验证者在表格中的位置,然后将打卡时间和打卡日期填写在表格中。如果验证失败人脸标志位flag为0


def take_photo():
    print("刷脸打卡")
    student = face_recognition.load_image_file(get_photo(path0 + "img.jpg" ))
    student_rgb =cv2.cvtColor(student,cv2.COLOR_BGR2RGB)
    student_encode = face_recognition.face_encodings(student_rgb)[0]

    pathDir = os.listdir(path)
    flag = 0

    for i in pathDir:
        face = face_recognition.load_image_file(path + i)
        face_rgb = cv2.cvtColor(face,cv2.COLOR_BGR2RGB)
        face_encode = face_recognition.face_encodings(face_rgb)[0]

        s = face_recognition.compare_faces([student_encode],face_encode,tolerance=0.49)
        if s == [True] :
            flag = 1
            num = i[:len(i)-4]
            break
        else:
            flag = 0
    if flag ==1:

        sheets = openpyxl.load_workbook(path0 + "Data.xlsx")
        sheet1 = sheets[sheets.sheetnames[0]]
        max_row1 = sheet1.max_row
        print("验证者的编号是:" , num)

        for j in range(2,max_row1+1):
            if sheet1.cell(j,1).value == str(num):
                name = sheet1.cell(j,2).value

                date = time.strftime("%Y-%m-%d",time.localtime())
                Time = time.strftime("%H:%M",time.localtime())

                sheet2 = sheets[sheets.sheetnames[1]]
                max_row2 = sheet2.max_row
                sheet2.cell(row = max_row2+1,column=1,value = date)
                sheet2.cell(row = max_row2+1,column=2,value = name)
                sheet2.cell(row = max_row2+1,column=3,value = Time)
                sheets.save(path0 + "Data.xlsx")
                print(str(sheet1.cell(j,2).value) +"签到成功," + "打卡时间是" + Time)
                tkinter.messagebox.showinfo(title="提示",message=name + "打卡成功,"+ "打卡时间是" + Time)
                break

5. 注册函数register()
在主界面按下”新学生注册”按钮后,跳转到该函数。实现覆盖原来的框架组件main_frame,布局新的框架组件second_frame,用来放置新界面需要的按钮、标签组件。”确认”按钮关联Message函数,用来确认、保存新学生的注册信息的


def register():
    print("注册")
    main_frame.place_forget()
    second_frame = Frame(top)
    second_frame.place(relwidth=1,relheight= 1)

    Label(second_frame,text = "欢迎使用人脸识别系统",font = ("黑体",18),
    width = 40,height = 2).place(x = 20,y = 0)
    Label(second_frame,text = "姓名",font = ("黑体",12),
    width = 20,height = 1).place(x = 50,y = 100)
    name_entry = Entry(second_frame, font=("黑体", 12), width=20)
    name_entry.place(x = 240,y = 100)
    Button(second_frame,text = "确认",font = ("黑体",12), width=10,
    command=lambda:Message(name_entry)).place(x = 100,y = 150)
    Button(second_frame,text = "返回",font = ("黑体",12), width=10,
    command=lambda:back_main(second_frame)).place(x = 300,y = 150)

6. 学生信息存储Message()
点击”确认”按钮后,该函数操作表格获取表格中有数据最后一行的行数max_row,作为新注册学生的序号,如下图所示。以该编号为新生图片命名”max_row.jpg”,然后调用摄像头给新学生拍照保存到face文件夹内。将学生的姓名、序号填写到”学生信息”表格中

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

def Message(name_entry):

    sheets = openpyxl.load_workbook(path0 + "Data.xlsx")
    sheet1 = sheets[sheets.sheetnames[0]]
    max_row1 = sheet1.max_row
    print("第几行:",max_row1)
    name = name_entry.get()
    tkinter.messagebox.showinfo(title="提示",message="开始录入人脸信息!")
    image = str(max_row1)+".jpg"
    get_photo(path + image)

    sheet1.cell(max_row1 + 1,1).value = str(max_row1)
    print(type(sheet1.cell(max_row1 + 1,1).value))
    sheet1.cell(max_row1 + 1,2).value = name
    sheets.save(path0 + "Data.xlsx")
    print("注册成功,您的编号是"+ str(max_row1)+"号")
    tkinter.messagebox.showinfo(title="提示",message="完成注册!")

7. 返回按钮back_main()函数


def back_main(second_frame):
    second_frame.place_forget()
    main_frame.place(relwidth=1,relheight= 1)

五、备注

点我:Data工作薄和完成程序链接
链接:https://pan.baidu.com/s/19xhbOF7xFhPKO7_nqDd-QA?pwd=lyx4
提取码:lyx4

Original: https://blog.csdn.net/lyx4949/article/details/125545962
Author: lyx4949
Title: 基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/701424/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球