您好,登錄后才能下訂單哦!
小編給大家分享一下python opencv怎么實(shí)現(xiàn)人臉識(shí)別考勤系統(tǒng),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Python是一種編程語(yǔ)言,內(nèi)置了許多有效的工具,Python幾乎無(wú)所不能,該語(yǔ)言通俗易懂、容易入門(mén)、功能強(qiáng)大,在許多領(lǐng)域中都有廣泛的應(yīng)用,例如最熱門(mén)的大數(shù)據(jù)分析,人工智能,Web開(kāi)發(fā)等。
如需安裝運(yùn)行環(huán)境或遠(yuǎn)程調(diào)試,可加QQ905733049, 或QQ2945218359由專(zhuān)業(yè)技術(shù)人員遠(yuǎn)程協(xié)助!
運(yùn)行結(jié)果如下:
代碼如下:
import wx import wx.grid from time import localtime,strftime import os import io import zlib import dlib # 人臉識(shí)別的庫(kù)dlib import numpy as np # 數(shù)據(jù)處理的庫(kù)numpy import cv2 # 圖像處理的庫(kù)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 預(yù)測(cè)器 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="員工考勤系統(tǒng)",size=(920,560)) self.initMenu() self.initInfoText() self.initGallery() self.initDatabase() self.initData() def initData(self): self.name = "" self.id =ID_WORKER_UNAVIABLE self.face_feature = "" self.pic_num = 0 self.flag_registed = False self.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,"開(kāi)始簽到") 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, "關(guān)閉日志") 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,"&人臉?shù)浫?quot;) 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): # 創(chuàng)建 cv2 攝像頭對(duì)象 self.cap = cv2.VideoCapture(0) # cap.set(propId, value) # 設(shè)置視頻參數(shù),propId設(shè)置的視頻參數(shù),value設(shè)置的參數(shù)值 # self.cap.set(3, 600) # self.cap.set(4,600) # cap是否初始化成功 while self.cap.isOpened(): # cap.read() # 返回兩個(gè)值: # 一個(gè)布爾值true/false,用來(lái)判斷讀取視頻是否成功/是否到視頻末尾 # 圖像對(duì)象,圖像的三維矩陣 flag, im_rd = self.cap.read() # 每幀數(shù)據(jù)延時(shí)1ms,延時(shí)為0讀取的是靜態(tài)幀 kk = cv2.waitKey(1) # 人臉數(shù) dets dets = detector(im_rd, 1) # 檢測(cè)到人臉 if len(dets) != 0: biggest_face = dets[0] #取占比最大的臉 maxArea = 0 for det in dets: w = det.right() - det.left() h = det.top()-det.bottom() if w*h > maxArea: biggest_face = det maxArea = 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) # 獲取當(dāng)前捕獲到的圖像的所有人臉的特征,存儲(chǔ)到 features_cap_arr shape = predictor(im_rd, biggest_face) features_cap = facerec.compute_face_descriptor(im_rd, shape) # 對(duì)于某張人臉,遍歷所有存儲(chǔ)的人臉特征 for i,knew_face_feature in enumerate(self.knew_face_feature): # 將某張人臉與存儲(chǔ)的所有人臉數(shù)據(jù)進(jìn)行比對(duì) compare = return_euclidean_distance(features_cap, knew_face_feature) if compare == "same": # 找到了相似臉 self.infoText.AppendText(self.getDateAndTime()+"工號(hào):"+str(self.knew_id[i]) +" 姓名:"+self.knew_name[i]+" 的人臉數(shù)據(jù)已存在\r\n") self.flag_registed = True self.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="工號(hào)已存在,請(qǐng)重新輸入", caption="警告") while self.name == '': self.name = wx.GetTextFromUser(message="請(qǐng)輸入您的的姓名,用于創(chuàng)建姓名文件夾", caption="溫馨提示", default_value="", parent=self.bmp) # 監(jiān)測(cè)是否重名 for exsit_name in (os.listdir(PATH_FACE)): if self.name == exsit_name: wx.MessageBox(message="姓名文件夾已存在,請(qǐng)重新輸入", caption="警告") self.name = '' break os.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() return if 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("未在照片中識(shí)別到人臉") 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()+"工號(hào):"+str(self.id) +" 姓名:"+self.name+" 的人臉數(shù)據(jù)已成功存入\r\n") 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='''您錯(cuò)過(guò)了今天的簽到時(shí)間,請(qǐng)明天再來(lái)\n # 每天的簽到時(shí)間是:6:00~7:59''', caption="警告") # return self.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+"]" #數(shù)據(jù)庫(kù)部分 #初始化數(shù)據(jù)庫(kù) def initDatabase(self): conn = sqlite3.connect("inspurer.db") #建立數(shù)據(jù)庫(kù)連接 cur = conn.cursor() #得到游標(biāo)對(duì)象 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() # 壓縮數(shù)據(jù)流 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() # 解壓縮數(shù)據(jù)流 out = io.BytesIO(zlib.decompress(dataa)) return np.load(out) def insertARow(self,Row,type): conn = sqlite3.connect("inspurer.db") # 建立數(shù)據(jù)庫(kù)連接 cur = conn.cursor() # 得到游標(biāo)對(duì)象 if type == 1: cur.execute("insert into worker_info (id,name,face_feature) values(?,?,?)", (Row[0],Row[1],self.adapt_array(Row[2]))) print("寫(xiě)人臉數(shù)據(jù)成功") if type == 2: cur.execute("insert into logcat (id,name,datetime,late) values(?,?,?,?)", (Row[0],Row[1],Row[2],Row[3])) print("寫(xiě)日志成功") pass cur.close() conn.commit() conn.close() pass def loadDataBase(self,type): conn = sqlite3.connect("inspurer.db") # 建立數(shù)據(jù)庫(kù)連接 cur = conn.cursor() # 得到游標(biāo)對(duì)象 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()
運(yùn)行結(jié)果如下:
以上是“python opencv怎么實(shí)現(xiàn)人臉識(shí)別考勤系統(tǒng)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。