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

一、界面效果


在主界面分别按下“新学生注册”按钮和“刷脸打卡”按钮的过程效果如图:

二、开发环境

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

三、开发准备

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

四、实现过程

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

import cv2  #OpenCV库
import openpyxl  #openpyxl库
import os  #操作系统相关库,标准库
import time  #time库
import tkinter.messagebox  #messagebox消息框模块
from tkinter import *  #tkinter库
import face_recognition

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

#主界面程序
top = Tk()
top.title("考勤系统")  #窗口标题
top.geometry("500x300")  #窗口尺寸大小
#主界面的框架组件main_frame
main_frame = Frame(top) #第一层框架组件
main_frame.place(relwidth=1,relheight= 1)  #参数设置为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)  #放置“退出系统”按钮,destroy()直接销毁窗口
#定义文件路径
path = "C:/Users/Administrator/Desktop/class/face/"  #face文件夹
path0 = "C:/Users/Administrator/Desktop/class/"  #桌面
top.mainloop()  #进入进入等待与处理窗口事件

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

#拍摄照片函数
def get_photo(img):  #i参数mg,是拍摄的图片名称,也包含指定的路经capture = cv2.VideoCapture(0, cv2.CAP_DSHOW)  #打开摄像头,参数0是摄像头端口,可以更换ref,frame=capture.read()  #将摄像头中的一帧数据保存下来cv2.imwrite(img,frame)  #将图片保存下来cv2.imshow(img,frame)  #窗口显示cv2.waitKey(1000) #延时1000ms,即1scv2.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]  #给定一个图像,返回图像中每个面的128维人脸编码#返回face文件夹里面的内容,要从人脸库face文件夹中,获取验证者的身份pathDir = os.listdir(path)  #返回的是文件夹里的每一张图片flag = 0  #人脸标志位#测试另外一张图像for i in pathDir: #遍历6张图片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]  #将图像编码#compare_faces比较脸部编码列表和face文件夹内的候选编码,看看它们是否匹配,匹配成功返回[True]s = face_recognition.compare_faces([student_encode],face_encode,tolerance=0.49)  #参数tolerance是两张脸之间有多少距离才算匹配。该值越小对比越严格,0.49是我测出来最佳的if s == [True] :  #如果匹配成功则返回的是布尔型列表里的Trueflag = 1  #成功的话将标志位赋值为1num = i[:len(i)-4]  #获取图片的编号,去掉“.jpg”。例如是照片“7.jpg”,这里num就是7,就是注册者的编号break  #直接跳出循环else:flag = 0  #没有匹配成功则标志位为0if flag ==1:  #通过编号num在表格中找到验证者的位置#表格操作sheets = openpyxl.load_workbook(path0 + "Data.xlsx")  #打开“学生信息表”工作薄sheet1 = sheets[sheets.sheetnames[0]]  #获取Data工作薄里面的第一个表“学生信息表”max_row1 = sheet1.max_row  #获取第一个表格有数据最后一行的行数print("验证者的编号是:" , num)  #输出对比结果#print(type(num),type(sheet1.cell(max_row1,1).value))for j in range(2,max_row1+1):  #遍历‘学生信息表’if sheet1.cell(j,1).value == str(num):  #根据编号定位到对应学生在表格中的位置,例如杰克的编号是1,num=1,从“学生信息表”中第一列找到编号是1的那一行j,也就是第二行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]]  #获取Data工作薄里面的第二个表“学生考勤表”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")  #保存到Data工作薄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()  #隐藏main_frame框架second_frame = Frame(top)  #定义第二个框架second_frame,用于注册界面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文件夹内。将学生的姓名、序号填写到“学生信息”表格中

#学生信息存储
def Message(name_entry):#表格操作sheets = openpyxl.load_workbook(path0 + "Data.xlsx")  #打开“学生信息表”工作薄sheet1 = sheets[sheets.sheetnames[0]]  #获取Data工作薄里面的第一个表“学生信息表”max_row1 = sheet1.max_row  #获取第一个表格有数据最后一行的行数print("第几行:",max_row1)name = name_entry.get()  #利用get()方法获取Entry组件中输入的内容tkinter.messagebox.showinfo(title="提示",message="开始录入人脸信息!")  #消息方框image = str(max_row1)+".jpg"  #从表格获取行数,为照片进行编号get_photo(path + image)  #获取新学生的照片,保存到face文件夹里#填写学生信息,包括序号、姓名             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()函数

#返回按钮,从当前界面(second_frame)返回主界面(main_frame)
def back_main(second_frame):second_frame.place_forget()  #隐藏second_frame框架main_frame.place(relwidth=1,relheight= 1)  #显示main_frame框架

