真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何用Python代碼打造刷臉考勤系統(tǒng)

如何用Python代碼打造刷臉考勤系統(tǒng),針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供服務(wù)器托管機(jī)柜,高防服務(wù)器,成都IDC機(jī)房托管,成都主機(jī)托管等互聯(lián)網(wǎng)服務(wù)。

需求分析

“員工刷臉考勤”系統(tǒng),采用Python語言開發(fā),可以通過攝像頭添加員工面部信息,這里就涉及到兩個(gè)具體的個(gè)問題,一個(gè)是應(yīng)該以什么樣的數(shù)據(jù)來標(biāo)識(shí)每一個(gè)員工的面部信息,二是持久化地保存這些信息到數(shù)據(jù)庫中去。更細(xì)地,還涉及表的設(shè)計(jì);另一個(gè)基本要求是通過攝像頭識(shí)別員工面部信息來完成考勤,這個(gè)問題基本可以通過遍歷數(shù)據(jù)庫里的員工面部數(shù)據(jù)與當(dāng)前攝像頭里的員工面部數(shù)據(jù)的比對(duì)來實(shí)現(xiàn),但有一個(gè)問題就是假如攝像頭里有多張人臉改怎么處理。擴(kuò)展要求是導(dǎo)出每日的考勤表,可以拆分為兩個(gè)部分,一個(gè)是存儲(chǔ)考勤信息,一個(gè)是展示考勤信息。

我們希望達(dá)到的目標(biāo)是:

(1)仿照通用型軟件界面設(shè)計(jì)的原則,所有的操作都在菜單欄里實(shí)現(xiàn),一部分區(qū)域用于展示攝像頭實(shí)時(shí)讀取并由程序加工后的視頻流信息,另一部分區(qū)域做控制臺(tái)輸出,打印相關(guān)信息,比如提示員工面部信息添加成功、添加失敗及其原因,提示員工打卡成功、打卡失敗及其原因;添加面部信息時(shí)人是必須和程序進(jìn)行交互的,比如輸入一些相關(guān)的信息,這個(gè)時(shí)候程序是阻塞的;但是在打卡的時(shí)候,程序是不阻塞的,如果不點(diǎn)擊關(guān)閉打卡,它會(huì)一直在打卡的模式,等待并識(shí)別每一個(gè)前來打卡的員工,這比較符合現(xiàn)實(shí)的使用場(chǎng)景。

(2)建表來存儲(chǔ)員工信息和考勤信息,每次新建錄入員工面部信息時(shí),要求輸入工號(hào)、姓名,并查無重后方可錄入,錄入時(shí)只取距離屏幕最近的員工的面部信息,這是考慮到實(shí)際打卡都是依次進(jìn)行而不是一群人一群人地打卡,錄入時(shí)有兩種模式可供選擇,自動(dòng)模式:一旦識(shí)別到人臉就自動(dòng)捕獲截圖,連續(xù)截圖達(dá)到10張就結(jié)束錄入;手動(dòng)模式:點(diǎn)擊菜單結(jié)束錄入,不一定要得到10張。結(jié)束錄入后就開始從剛才捕獲的員工面部提取人臉特征數(shù)據(jù)并連同之前輸入的員工姓名等數(shù)據(jù)作為一行記錄保存到數(shù)據(jù)庫中,如果沒有捕獲到員工面部或者剛才捕獲的面部信息不是同一個(gè)人,這行記錄就被丟棄。

考勤時(shí),須滿足三個(gè)條件:面部信息已錄入、在打卡時(shí)間段內(nèi)、未重復(fù)打卡,只有打卡成功,打卡人姓名及工號(hào)、打卡日期及時(shí)間才會(huì)被當(dāng)成一行記錄保存到數(shù)據(jù)庫并在控制臺(tái)輸出打卡成功信息,否則會(huì)在控制臺(tái)輸出失敗及其原因信息。

總而言之:我們的設(shè)計(jì)目標(biāo)是規(guī)范化、人性化。

需要源碼可以關(guān)注、轉(zhuǎn)發(fā),私信小編“01”領(lǐng)取,還有免費(fèi)Python學(xué)習(xí)視頻資料贈(zèng)送。

