这篇文章主要介绍了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人脸识别考勤系统的完整源码相关推荐

  1. 基于Python的人脸识别考勤系统

    基于Python的人脸识别考勤系统 Python源文件: 基于Python3.7编程环境开发 需要安装 tkinter pil face_recognition OpenCV2 库来实现人脸识别 需要 ...

  2. (开源)简单的人脸识别考勤系统(python+opencv+dilb)

    简单的毕业设计,python+opencv+dlib,注意配置环境,打开工程文件直接运行.演示视频前往B站(开源)人脸识别签到系统_哔哩哔哩_bilibili 源文件及使用说明百度网盘下载链接: ht ...

  3. Python+OpenCV人脸识别签到考勤系统(新手入门)

    Python+OpenCV人脸识别签到考勤系统(新手入门) 前言 项目效果图 项目需要的环境 编译器 辅助开发QT-designer 项目配置 代码部分 核心代码 项目目录结构 后记 正式版改进 项目 ...

  4. python人脸识别考勤系统 dlib+OpenCV和Pyqt5、数据库sqlite 人脸识别系统 计算机 毕业设计 源码

    一.项目介绍 Python语言.dlib.OpenCV.Pyqt5界面设计.sqlite3数据库 本系统使用dlib作为人脸识别工具,dlib提供一个方法可将人脸图片数据映射到128维度的空间向量,如 ...

  5. 【毕业设计_课程设计】基于opencv、dilb的员工人脸识别考勤系统

    文章目录 0 项目说明 1 需求分析 2 总体设计 3 详细设计 4 效果展示 5 实验心得 6 项目源码 7 最后 0 项目说明 基于opencv.dilb的员工人脸识别考勤系统 提示:适合用于课程 ...

  6. OpenCV+ Qt Designer 开发人脸识别考勤系统

    文章目录 1. 系统介绍 2. 系统架构 3. 开发步骤 3.1 安装必要的库 3.2 设计用户界面 3.3 编写代码 3.3.1 导入库 3.3.2 连接数据库 3.3.3 定义主窗口类 3.3.4 ...

  7. 基于python opencv人脸识别的签到系统

    基于python opencv人脸识别的签到系统 前言 先看下效果 实现的功能 开始准备 页面的构建 功能实现 代码部分 总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人 ...

  8. 千万别让老板知道 | Python做个人脸识别考勤系统

    人脸识别考勤系统 实现思路如下: 下面讲解下核心代码 1. 读摄像头 2. 裁剪人脸 3. 识别面部68个关键点 4. 人脸向量化 5. 人脸对比 哈喽大家好,我是王某人. 现在好多公司都用人脸识别实 ...

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

    考勤系统设计 学生上课考勤系统最初的方式是采用的人工纸质点名,目前仍旧有一部分学校依旧采用此种方法点名,这种方法也一直是被认为最有效的签到点名方式.但由于课程繁多加上学生人数众多, 代替点名现象普遍存 ...

最新文章

  1. 将Windows下的文件同步到Linux下
  2. x64 stack walking、调用约定、函数参数识别
  3. 【POJ - 3037】Skiing (Dijkstra算法)
  4. 使用nginx简单实现负载均衡
  5. 深度讲解 Python 四大常用绘图库的“绘图原理”
  6. 英尺、英寸和厘米的换算
  7. 基于cnn的人脸识别_人脸识别技术:从传统方法到深度学习
  8. CAN总线隔离器简介
  9. 混凝土塔吊浇筑怎么计算机械费,秒懂塔吊和施工电梯费用的摊销成本测算~
  10. 刷 百度排名,百度(google)搜索提示下拉关联词的一个简易思路··
  11. 用JavaScript技术实现弹幕效果
  12. 蠕虫勒索软件WannaCrypt0r的行为分析
  13. python获取模块的名称_Python获取模块名称
  14. Java实现信用卡校验
  15. 使用devops的团队_跨职能DevOps团队的8个角色
  16. 50件事爸爸一定要与孩子做(转)
  17. 【C++】初学1———代码分析
  18. linux设备驱动读书笔记(转)
  19. 华为云物联网平台的C#应用开发(基本接口调用)
  20. 未来营销闯关标配:大数据+智能硬件

热门文章

  1. 机器自动翻译古文拼音 - 十大宋词 - 念奴娇 赤壁怀古 苏轼
  2. AT指令(中文详解版)(二)
  3. 英伟达哭晕在厕所,4090Ti显卡被春晚“首发”
  4. Trailing return types尾部返回类型
  5. opencv 摄像头捕获的图像保存为avi视频 代码解析
  6. XDOJ 133-一元稀疏多项式计算器
  7. python连乘函数_python 连乘
  8. 杭州电子科技大学全国计算机排名,杭电排名为什么比211还高,杭州电子科技大学是211吗...
  9. android自定义秒表,Android实现的秒表计时器示例
  10. VR眼镜全国产化电子元件推荐方案