python opencv人脸识别考勤系统的完整源码

article/2025/10/8 4:43:19
这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值。

代码如下:

import wx
import wx.grid
from time import localtime,strftime
import os
import io
import zlib
import dlib # 人脸识别的库dlib
import numpy as np # 数据处理的库numpy
import cv2 # 图像处理的库OpenCv
import _thread
import threading

ID_NEW_REGISTER = 160
ID_FINISH_REGISTER = 161

ID_START_PUNCHCARD = 190
ID_END_PUNCARD = 191

ID_OPEN_LOGCAT = 283
ID_CLOSE_LOGCAT = 284

ID_WORKER_UNAVIABLE = -1

PATH_FACE = “data/face_img_database/”

face recognition model, the object maps human faces into 128D vectors

facerec = dlib.face_recognition_model_v1(“model/dlib_face_recognition_resnet_model_v1.dat”)

Dlib 预测器

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor(‘model/shape_predictor_68_face_landmarks.dat’)

class WAS(wx.Frame):
def init(self):
wx.Frame.init(self,parent=None,title=“员工考勤系统”,size=(920,560))

    self.initMenu()self.initInfoText()self.initGallery()self.initDatabase()self.initData()def initData(self):self.name = ""self.id =ID_WORKER_UNAVIABLEself.face_feature = ""self.pic_num = 0self.flag_registed = Falseself.puncard_time = "21:00:00"self.loadDataBase(1)def initMenu(self):menuBar = wx.MenuBar()  #生成菜单栏menu_Font = wx.Font()#Font(faceName="consolas",pointsize=20)menu_Font.SetPointSize(14)menu_Font.SetWeight(wx.BOLD)registerMenu = wx.Menu() #生成菜单self.new_register = wx.MenuItem(registerMenu,ID_NEW_REGISTER,"新建录入")self.new_register.SetBitmap(wx.Bitmap("drawable/new_register.png"))self.new_register.SetTextColour("SLATE BLUE")self.new_register.SetFont(menu_Font)registerMenu.Append(self.new_register)self.finish_register = wx.MenuItem(registerMenu,ID_FINISH_REGISTER,"完成录入")self.finish_register.SetBitmap(wx.Bitmap("drawable/finish_register.png"))self.finish_register.SetTextColour("SLATE BLUE")self.finish_register.SetFont(menu_Font)self.finish_register.Enable(False)registerMenu.Append(self.finish_register)puncardMenu = wx.Menu()self.start_punchcard = wx.MenuItem(puncardMenu,ID_START_PUNCHCARD,"开始签到")self.start_punchcard.SetBitmap(wx.Bitmap("drawable/start_punchcard.png"))self.start_punchcard.SetTextColour("SLATE BLUE")self.start_punchcard.SetFont(menu_Font)puncardMenu.Append(self.start_punchcard)self.close_logcat = wx.MenuItem(logcatMenu, ID_CLOSE_LOGCAT, "关闭日志")self.close_logcat.SetBitmap(wx.Bitmap("drawable/close_logcat.png"))self.close_logcat.SetFont(menu_Font)self.close_logcat.SetTextColour("SLATE BLUE")logcatMenu.Append(self.close_logcat)menuBar.Append(registerMenu,"&人脸录入")menuBar.Append(puncardMenu,"&刷脸签到")menuBar.Append(logcatMenu,"&考勤日志")self.SetMenuBar(menuBar)self.Bind(wx.EVT_MENU,self.OnNewRegisterClicked,id=ID_NEW_REGISTER)self.Bind(wx.EVT_MENU,self.OnFinishRegisterClicked,id=ID_FINISH_REGISTER)self.Bind(wx.EVT_MENU,self.OnStartPunchCardClicked,id=ID_START_PUNCHCARD)self.Bind(wx.EVT_MENU,self.OnEndPunchCardClicked,id=ID_END_PUNCARD)self.Bind(wx.EVT_MENU,self.OnOpenLogcatClicked,id=ID_OPEN_LOGCAT)self.Bind(wx.EVT_MENU,self.OnCloseLogcatClicked,id=ID_CLOSE_LOGCAT)passdef OnCloseLogcatClicked(self,event):self.SetSize(920,560)self.initGallery()passdef register_cap(self,event):# 创建 cv2 摄像头对象self.cap = cv2.VideoCapture(0)# cap.set(propId, value)# 设置视频参数,propId设置的视频参数,value设置的参数值# self.cap.set(3, 600)# self.cap.set(4,600)# cap是否初始化成功while self.cap.isOpened():# cap.read()# 返回两个值:#    一个布尔值true/false,用来判断读取视频是否成功/是否到视频末尾#    图像对象,图像的三维矩阵flag, im_rd = self.cap.read()# 每帧数据延时1ms,延时为0读取的是静态帧kk = cv2.waitKey(1)# 人脸数 detsdets = detector(im_rd, 1)# 检测到人脸if len(dets) != 0:biggest_face = dets[0]#取占比最大的脸maxArea = 0for det in dets:w = det.right() - det.left()h = det.top()-det.bottom()if w*h > maxArea:biggest_face = detmaxArea = w*h# 绘制矩形框cv2.rectangle(im_rd, tuple([biggest_face.left(), biggest_face.top()]),tuple([biggest_face.right(), biggest_face.bottom()]),(255, 0, 0), 2)img_height, img_width = im_rd.shape[:2]image1 = cv2.cvtColor(im_rd, cv2.COLOR_BGR2RGB)pic = wx.Bitmap.FromBuffer(img_width, img_height, image1)# 显示图片在panel上self.bmp.SetBitmap(pic)# 获取当前捕获到的图像的所有人脸的特征,存储到 features_cap_arrshape = predictor(im_rd, biggest_face)features_cap = facerec.compute_face_descriptor(im_rd, shape)# 对于某张人脸,遍历所有存储的人脸特征for i,knew_face_feature in enumerate(self.knew_face_feature):# 将某张人脸与存储的所有人脸数据进行比对compare = return_euclidean_distance(features_cap, knew_face_feature)if compare == "same":  # 找到了相似脸self.infoText.AppendText(self.getDateAndTime()+"工号:"+str(self.knew_id[i])+" 姓名:"+self.knew_name[i]+" 的人脸数据已存在\r\n")self.flag_registed = Trueself.OnFinishRegister()_thread.exit()# print(features_known_arr[i][-1])face_height = biggest_face.bottom()-biggest_face.top()face_width = biggest_face.right()- biggest_face.left()im_blank = np.zeros((face_height, face_width, 3), np.uint8)try:for ii in range(face_height):for jj in range(face_width):im_blank[ii][jj] = im_rd[biggest_face.top() + ii]parent=self.bmp,max=100000000,min=ID_WORKER_UNAVIABLE)for knew_id in self.knew_id:if knew_id == self.id:self.id = ID_WORKER_UNAVIABLEwx.MessageBox(message="工号已存在,请重新输入", caption="警告")while self.name == '':self.name = wx.GetTextFromUser(message="请输入您的的姓名,用于创建姓名文件夹",caption="温馨提示",default_value="", parent=self.bmp)# 监测是否重名for exsit_name in (os.listdir(PATH_FACE)):if self.name == exsit_name:wx.MessageBox(message="姓名文件夹已存在,请重新输入", caption="警告")self.name = ''breakos.makedirs(PATH_FACE+self.name)_thread.start_new_thread(self.register_cap,(event,))passdef OnFinishRegister(self):self.new_register.Enable(True)self.finish_register.Enable(False)self.cap.release()self.bmp.SetBitmap(wx.Bitmap(self.pic_index))if self.flag_registed == True:dir = PATH_FACE + self.namefor file in os.listdir(dir):os.remove(dir+"/"+file)print("已删除已录入人脸的图片", dir+"/"+file)os.rmdir(PATH_FACE + self.name)print("已删除已录入人脸的姓名文件夹", dir)self.initData()returnif self.pic_num>0:pics = os.listdir(PATH_FACE + self.name)feature_list = []feature_average = []for i in range(len(pics)):pic_path = PATH_FACE + self.name + "/" + pics[i]print("正在读的人脸图像:", pic_path)img = iio.imread(pic_path)img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)dets = detector(img_gray, 1)if len(dets) != 0:shape = predictor(img_gray, dets[0])face_descriptor = facerec.compute_face_descriptor(img_gray, shape)feature_list.append(face_descriptor)else:face_descriptor = 0print("未在照片中识别到人脸")if len(feature_list) > 0:for j in range(128):#防止越界feature_average.append(0)for i in range(len(feature_list)):feature_average[j] += feature_list[i][j]feature_average[j] = (feature_average[j]) / len(feature_list)self.insertARow([self.id,self.name,feature_average],1)self.infoText.AppendText(self.getDateAndTime()+"工号:"+str(self.id)+" 姓名:"+self.name+" 的人脸数据已成功存入\r\n")passelse:os.rmdir(PATH_FACE + self.name)print("已删除空文件夹",PATH_FACE + self.name)self.initData()def OnFinishRegisterClicked(self,event):self.OnFinishRegister()passdef OnStartPunchCardClicked(self,event):# cur_hour = datetime.datetime.now().hour# print(cur_hour)# if cur_hour>=8 or cur_hour<6:#     wx.MessageBox(message='''您错过了今天的签到时间,请明天再来\n#     每天的签到时间是:6:00~7:59''', caption="警告")#     returnself.start_punchcard.Enable(False)self.end_puncard.Enable(True)self.loadDataBase(2)threading.Thread(target=self.punchcard_cap,args=(event,)).start()#_thread.start_new_thread(self.punchcard_cap,(event,))passdef OnEndPunchCardClicked(self,event):self.start_punchcard.Enable(True)self.end_puncard.Enable(False)passdef initGallery(self):self.pic_index = wx.Image("drawable/index.png", wx.BITMAP_TYPE_ANY).Scale(600, 500)self.bmp = wx.StaticBitmap(parent=self, pos=(320,0), bitmap=wx.Bitmap(self.pic_index))passdef getDateAndTime(self):dateandtime = strftime("%Y-%m-%d %H:%M:%S",localtime())return "["+dateandtime+"]"#数据库部分
