电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

python opencv人臉識別考勤系統的完整源碼

瀏覽:91日期:2022-06-21 09:36:25

如需安裝運行環境或遠程調試,可加QQ905733049, 或QQ2945218359由專業技術人員遠程協助!

運行結果如下:

python opencv人臉識別考勤系統的完整源碼

代碼如下:

import wximport wx.gridfrom time import localtime,strftimeimport osimport ioimport zlibimport dlib # 人臉識別的庫dlibimport numpy as np # 數據處理的庫numpyimport cv2 # 圖像處理的庫OpenCvimport _threadimport threading ID_NEW_REGISTER = 160ID_FINISH_REGISTER = 161 ID_START_PUNCHCARD = 190ID_END_PUNCARD = 191 ID_OPEN_LOGCAT = 283ID_CLOSE_LOGCAT = 284 ID_WORKER_UNAVIABLE = -1 PATH_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) pass def OnCloseLogcatClicked(self,event):self.SetSize(920,560) self.initGallery()pass def 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) # 人臉數 dets dets = 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]+' 的人臉數據已存在rn')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_UNAVIABLE wx.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,))pass def 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.name for 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 = 0 print('未在照片中識別到人臉') 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+' 的人臉數據已成功存入rn') pass else: os.rmdir(PATH_FACE + self.name) print('已刪除空文件夾',PATH_FACE + self.name)self.initData() def OnFinishRegisterClicked(self,event):self.OnFinishRegister()pass def 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,))pass def OnEndPunchCardClicked(self,event):self.start_punchcard.Enable(True)self.end_puncard.Enable(False)pass def 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))pass def 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()pass def 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()

運行結果如下:

python opencv人臉識別考勤系統的完整源碼

C++學習參考實例:

使用C++ MFC編寫一個簡單的五子棋游戲程序

https://www.jb51.net/article/180940.htm

C++實現簡易五子棋游戲

https://www.jb51.net/article/190548.htm

c++ 基于opencv 識別、定位二維碼

https://www.jb51.net/article/207158.htm

到此這篇關于python opencv人臉識別考勤系統的完整源碼的文章就介紹到這了,更多相關python 人臉識別考勤系統內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 驾驶式洗地机/扫地机_全自动洗地机_工业洗地机_荣事达工厂官网 | 移动厕所租赁|移动卫生间|上海移动厕所租赁-家瑞租赁 | 耐破强度测试仪-纸箱破裂强度试验机-济南三泉中石单品站 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 恒湿机_除湿加湿一体机_恒湿净化消毒一体机厂家-杭州英腾电器有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 远程会诊系统-手术示教系统【林之硕】医院远程医疗平台 | 净化板-洁净板-净化板价格-净化板生产厂家-山东鸿星新材料科技股份有限公司 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 顺景erp系统_erp软件_erp软件系统_企业erp管理系统-广东顺景软件科技有限公司 | 十字轴_十字轴万向节_十字轴总成-南京万传机械有限公司 | 加盟店-品牌招商加盟-创业项目商机平台 | 宠物店加盟_宠物连锁店_开宠物店-【派多格宠物】 | 单机除尘器 骨架-脉冲除尘器设备生产厂家-润天环保设备 | 天然气分析仪-液化气二甲醚分析仪|传昊仪器 | 工业胀紧套_万向节联轴器_链条-规格齐全-型号选购-非标订做-厂家批发价格-上海乙谛精密机械有限公司 | 深圳办公室装修,办公楼/写字楼装修设计,一级资质 - ADD写艺 | Boden齿轮油泵-ketai齿轮泵-yuken油研-无锡新立液压有限公司 | 电磁铁_小型推拉电磁铁_电磁阀厂家-深圳市宗泰电机有限公司 | 铝箔袋,铝箔袋厂家,东莞铝箔袋,防静电铝箔袋,防静电屏蔽袋,防静电真空袋,真空袋-东莞铭晋让您的产品与众不同 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 走心机厂家,数控走心机-台州博城智能科技有限公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 菏泽知彼网络科技有限公司 | 石牌坊价格石牌坊雕刻制作_石雕牌坊牌楼石栏杆厂家_山东嘉祥石雕有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 警用|治安|保安|不锈钢岗亭-售货亭价格-垃圾分类亭-移动厕所厂家-苏州灿宇建材 | 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 济南网站建设|济南建网站|济南网站建设公司【济南腾飞网络】【荐】 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 横河变送器-横河压力变送器-EJA变送器-EJA压力变送器-「泉蕴仪表」 | 聚丙烯酰胺_阴离子_阳离子「用量少」巩义亿腾厂家直销,售后无忧 聚合甘油__盐城市飞龙油脂有限公司 | 钢板仓,大型钢板仓,钢板库,大型钢板库,粉煤灰钢板仓,螺旋钢板仓,螺旋卷板仓,骨料钢板仓 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 购买舔盐、舔砖、矿物质盐压块机,鱼饵、鱼饲料压块机--请到杜甫机械 | 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 |