五、备注

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

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

  1. 【Python】基于人脸识别的智能考勤系统(Pyqt5+MySQL+Opencv) [PC端部分-已附源码]

    [Python]基于人脸识别的考勤系统 [PC端部分] 一.项目简介 本项目编程语言Python3.6,编程工具pycharm,其他工具QT Designer.Navicat,表单信息保存在本地MyS ...

  2. 使用Python实现基于人脸识别的上课考勤系统(一):数据录入端

    一.简介 这个人脸识别考勤签到系统是基于大佬的人脸识别陌生人报警系统二次开发的. 此处放一个大佬原项目GitHub链接:基于OpenCV的视频人脸识别[陌生人报警]系统 项目使用Python实现,基于 ...

  3. opencv python考勤_GitHub - liqq1228/python-opencv: 基于python opencv人脸识别的员工考勤系统...

    项目及作者说明 一个基于 Opencv.dlib 人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,Python 学习期间. 开源版及商业版说明 开源版 商业版 人脸录入 ...

  4. 基于python opencv人脸识别的员工考勤系统

    WorkAttendanceSystem 一个基于opencv人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,python课设期间. 源代码详细解释请关注微信公众号: ...

  5. opencv python考勤_基于opencv和dlib人脸识别的员工考勤系统

    已打包生成可执行文件exe,可直接下载运行,exe文件及代码均已上传到我的github,点击传送门,打包的具体过程及教程可见pyinstaller简明教程 WorkAttendanceSystem 一 ...

  6. opencv人脸识别考勤 python_GitHub - lisanshui007/python-opencv: 基于python opencv人脸识别的员工考勤系统...

    项目及作者说明 一个基于 Opencv.dlib 人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,Python 学习期间. 开源版及商业版说明 开源版 商业版 人脸录入 ...

  7. python人脸考勤系统_GitHub - jykcc/python-opencv: 基于python opencv人脸识别的员工考勤系统...

    项目及作者说明 一个基于 Opencv.dlib 人脸识别的员工考勤系统,作者某双一流A类大学里的一流学生,写于2018/09/,Python 学习期间. 开源版及商业版说明 开源版 商业版 人脸录入 ...

  8. 基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别

    基于人脸识别的课堂签到管理系统(三)---实时时间显示以及百度AI人脸识别 一.前言概述 二.实时时间显示 三.百度AI人脸识别 3.1 获取access_token 3.2 发送请求,通过网络请求方 ...

  9. 基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计

    基于人脸识别的课堂签到管理系统(一)---环境设置以及简单的QT界面设计 一.前言 二.Pycharm安装与环境配置 2.1 Pycharm安装配置 2.2 Pycharm环境配置 三.QT界面设计 ...

最新文章

  1. Windows Azure Cloud Service (19) 动态指定WCF的发布地址
  2. JavaScript---事件监听
  3. 李宏毅Reinforcement Learning强化学习入门笔记
  4. 值得推荐的威胁情报平台
  5. node php环境变量配置,关于NodeJS、NPM安装配置步骤(windows版本) 以及环境变量的介绍...
  6. EDC(Enterprise Data Center 企业数据中心)
  7. python lambda函数详细解析(面试经常遇到)
  8. 设计一些自学软件的小测试demo吧。
  9. python在预算执行审计中的应用_重庆万州:运用“大数据+” 预算执行审计取得成效...
  10. PPT模板 | 红色学术风论文答辩PPT模板
  11. 基于 FPGA 的 SATA 3.0 IP 核简介
  12. nn.functional.normalize
  13. IEEE 802.1AS-2011 第七章 桥接局域网的时间同步模型
  14. 【ACWing】3626. 三元一次方程
  15. sap 修改主机名过程
  16. excel快速输入金额大写
  17. 首席新媒体黎想教程:活动推广提升线下活动转化率?
  18. WinDebug dump
  19. 极品五笔的输入法输入的文字怎么在简繁体之间切换?
  20. 纯css制作大耳朵图图

热门文章

  1. css实现简单的电影院选座功能
  2. matlab物理仿真可视化,基于Matlab的建模和仿真
  3. 数据库建模-物理层建模
  4. 服务器2003蓝屏A5修复,win2003文件服务器蓝屏修复全过程分享第2/2页
  5. 牛客每日练习----あなたの蛙が帰っています,おみやげをまらいました,写真がとどいています
  6. 【Web Design The Missing Link】Chatty APIs
  7. 苹果笔记本上玩windows to go
  8. Python的10大集成开发环境和代码编辑器(指南)
  9. go之官方依赖管理工具dep安装和使用
  10. 【PAT B1015】德才论 (c语言)//答案正确