python opencv人脸识别考勤系统的完整源码
这篇文章主要介绍了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()
运行结果如下:
python opencv人脸识别考勤系统的完整源码相关推荐
- 基于Python的人脸识别考勤系统
基于Python的人脸识别考勤系统 Python源文件: 基于Python3.7编程环境开发 需要安装 tkinter pil face_recognition OpenCV2 库来实现人脸识别 需要 ...
- (开源)简单的人脸识别考勤系统(python+opencv+dilb)
简单的毕业设计,python+opencv+dlib,注意配置环境,打开工程文件直接运行.演示视频前往B站(开源)人脸识别签到系统_哔哩哔哩_bilibili 源文件及使用说明百度网盘下载链接: ht ...
- Python+OpenCV人脸识别签到考勤系统(新手入门)
Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...
- python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码
一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...
- 【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统
文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 效果展示 5 实验心得 6 项目源码 7 最后 0 项目说明 基于opencv.dilb的员工人脸识别考勤系统 提示:适合用于课程 ...
- OpenCV+ Qt Designer 开发人脸识别考勤系统
文章目录 1. 系统介绍 2. 系统架构 3. 开发步骤 3.1 安装必要的库 3.2 设计用户界面 3.3 编写代码 3.3.1 导入库 3.3.2 连接数据库 3.3.3 定义主窗口类 3.3.4 ...
- 基于python opencv人脸识别的签到系统
基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...
- 千万别让老板知道 | Python做个人脸识别考勤系统
人脸识别考勤系统 实现思路如下: 下面讲解下核心代码 1. 读摄像头 2. 裁剪人脸 3. 识别面部68个关键点 4. 人脸向量化 5. 人脸对比 哈喽大家好,我是王某人. 现在好多公司都用人脸识别实 ...
- 基于OpenCV的人脸识别考勤系统
考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...
最新文章
- 将Windows下的文件同步到Linux下
- x64 stack walking、调用约定、函数参数识别
- 【POJ - 3037】Skiing (Dijkstra算法)
- 使用nginx简单实现负载均衡
- 深度讲解 Python 四大常用绘图库的“绘图原理”
- 英尺、英寸和厘米的换算
- 基于cnn的人脸识别_人脸识别技术:从传统方法到深度学习
- CAN总线隔离器简介
- 混凝土塔吊浇筑怎么计算机械费,秒懂塔吊和施工电梯费用的摊销成本测算~
- 刷 百度排名,百度(google)搜索提示下拉关联词的一个简易思路··
- 用JavaScript技术实现弹幕效果
- 蠕虫勒索软件WannaCrypt0r的行为分析
- python获取模块的名称_Python获取模块名称
- Java实现信用卡校验
- 使用devops的团队_跨职能DevOps团队的8个角色
- 50件事爸爸一定要与孩子做(转)
- 【C++】初学1———代码分析
- linux设备驱动读书笔记(转)
- 华为云物联网平台的C#应用开发(基本接口调用)
- 未来营销闯关标配:大数据+智能硬件
热门文章
- 机器自动翻译古文拼音 - 十大宋词 - 念奴娇 赤壁怀古 苏轼
- AT指令(中文详解版)(二)
- 英伟达哭晕在厕所,4090Ti显卡被春晚“首发”
- Trailing return types尾部返回类型
- opencv 摄像头捕获的图像保存为avi视频 代码解析
- XDOJ 133-一元稀疏多项式计算器
- python连乘函数_python 连乘
- 杭州电子科技大学全国计算机排名,杭电排名为什么比211还高,杭州电子科技大学是211吗...
- android自定义秒表,Android实现的秒表计时器示例
- VR眼镜全国产化电子元件推荐方案