欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

500行Python代碼打造刷臉考勤系統(tǒng)

 更新時間:2019年06月03日 10:58:03   作者:IT世界圈  
本文給大家分享通過500行Python代碼打造刷臉考勤系統(tǒng),代碼超級簡單,感興趣的朋友跟隨小編一起看看吧

需求分析

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

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

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

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

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

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

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

總體設(shè)計

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

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

while self.id == ID_WORKER_UNAVIABLE: 
self.id = wx.GetNumberFromUser(message="請輸入您的工號(-1不可用)",prompt="工號", 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="工號已存在,請重新輸入", caption="警告") 

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

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

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是偵測到的所有面部數(shù)組,biggest_face是距離屏幕最近的面部。

程序框圖:

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

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

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

面向?qū)ο蟮脑瓌t,整個程序的主體就是一個WAS(WorkAttendanceSystem)類,所有的實現(xiàn)都圍繞這個類展開。 界面和數(shù)據(jù)邏輯分離的原則,WAS類的初始化過程包括界面的初始化和數(shù)據(jù)初始化,兩者相互獨立。 代碼封裝原則,多次調(diào)用的語句集寫成接口供調(diào)用,沒有冗余的代碼。 接口隔離原則:使用多個專門的接口,而不是使用單一的總接口。 函數(shù)清單

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

def __init__(self)

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

def initMenu(self):

完成菜單的初始化顯示,點擊事件綁定。

def initInfoText(self):

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

def initGallery(self):

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

def initDatabase(self):

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

def loadDataBase(self,type):

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

def insertARow(self,Row,type):

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

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):

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

def OnNewRegisterClicked(self,event):

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

def getDateAndTime(self):

得到當(dāng)前日期和時間,并組裝成特定格式作為出口參數(shù)返回。 函數(shù)調(diào)用關(guān)系:箭頭指向被調(diào)用者

在線預(yù)覽地址:

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

程序運行結(jié)果 程序主界面

新建錄入

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

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

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

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

開始打卡

提示信息打印如下

遲到與否的臨界時間是9:00

展示日志

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

總結(jié)

以上所述是小編給大家介紹的500行Python代碼打造刷臉考勤系統(tǒng),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Python dict字典基本操作(添加、修改、刪除鍵值對)

    Python dict字典基本操作(添加、修改、刪除鍵值對)

    本文主要介紹了Python dict字典基本操作,主要包括字典添加、修改、刪除鍵值對等,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • python3中celery異步框架簡單使用+守護進程方式啟動

    python3中celery異步框架簡單使用+守護進程方式啟動

    這篇文章主要介紹了python3中celery異步框架簡單使用+守護進程方式啟動,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 使用scrapy ImagesPipeline爬取圖片資源的示例代碼

    使用scrapy ImagesPipeline爬取圖片資源的示例代碼

    這篇文章主要介紹了使用scrapy ImagesPipeline爬取圖片資源的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Python使用Selenium實現(xiàn)瀏覽器打印預(yù)覽功能

    Python使用Selenium實現(xiàn)瀏覽器打印預(yù)覽功能

    在Web開發(fā)中,打印預(yù)覽是一個常見的功能需求,通過打印預(yù)覽,我們可以預(yù)覽和調(diào)整網(wǎng)頁的打印布局、樣式和內(nèi)容,Python的Selenium庫是一個強大的工具,可以自動化瀏覽器操作,包括打印預(yù)覽,本文將介紹如何使用Python Selenium庫來實現(xiàn)瀏覽器的打印預(yù)覽功能
    2023-11-11
  • django有外鍵關(guān)系的兩張表如何相互查找

    django有外鍵關(guān)系的兩張表如何相互查找

    這篇文章主要介紹了django有外鍵關(guān)系的兩張表如何相互查找,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • python在協(xié)程中增加任務(wù)實例操作

    python在協(xié)程中增加任務(wù)實例操作

    在本篇文章里小編給大家整理的是一篇關(guān)于python在協(xié)程中增加任務(wù)實例操作內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • 使用Python操作文件系統(tǒng)的方法

    使用Python操作文件系統(tǒng)的方法

    Python提供了許多內(nèi)置庫來處理文件系統(tǒng),如os、shutil和pathlib等,這些庫可以幫助你創(chuàng)建、刪除、讀取、寫入文件和目錄,這篇文章主要介紹了使用Python操作文件系統(tǒng),需要的朋友可以參考下
    2023-07-07
  • python基于Selenium的web自動化框架

    python基于Selenium的web自動化框架

    這篇文章主要介紹了python基于Selenium的web自動化框架,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python3.9和pycharm的安裝教程并創(chuàng)建簡單項目的步驟

    python3.9和pycharm的安裝教程并創(chuàng)建簡單項目的步驟

    這篇文章主要介紹了python3.9和pycharm的安裝教程并創(chuàng)建簡單項目的步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • python爬蟲教程之bs4解析和xpath解析詳解

    python爬蟲教程之bs4解析和xpath解析詳解

    這篇文章主要給大家介紹了關(guān)于python爬蟲教程之bs4解析和xpath解析的相關(guān)資料,bs4、xpath比較容易上手但是功能有限,正則比較晦澀難懂但是功能超級強大,需要的朋友可以參考下
    2022-02-02

最新評論