失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > python opencv人脸识别考勤系统

python opencv人脸识别考勤系统

时间:2018-11-06 07:46:44

相关推荐

python opencv人脸识别考勤系统

python opencv人脸识别考勤系统

如需安装运行环境或远程调试,可加QQ905733049,或QQ2945218359由专业技术人员远程协助!

运行结果如下:

代码如下:

import wximport wx.gridfrom time import localtime,strftimeimport osimport ioimport zlibimport dlib # 人脸识别的库dlibimport numpy as np # 数据处理的库numpyimport cv2 # 图像处理的库OpenCvimport _threadimport threadingID_NEW_REGISTER = 160ID_FINISH_REGISTER = 161ID_START_PUNCHCARD = 190ID_END_PUNCARD = 191ID_OPEN_LOGCAT = 283ID_CLOSE_LOGCAT = 284ID_WORKER_UNAVIABLE = -1PATH_FACE = "data/face_img_database/"# face recognition model, the object maps human faces into 128D vectorsfacerec = 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 = pute_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 = pute_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()mit()conn.close()def adapt_array(self,arr):out = io.BytesIO()np.save(out, arr)out.seek(0)dataa = out.read()# 压缩数据流return sqlite3.Binary(press(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()mit()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])passapp = wx.App()frame = WAS()frame.Show()app.MainLoop()

运行结果如下:

C++学习参考实例

C++实现图形界面五子棋游戏源码:

/alicema1111/article/details/90035420

C++实现图形界面五子棋游戏源码2:

/alicema1111/article/details/106479579

C++ OpenCV相片视频人脸识别统计人数:

/alicema1111/article/details/105833928

VS+PCL开发环境配置:

/alicema1111/article/details/106877145

VS+Qt+PCL点云开发环境配置:

/alicema1111/article/details/105433636

C++ OpenCV汽车检测障碍物与测距:

/alicema1111/article/details/105833449

Windows VS安装配置PCL点云库:

/alicema1111/article/details/105111110

如果觉得《python opencv人脸识别考勤系统》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。