如何用Python代碼打造刷臉考勤系統(tǒng)

總體設(shè)計(jì)

為了完成上述目標(biāo)一,程序的界面初始化分為三部分,***部分初始化菜單欄,第二部分初始化左邊控制臺(tái),第三部分初始化右邊展示面板,使這三部分相互獨(dú)立;數(shù)據(jù)邏輯部分的初始化分為兩部分,***部分是數(shù)據(jù)庫部分的初始化,如果數(shù)據(jù)庫/表不存在就新建,存在則加載相關(guān)數(shù)據(jù),第二部分是初始化一些需要循環(huán)使用的變量,比如新建錄入時(shí)的員工姓名、工號(hào)、截圖數(shù)目計(jì)數(shù)器等,每當(dāng)完成錄入時(shí)這些數(shù)據(jù)都應(yīng)該被重置成初始化以待下一次錄入,把這些初始化語句寫成一個(gè)函數(shù)可以提高代碼復(fù)用度。

上述目標(biāo)二主要是一些限制性條件,可以通過添加判斷語句來實(shí)現(xiàn),比如對(duì)輸入id的合法性檢驗(yàn):

while self.id == ID_WORKER_UNAVIABLE: self.id = wx.GetNumberFromUser(message="請(qǐng)輸入您的工號(hào)(-1不可用)",prompt="工號(hào)", caption="溫馨提示", value=ID_WORKER_UNAVIABLE, 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="警告")

其中ID_WORKER_UNAVIABLE是id的初始化值-1,不可用,self.knew.id是從數(shù)據(jù)庫里加載出來的id列表,如果id非法(已重復(fù)或者不在0~100000000,就會(huì)一直有新的彈窗來提示輸入id。

再比如對(duì)拒絕多張人臉時(shí)、只處理距離屏幕最近的員工的面部信息:

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

dets是偵測(cè)到的所有面部數(shù)組,biggest_face是距離屏幕最近的面部。

程序框圖:

如何用Python代碼打造刷臉考勤系統(tǒng)

注:圖片如看不清也可在線預(yù)覽

https://www.processon.com/view/link/5bbcc953e4b08faf8c7324a1

本程序的設(shè)計(jì)思想大致可分為以下幾個(gè)方面

  • 面向?qū)ο蟮脑瓌t,整個(gè)程序的主體就是一個(gè)WAS(WorkAttendanceSystem)類,所有的實(shí)現(xiàn)都圍繞這個(gè)類展開。

  • 界面和數(shù)據(jù)邏輯分離的原則,WAS類的初始化過程包括界面的初始化和數(shù)據(jù)初始化,兩者相互獨(dú)立。

  • 代碼封裝原則,多次調(diào)用的語句集寫成接口供調(diào)用,沒有冗余的代碼。

  • 接口隔離原則:使用多個(gè)專門的接口,而不是使用單一的總接口。

函數(shù)清單

注:所有類內(nèi)的函數(shù)的***個(gè)參數(shù)為self,表明該函數(shù)屬于該類,后面不再贅述

def __init__(self)

  • WAS類的構(gòu)造函數(shù),主要是完成一些初始化操作,如初始化菜單、信息打印面板、主展示面板以及初始化加載數(shù)據(jù)庫、初始化循環(huán)使用的變量。

def initMenu(self):

  • 完成菜單的初始化顯示,點(diǎn)擊事件綁定。

def initInfoText(self):

  • 完成左邊信息提示面板的初始化顯示。

def initGallery(self):

  • 完成右邊主展示面板的初始化顯示。

def initDatabase(self):

  • 數(shù)據(jù)庫的初始化,建立數(shù)據(jù)庫連接(如果數(shù)據(jù)庫inspurer.db不存在則先新建),如果數(shù)據(jù)庫中不存在員工信息worker_info和考勤logcat這兩個(gè)表,則依次創(chuàng)建。