#初始化数据库
def initDatabase(self):conn = sqlite3.connect("inspurer.db")  #建立数据库连接cur = conn.cursor()             #得到游标对象cur.execute('''create table if not exists worker_info(name text not null,id int not null primary key,face_feature array not null)''')cur.execute('''create table if not exists logcat(datetime text not null,id int not null,name text not null,late text not null)''')cur.close()conn.commit()conn.close()def adapt_array(self,arr):out = io.BytesIO()np.save(out, arr)out.seek(0)dataa = out.read()# 压缩数据流return sqlite3.Binary(zlib.compress(dataa, zlib.Z_BEST_COMPRESSION))def convert_array(self,text):out = io.BytesIO(text)out.seek(0)dataa = out.read()# 解压缩数据流out = io.BytesIO(zlib.decompress(dataa))return np.load(out)def insertARow(self,Row,type):conn = sqlite3.connect("inspurer.db")  # 建立数据库连接cur = conn.cursor()  # 得到游标对象if type == 1:cur.execute("insert into worker_info (id,name,face_feature) values(?,?,?)",(Row[0],Row[1],self.adapt_array(Row[2])))print("写人脸数据成功")if type == 2:cur.execute("insert into logcat (id,name,datetime,late) values(?,?,?,?)",(Row[0],Row[1],Row[2],Row[3]))print("写日志成功")passcur.close()conn.commit()conn.close()passdef loadDataBase(self,type):conn = sqlite3.connect("inspurer.db")  # 建立数据库连接cur = conn.cursor()  # 得到游标对象if type == 1:self.knew_id = []self.knew_name = []self.knew_face_feature = []cur.execute('select id,name,face_feature from worker_info')origin = cur.fetchall()for row in origin:print(row[0])self.knew_id.append(row[0])print(row[1])self.knew_name.append(row[1])print(self.convert_array(row[2]))self.knew_face_feature.append(self.convert_array(row[2]))if type == 2:self.logcat_id = []self.logcat_name = []self.logcat_datetime = []self.logcat_late = []cur.execute('select id,name,datetime,late from logcat')origin = cur.fetchall()for row in origin:print(row[0])self.logcat_id.append(row[0])print(row[1])self.logcat_name.append(row[1])print(row[2])self.logcat_datetime.append(row[2])print(row[3])self.logcat_late.append(row[3])pass

app = wx.App()
frame = WAS()
frame.Show()
app.MainLoop()

运行结果如下:
在这里插入片描述


http://chatgpt.dhexx.cn/article/70e0a4HJ.shtml

相关文章

基于face recognition OpenCV 的人脸考勤系统

人脸考勤系统客户端的主要功能有:人脸识别、网络通信、数据可视化,信息展示等:主要界面: 2.2.1 人脸识别模块 人脸识别模块是基于 face recognition 库实现的,face recognition 是世界上最简单的人脸识别库。人脸识别模块分为人脸目标检测、人脸特征向量编码以及人脸身份匹…

Python人脸识别考勤打卡系统

Python人脸识别考勤打卡系统 如需安装运行环境或远程调试&#xff0c;可加QQ905733049, 或QQ2945218359由专业技术人员远程协助&#xff01; 运行结果如下&#xff1a; 主要代码&#xff1a; import random import cv2 import numpy import datetime import os import time …

Java人脸识别登录Demo(人脸考勤系统)

最近好多小伙伴在做毕设&#xff0c;有人脸识别登录、人脸识别考勤系统、人脸支付&#xff08;本文代码可以实现&#xff0c;但只限于识别逻辑&#xff0c;并不安全&#xff09;等&#xff0c;跟人脸识别有关的项目。由于上一篇文章写了关于人脸识别登录的代码有很多小伙伴找我…