def loadDataBase(self,type):

  • 該模塊函數(shù)完成從數(shù)據(jù)庫讀取數(shù)據(jù)的操作,包括讀取員工信息和考勤信息,第二個(gè)參數(shù)type用于標(biāo)識(shí)是加載員工信息還是考勤信息,一方面,可以統(tǒng)一接口,打開數(shù)據(jù)庫和得到游標(biāo)、關(guān)閉連接是一樣的,將兩個(gè)讀取接口合二為一,提高代碼復(fù)用度;另一方面,可以減少加載的工作量,減少IO,提高程序運(yùn)行速度;***,因?yàn)樽x取信息前對(duì)上一次讀取的信息列表做了清空處理,用type標(biāo)識(shí)可以避免讀取一個(gè)表時(shí)對(duì)另一個(gè)表造成的誤操作。

def insertARow(self,Row,type):

  • 該模塊函數(shù)完成寫數(shù)據(jù)庫操作,第二個(gè)參數(shù)為準(zhǔn)備寫的一條記錄,第三個(gè)參數(shù)type表示要對(duì)哪一個(gè)表進(jìn)行寫操作。

def adapt_array(self,arr):

  • 將提取的人臉特征信息(列表)壓縮,入口參數(shù)就是待壓縮的數(shù)據(jù),出口參數(shù)是壓縮后的數(shù)據(jù),用于寫入數(shù)據(jù)庫。

def convert_array(self,text):

  • 將讀取出來的數(shù)據(jù)解壓縮成人臉特征信息,入口參數(shù)是待解壓得數(shù)據(jù),出口參數(shù)是解壓后的數(shù)據(jù)。

def return_euclidean_distance(feature_1, feature_2):

  • 計(jì)算兩個(gè)人臉的歐式距離,入口參數(shù)是兩個(gè)人臉的特征數(shù)據(jù),出口參數(shù)是判定的結(jié)果,歐式距離大于0.4判為不同,不大于判為相同。

def OnNewRegisterClicked(self,event):

  • 見名知義,菜單新建錄入的監(jiān)聽事件,參數(shù)event為事件信息,其他幾個(gè)菜單的(OnFinishRegisterClicked,OnStartPunchCardClicked,  OnEndPunchCardClicked, OnOpenLogcatClicked,OnCloseLogcatClicked)類似,在此不再贅述。

def getDateAndTime(self):

  • 得到當(dāng)前日期和時(shí)間,并組裝成特定格式作為出口參數(shù)返回。

函數(shù)調(diào)用關(guān)系:箭頭指向被調(diào)用者

如何用Python代碼打造刷臉考勤系統(tǒng)

在線預(yù)覽地址:

https://www.processon.com/view/link/5bbe0b0de4b0534c9bfbecb4

程序運(yùn)行結(jié)果

程序主界面

如何用Python代碼打造刷臉考勤系統(tǒng)

新建錄入

如何用Python代碼打造刷臉考勤系統(tǒng)
如何用Python代碼打造刷臉考勤系統(tǒng)
如何用Python代碼打造刷臉考勤系統(tǒng)

我們看到,信息欄有人臉數(shù)據(jù)重復(fù)警告,本次錄入取消。

于是我們把數(shù)據(jù)庫數(shù)據(jù)刪了重來。

如何用Python代碼打造刷臉考勤系統(tǒng)

下面是打印的日志信息(為保證格式,復(fù)制到記事本中截的圖)

看到已經(jīng)錄入成功了。

開始打卡

如何用Python代碼打造刷臉考勤系統(tǒng)

提示信息打印如下

如何用Python代碼打造刷臉考勤系統(tǒng)

遲到與否的臨界時(shí)間是9:00

展示日志

如何用Python代碼打造刷臉考勤系統(tǒng)
如何用Python代碼打造刷臉考勤系統(tǒng)

只有已經(jīng)錄入且***次成功簽到才會(huì)寫進(jìn)到數(shù)據(jù)庫,無論遲到與否。

關(guān)于如何用Python代碼打造刷臉考勤系統(tǒng)問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。


本文題目:如何用Python代碼打造刷臉考勤系統(tǒng)
本文地址:http://weahome.cn/article/jsgjpg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部