基于java人脸识别考勤签到系统设计与实现毕业设计毕设作品

功能清单 【管理员功能】 录入员工&#xff1a;录入员工账号&#xff0c;密码&#xff0c;姓名&#xff0c;上传头像等资料 员工列表&#xff1a;显示已经录入的所有员工列表 员工管理&#xff1a;支持修改员工信息和删除操作 员工人脸打卡列表&#xff1a;显示所有员工的打卡…

超详细基于MATLAB的人脸考勤识别系统

基于MATLAB的人脸考勤识别系统 摘 要 人脸识别是模式识别和图像处理等学科的一个研究热点&#xff0c;它广泛应用在身份验证、刑侦破案、视频监视、机器人智能化和医学等领域&#xff0c;具有广阔的应用价值和商用价值。人脸特征作为一种生物特征&#xff0c;与其他生物特征相比…

Python人脸识别签到考勤系统

前言 本项目为IOT实验室人员签到考勤设计&#xff0c;系统实现功能&#xff1a; ◦人员人脸识别并完成签到/签退 ◦考勤时间计算 ◦保存考勤数据为CSV格式&#xff08;Excel表格&#xff09; PS&#xff1a;本系统2D人脸识别&#xff0c;节约了繁琐的人脸识别训练部分&…

使用Python搭建人脸识别考勤系统

介绍 在本文中&#xff0c;你将学习如何使用 Python 构建人脸识别系统。人脸识别比人脸检测更进一步。在人脸检测中&#xff0c;我们只检测人脸在图像中的位置&#xff0c;但在人脸识别中&#xff0c;我们制作了一个可以识别人的系统。 “人脸识别是验证或识别图片或视频中的人…

python人脸考勤系统

基于一个开源项目进行改编设计 先来看演示&#xff0c;具体讲解有空再说… 设计数据库 数据库用于存储打卡信息等。 表logcat&#xff1a;用于存储打卡实时间&#xff0c;id&#xff0c;名字&#xff0c;是否迟到。 表time&#xff1a;用于设置默认上下学时间 表worker_in…

基于OpenCV的人脸 考勤系统

详细的设计流程点击链接&#xff1a; https://wenku.baidu.com/view/871e4bb7974bcf84b9d528ea81c758f5f71f2952?fruc 修订记录 版本号 修改记录 修改者 修改日期 V1.0 初次编写 WenJie 2019.05.11 目 录 第一章 引言................................…

Python3:基于Opencv4.2和wxPython4可视化界面的人脸考勤系统

前言 主题&#xff1a;基于Opencv4.2的人脸考勤系统 功能模块 采集人脸&#xff1a;收集需要录入的学生信息&#xff0c;开启摄像头收集截取对应的人脸图片&#xff1b;训练人脸数据模型&#xff1a;根据收集和整合好的人脸图片数据训练成人脸数据模型&#xff1b;人脸识别打…

QT基于百度的人脸考勤系统

目录 一、百度智能云介绍 二、代码 1、camera类 2、widget类 3、register类 4、dialog类 三、效果演示 四、改进 获取完整代码请前往&#xff1a;GitHub - zhaohigh/Qt-chatrobut 目前还在学习中&#xff0c;需要练练手&#xff0c;就写了一个基于百度人脸识别的考勤…

Python人脸识别智能考勤系统 (供源码,附报告)(可答疑,可调试)

目录 一、项目简介 二、功能展示 1.人脸识别功能测试 2.识别并录入人脸及个人信息 3.数据库保存信息 4.考勤打卡 三、环境安装实例 1.下载python对应版本的dlib 2.安装opencv-python 3.安装face_recognition 4.安装pyqt5 5.安装mysqlclient 四、需要源码私信并call邮…

基于OpenCV的人脸识别考勤系统

考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式。但由于课程繁多加上学生人数众多, 代替点名现象普遍存在, 而且传统的现场点名签到方式费时费力, 直接影响到授课质量…

手把手教你:人脸识别考勤系统

系列文章 手把手教你&#xff1a;人脸识别考勤系统 本文为系列第一篇 文章目录 系列文章项目简介一、项目展示二、环境需求环境安装实例 三、功能模块介绍1.人脸库图像2.构建人脸库3.启动人脸识别功能 完整代码地址 项目简介 本文主要介绍如何使用python搭建&#xff1a;一个…

LabVIEW入门与实战开发32例

链接&#xff1a;https://pan.baidu.com/s/1FqRL1loyDS-YT4wzIdRg2A 提取码&#xff1a;xe7y

LabView学习

一、基础篇 1、Labview是一种程序开发环境&#xff0c;由美国国家仪器&#xff08;NI&#xff09;公司研制开发。 2、NI-VISA(Virtual Instrument Software Architec-ture&#xff0c;以下简称为“VISA”)是美国国家仪器NI(NationalInstrument)公司开发的一种用来与各种仪器总…

基于实践的LabVIEW零基础入门视频教程

原文地址::http://blog.eeecontrol.com/LabVIEW1/ 《基于实践的LabVIEW零基础入门视频教程》 资料不在多,而在于精,资料太多,反而会迷失方向&#xff0c;学习最怕的就是打乱仗,选择对的方向,比努力更重要,这也是本人的亲身经历!《基于实践的LabVIEW零基础入门视频教程》方向明确…

Labview简介

公司&#xff1a;美国国家仪器&#xff08;成立于1976年&#xff09; 初始发布时间&#xff1a;1986年 底层语言&#xff1a;C、C 操作系统&#xff1a;windows、macOS、linux 运用场景&#xff1a;数据采集、仪器控制、自动化、分析与信号处理、工业控制、嵌入式和系统设计…

LabVIEW学习笔记(三)——程序结构

前言&#xff1a; 任何计算机语言都离不开程序结构&#xff0c;LabVIEW 作为一种图形化的高级程序幵发语言也不例外。LabVIEW 中的程序结构包括if-else循环&#xff0c;while循环结构&#xff0c;使能结构&#xff0c;公式节点和数学脚本节点等&#xff0c; 因此通过LabVIEW可以…

LabVIEW使用入门指导

LabVIEW是一种图像化设计工具&#xff0c;它的“代码”格式为*.vi(Virtual Instrument)&#xff0c;分为前端面板和后端面板&#xff0c;前端面板又可以称之为顶层设计&#xff0c;是用户界面&#xff0c;后端设计师代码以及元器件试图。 前端面板 前端面板中&#xff0c;用户…