国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java項(xiàng)目分享 - 基于opencv、dilb的員工人臉識(shí)別考勤系統(tǒng)

這篇具有很好參考價(jià)值的文章主要介紹了java項(xiàng)目分享 - 基于opencv、dilb的員工人臉識(shí)別考勤系統(tǒng)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


0 項(xiàng)目說(shuō)明

基于opencv、dilb的員工人臉識(shí)別考勤系統(tǒng)

提示:適合用于課程設(shè)計(jì)或畢業(yè)設(shè)計(jì),工作量達(dá)標(biāo),源碼開(kāi)放


1 需求分析

選題“員工刷臉考勤”,要求采用python語(yǔ)言開(kāi)發(fā),可以通過(guò)攝像頭添加員工面部信息,這里就涉及到兩個(gè)具體的個(gè)問(wèn)題,一個(gè)是應(yīng)該以什么樣的數(shù)據(jù)來(lái)標(biāo)識(shí)每一個(gè)員工的面部信息,二是持久化地保存這些信息到數(shù)據(jù)庫(kù)中去。更細(xì)地,還涉及表的設(shè)計(jì);另一個(gè)基本要求是通過(guò)攝像頭識(shí)別員工面部信息來(lái)完成考勤,這個(gè)問(wèn)題基本可以通過(guò)遍歷數(shù)據(jù)庫(kù)里的員工面部數(shù)據(jù)與當(dāng)前攝像頭里的員工面部數(shù)據(jù)的比對(duì)來(lái)實(shí)現(xiàn),但有一個(gè)問(wèn)題就是假如攝像頭里有多張人臉改怎么處理。擴(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è)前來(lái)打卡的員工,這比較符合現(xiàn)實(shí)的使用場(chǎng)景。

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

考勤時(shí),須滿(mǎn)足三個(gè)條件:面部信息已錄入、在打卡時(shí)間段內(nèi)、未重復(fù)打卡,有打卡成功,打卡人姓名及工號(hào)、打卡日期及時(shí)間才會(huì)被當(dāng)成一行記錄保存到數(shù)據(jù)庫(kù)并在控制臺(tái)輸出打卡成功信息,否則會(huì)在控制臺(tái)輸出失敗及其原因信息。
總而言之:我們的設(shè)計(jì)目標(biāo)是規(guī)范化、人性化。

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

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

上述目標(biāo)二主要是一些限制性條件,可以通過(guò)添加判斷語(yǔ)句來(lái)實(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ù)庫(kù)里加載出來(lái)的id列表,如果id非法(已重復(fù)或者不在0~100000000,就會(huì)一直有新的彈窗來(lái)提示輸入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是距離屏幕最近的面部。

本次課設(shè)的完整過(guò)程如下:選了員工刷臉考勤系統(tǒng)以后,我和小組成員查閱了大量資料,了解到dlib這個(gè)庫(kù),于是我們利用dlib庫(kù)自帶的人臉預(yù)測(cè)器、特征提取器,然后計(jì)算128d特征來(lái)完成人臉識(shí)別,再加上我們之前構(gòu)想的邏輯,大致完成了課設(shè),由于完成得早,我們大致在課設(shè)安排時(shí)間的一半時(shí)就給老師檢查,雖然基本要求和拓展要求都已經(jīng)實(shí)現(xiàn),但是還有許多可以完善的地方,老師給出了許多寶貴的意見(jiàn):
(1)把數(shù)據(jù)保存的地方由csv文件改成數(shù)據(jù)庫(kù)。
(2)減少?gòu)棾鍪浇缑?,用frame替換的方式解決之。
(3)刷臉打卡的界面不需要打卡者交互,全自動(dòng)打卡。
最后檢查的時(shí)候這些問(wèn)題都被解決了。

程序框圖:
java opencv人臉識(shí)別考勤,java,python
本程序的設(shè)計(jì)思想大致可分為以下幾個(gè)方面
(1)面向?qū)ο蟮脑瓌t,整個(gè)程序的主體就是一個(gè)WAS(WorkAttendanceSystem)類(lèi),所有的實(shí)現(xiàn)都圍繞這個(gè)類(lèi)展開(kāi)。
(2)界面和數(shù)據(jù)邏輯分離的原則,WAS類(lèi)的初始化過(guò)程包括界面的初始化和數(shù)據(jù)初始化,兩者相互獨(dú)立。
(3)代碼封裝原則,多次調(diào)用的語(yǔ)句集寫(xiě)成接口供調(diào)用,沒(méi)有冗余的代碼。
接口隔離原則:使用多個(gè)專(zhuān)門(mén)的接口,而不是使用單一的總接口。

3 詳細(xì)設(shè)計(jì)

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

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

(2)def initMenu(self):
完成菜單的初始化顯示,點(diǎn)擊事件綁定。

(3)def initInfoText(self):
完成左邊信息提示面板的初始化顯示。

(4)def initGallery(self):
完成右邊主展示面板的初始化顯示。

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

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

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

(8)def adapt_array(self,arr):
將提取的人臉特征信息(列表)壓縮,入口參數(shù)就是待壓縮的數(shù)據(jù),出口參數(shù)是壓縮后的數(shù)據(jù),用于寫(xiě)入數(shù)據(jù)庫(kù)。

(9)def convert_array(self,text):
將讀取出來(lái)的數(shù)據(jù)解壓縮成人臉特征信息,入口參數(shù)是待解壓得數(shù)據(jù),出口參數(shù)是解壓后的數(shù)據(jù)。

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

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

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

函數(shù)調(diào)用關(guān)系:箭頭指向被調(diào)用者
java opencv人臉識(shí)別考勤,java,python

4 效果展示

java opencv人臉識(shí)別考勤,java,python
java opencv人臉識(shí)別考勤,java,python
java opencv人臉識(shí)別考勤,java,python
java opencv人臉識(shí)別考勤,java,python
java opencv人臉識(shí)別考勤,java,python

5 實(shí)驗(yàn)心得

遇到的問(wèn)題及解決辦法:

(1)opencv自帶的視頻窗口不支持太多的UI擴(kuò)展,怎么把視頻流嵌到自定義的界面上去是一個(gè)棘手的問(wèn)題,于是我想到了實(shí)現(xiàn)實(shí)時(shí)截圖,然后把圖片顯示到面板上去,這里有一個(gè)延時(shí)的問(wèn)題,opencv只允許整秒整秒地設(shè)置延時(shí)時(shí)間,設(shè)置成0s,程序會(huì)卡死,只好設(shè)置成1s,于是我們看到的‘視頻流’會(huì)有少許的延時(shí)和卡頓,后面看到opencv還有一個(gè)設(shè)置刷新率fps的接口,但是嘗試了也沒(méi)用,估計(jì)和延時(shí)有沖突,最最后面只好開(kāi)了一個(gè)子線(xiàn)程來(lái)做這些處理,防止主線(xiàn)程阻塞。

(2) 識(shí)別人臉的時(shí)候如果有多張人臉入境,最開(kāi)始我是只取所有識(shí)別到的人臉的第一張人臉,但是無(wú)法保證在許多時(shí)刻點(diǎn)都是同一個(gè)人臉,因此做了改進(jìn),取距離屏幕最近的人臉,具體做法是求最大的人臉面積,一般來(lái)說(shuō)距離屏幕越近面積越大。

(3)其他的大都是編寫(xiě)程序過(guò)程中遇到的問(wèn)題,比如什么中文設(shè)置問(wèn)題,變量沒(méi)有按照預(yù)期演化,這個(gè)時(shí)候,一般百度或者google,在csdn或者stackoverflow能找到解決辦法,或者在pycharm開(kāi)啟debug模式,追蹤變量等,在此不在贅述。

總而言之,此員工考勤系統(tǒng)最核心的就是人臉識(shí)別,在此我直接用的是python 第三方庫(kù)dlib自帶的人臉預(yù)測(cè)器、特征提取器,對(duì)于同一人多份特征的處理也僅僅是取平均臉而已,平均臉的缺點(diǎn)有
(1)受環(huán)境影響大,如果在光線(xiàn)弱的環(huán)境錄入人臉,在光線(xiàn)好的地方可能就會(huì)出現(xiàn)識(shí)別錯(cuò)誤,但是這個(gè)問(wèn)題可以用取光線(xiàn)弱和光線(xiàn)好的環(huán)境下的人臉取平均來(lái)解決,顯然比較麻煩。
(2)計(jì)算量比較大,每一條特征有128個(gè)數(shù)據(jù),10張截圖求平均就有1280次加法和128次除法。
而利用卷積神經(jīng)網(wǎng)絡(luò)來(lái)實(shí)現(xiàn)人臉識(shí)別可以有效地提高人臉識(shí)別準(zhǔn)確度,后續(xù)我將學(xué)習(xí)用卷積神經(jīng)網(wǎng)絡(luò)和聚類(lèi)來(lái)構(gòu)建訓(xùn)練模型。
比如模型訓(xùn)練階段
java opencv人臉識(shí)別考勤,java,python
其中神經(jīng)網(wǎng)絡(luò)部分:
java opencv人臉識(shí)別考勤,java,python
然后根據(jù)模型去識(shí)別人臉,最高識(shí)別準(zhǔn)確率可達(dá)99%以上。

6 項(xiàng)目源碼

#coding=utf-8
import wx
import wx.grid
import sqlite3
from time import localtime,strftime
import os
from skimage import io as iio
import io
import zlib
import dlib  # 人臉識(shí)別的庫(kù)dlib
import numpy as np  # 數(shù)據(jù)處理的庫(kù)numpy
import cv2  # 圖像處理的庫(kù)OpenCv
import _thread
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')
def return_euclidean_distance(feature_1, feature_2):
    feature_1 = np.array(feature_1)
    feature_2 = np.array(feature_2)
    dist = np.sqrt(np.sum(np.square(feature_1 - feature_2)))
    print("歐式距離: ", dist)
    if dist > 0.4:
        return "diff"
    else:
        return "same"
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 = "09: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.end_puncard = wx.MenuItem(puncardMenu,ID_END_PUNCARD,"結(jié)束簽到")
        self.end_puncard.SetBitmap(wx.Bitmap("drawable/end_puncard.png"))
        self.end_puncard.SetTextColour("SLATE BLUE")
        self.end_puncard.SetFont(menu_Font)
        self.end_puncard.Enable(False)
        puncardMenu.Append(self.end_puncard)
        logcatMenu = wx.Menu()
        self.open_logcat = wx.MenuItem(logcatMenu,ID_OPEN_LOGCAT,"打開(kāi)日志")
        self.open_logcat.SetBitmap(wx.Bitmap("drawable/open_logcat.png"))
        self.open_logcat.SetFont(menu_Font)
        self.open_logcat.SetTextColour("SLATE BLUE")
        logcatMenu.Append(self.open_logcat)
        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ù)浫?)
        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)
    def OnOpenLogcatClicked(self,event):
        self.loadDataBase(2)
        grid = wx.grid.Grid(self,pos=(320,0),size=(600,500))
        grid.CreateGrid(100, 4)
        for i in range(100):
            for j in range(4):
                grid.SetCellAlignment(i,j,wx.ALIGN_CENTER,wx.ALIGN_CENTER)
        grid.SetColLabelValue(0, "工號(hào)") #第一列標(biāo)簽
        grid.SetColLabelValue(1, "姓名")
        grid.SetColLabelValue(2, "打卡時(shí)間")
        grid.SetColLabelValue(3, "是否遲到")
        grid.SetColSize(0,100)
        grid.SetColSize(1,100)
        grid.SetColSize(2,150)
        grid.SetColSize(3,150)
        grid.SetCellTextColour("NAVY")
        for i,id in enumerate(self.logcat_id):
            grid.SetCellValue(i,0,str(id))
            grid.SetCellValue(i,1,self.logcat_name[i])
            grid.SetCellValue(i,2,self.logcat_datetime[i])
            grid.SetCellValue(i,3,self.logcat_late[i])
        pass
    def OnCloseLogcatClicked(self,event):
        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][biggest_face.left() + jj]
                    # cv2.imwrite(path_make_dir+self.name + "/img_face_" + str(self.sc_number) + ".jpg", im_blank)
                    # cap = cv2.VideoCapture("***.mp4")
                    # cap.set(cv2.CAP_PROP_POS_FRAMES, 2)
                    # ret, frame = cap.read()
                    # cv2.imwrite("我//h.jpg", frame)  # 該方法不成功
                    # 解決python3下使用cv2.imwrite存儲(chǔ)帶有中文路徑圖片
                    if len(self.name)>0:
                        cv2.imencode('.jpg', im_blank)[1].tofile(
                        PATH_FACE + self.name + "/img_face_" + str(self.pic_num) + ".jpg")  # 正確方法
                        self.pic_num += 1
                        print("寫(xiě)入本地:", str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg")
                        self.infoText.AppendText(self.getDateAndTime()+"圖片:"+str(PATH_FACE + self.name) + "/img_face_" + str(self.pic_num) + ".jpg保存成功\r\n")
                except:
                    print("保存照片異常,請(qǐng)對(duì)準(zhǔn)攝像頭")
                if  self.new_register.IsEnabled():
                    _thread.exit()
                if self.pic_num == 10:
                    self.OnFinishRegister()
                    _thread.exit()
    def OnNewRegisterClicked(self,event):
        self.new_register.Enable(False)
        self.finish_register.Enable(True)
        self.loadDataBase(1)
        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="警告")
        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

7 最后

項(xiàng)目分享:https://gitee.com/asoonis/feed-neo文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-796944.html

到了這里,關(guān)于java項(xiàng)目分享 - 基于opencv、dilb的員工人臉識(shí)別考勤系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【實(shí)戰(zhàn)項(xiàng)目】網(wǎng)絡(luò)編程:在Linux環(huán)境下基于opencv和socket的人臉識(shí)別系統(tǒng)--C++實(shí)現(xiàn)

    【實(shí)戰(zhàn)項(xiàng)目】網(wǎng)絡(luò)編程:在Linux環(huán)境下基于opencv和socket的人臉識(shí)別系統(tǒng)--C++實(shí)現(xiàn)

    這里我們會(huì)實(shí)現(xiàn)一個(gè)項(xiàng)目:在linux操作系統(tǒng)下基于OpenCV和Socket的人臉識(shí)別系統(tǒng)。 目錄 ??前言 ??一、項(xiàng)目介紹 ??二、項(xiàng)目分工 ??三、項(xiàng)目難題 ??四、實(shí)現(xiàn)細(xì)節(jié) ??4.1?關(guān)鍵程序 ??4.2?運(yùn)行結(jié)果 ??五、程序分析 ??5.1 wkcv.link ??5.2?客戶(hù)端client.cpp ??5.3?服務(wù)端server.cpp 項(xiàng)目

    2024年03月12日
    瀏覽(14)
  • 大數(shù)據(jù)畢設(shè)分享 圖像識(shí)別-人臉識(shí)別與疲勞檢測(cè) - python opencv

    大數(shù)據(jù)畢設(shè)分享 圖像識(shí)別-人臉識(shí)別與疲勞檢測(cè) - python opencv

    ?? 這兩年開(kāi)始畢業(yè)設(shè)計(jì)和畢業(yè)答辯的要求和難度不斷提升,傳統(tǒng)的畢設(shè)題目缺少創(chuàng)新和亮點(diǎn),往往達(dá)不到畢業(yè)答辯的要求,這兩年不斷有學(xué)弟學(xué)妹告訴學(xué)長(zhǎng)自己做的項(xiàng)目系統(tǒng)達(dá)不到老師的要求。 為了大家能夠順利以及最少的精力通過(guò)畢設(shè),學(xué)長(zhǎng)分享優(yōu)質(zhì)畢業(yè)設(shè)計(jì)項(xiàng)目,今天

    2024年03月12日
    瀏覽(24)
  • 使用opencv批量人臉識(shí)別+裁圖+設(shè)置分辨率(Python代碼分享)

    使用opencv批量人臉識(shí)別+裁圖+設(shè)置分辨率(Python代碼分享)

    最近做LoRA模型訓(xùn)練時(shí)需要對(duì)一批圖片進(jìn)行人臉識(shí)別,并進(jìn)行裁剪,然后設(shè)置特定的分辨率。 首先要導(dǎo)入cv庫(kù) import cv2 如果沒(méi)有opencv庫(kù)的話(huà)要用pip先安裝一個(gè) pip install opencv-python 1、識(shí)別出圖片面部,并截取原圖片靠近面部的最大正方形部位,同時(shí)將截取的圖片分辨率改為512*

    2024年02月12日
    瀏覽(28)
  • (項(xiàng)目筆記)opencv人臉識(shí)別

    (項(xiàng)目筆記)opencv人臉識(shí)別

    Haar級(jí)聯(lián): Haar特征:邊緣特征,線(xiàn)性特征,中心環(huán)繞特征,對(duì)角線(xiàn)特征 這些特征組合為特征模板,特征模板里有白色和黑色矩形,模板特征即為白色矩形像素和減去黑色矩形像素和。 Haar 特征的提取簡(jiǎn)單說(shuō)就是通過(guò)不斷改變模版的大小、位置和類(lèi)型,白色矩形區(qū)域像素和‘減

    2024年02月05日
    瀏覽(23)
  • 畢設(shè)項(xiàng)目分享 基于機(jī)器視覺(jué)opencv的手勢(shì)檢測(cè) 手勢(shì)識(shí)別 算法 - 深度學(xué)習(xí) 卷積神經(jīng)網(wǎng)絡(luò) opencv python

    畢設(shè)項(xiàng)目分享 基于機(jī)器視覺(jué)opencv的手勢(shì)檢測(cè) 手勢(shì)識(shí)別 算法 - 深度學(xué)習(xí) 卷積神經(jīng)網(wǎng)絡(luò) opencv python

    今天學(xué)長(zhǎng)向大家介紹一個(gè)機(jī)器視覺(jué)項(xiàng)目 基于機(jī)器視覺(jué)opencv的手勢(shì)檢測(cè) 手勢(shì)識(shí)別 算法 普通機(jī)器視覺(jué)手勢(shì)檢測(cè)的基本流程如下: 其中輪廓的提取,多邊形擬合曲線(xiàn)的求法,凸包集和凹陷集的求法都是采用opencv中自帶的函數(shù)。手勢(shì)數(shù)字的識(shí)別是利用凸包點(diǎn)以及凹陷點(diǎn)和手部中心

    2024年02月03日
    瀏覽(116)
  • OpenCV人臉識(shí)別項(xiàng)目(訓(xùn)練+測(cè)試)

    OpenCV人臉識(shí)別項(xiàng)目(訓(xùn)練+測(cè)試)

    圖片來(lái)自網(wǎng)上,如果侵權(quán),告知?jiǎng)t刪除 批量修改文件名(常見(jiàn)文件操作,可以學(xué)習(xí)一下) 進(jìn)入正題? (一)讀取圖片 (二)灰度轉(zhuǎn)換 (三)修改尺寸 (四)繪制矩形 (五)人臉檢測(cè) (六)檢測(cè)多個(gè)人臉 (七)視頻檢測(cè) ?(八)拍照保存 準(zhǔn)備數(shù)據(jù)集 訓(xùn)練集train ?注意:第

    2024年02月04日
    瀏覽(22)
  • 基于OpenCV提供的人臉識(shí)別算法LBPH實(shí)現(xiàn)人臉識(shí)別

    基于OpenCV提供的人臉識(shí)別算法LBPH實(shí)現(xiàn)人臉識(shí)別

    本文通過(guò)學(xué)習(xí)LBPH人臉識(shí)別算法,簡(jiǎn)要了解人臉識(shí)別技術(shù)的原理,實(shí)現(xiàn)人臉采集、訓(xùn)練人臉模型實(shí)現(xiàn)人臉識(shí)別。 OpenCV庫(kù)自帶的人臉級(jí)聯(lián)分級(jí)器具有很好的人臉檢測(cè)和人臉追蹤效果,它是一個(gè)基于Haar特征的Adaboost級(jí)聯(lián)分類(lèi)器。特別注意,OpenCV庫(kù)雖然自帶人臉級(jí)聯(lián)分級(jí)器,但是識(shí)

    2024年02月03日
    瀏覽(20)
  • 基于OpenCV的人臉識(shí)別

    目錄 ?? 前言 ???環(huán)境使用 ???模塊使用 ???模塊介紹 ???模塊安裝問(wèn)題: ???OpenCV 簡(jiǎn)介 ???安裝 OpenCV 模塊

    2024年02月02日
    瀏覽(22)
  • Java使用opencv實(shí)現(xiàn)人臉識(shí)別、人臉比對(duì)

    Java使用opencv實(shí)現(xiàn)人臉識(shí)別、人臉比對(duì)

    1. opencv概述 OpenCV是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù),它提供了一系列豐富的圖像處理和計(jì)算機(jī)視覺(jué)算法,包括圖像讀取、顯示、濾波、特征檢測(cè)、目標(biāo)跟蹤等功能。 opencv官網(wǎng):https://opencv.org/ opencv官網(wǎng)文檔:https://docs.opencv.org/4.7.0/index.html 參考教程1:https://www.w3cschool.cn/opencv/ 參考教

    2024年02月08日
    瀏覽(20)
  • 基于樹(shù)莓派opencv的人臉識(shí)別

    目錄 一、 實(shí)驗(yàn)?zāi)康?二、 攝像頭配置 1. 硬件安裝步驟 2. 軟件安裝步驟 三、 OpenCV安裝 1. OpenCV介紹 2. Python3上OpenCV安裝步驟 四、運(yùn)行人臉識(shí)別項(xiàng)目 1. 硬件準(zhǔn)備 2. 環(huán)境準(zhǔn)備 3. 程序代碼 (1)人臉數(shù)據(jù)收集 (2)訓(xùn)練識(shí)別器 (3)人臉識(shí)別 五、總結(jié) 要實(shí)現(xiàn)圖像識(shí)別,首先就是要獲取圖像

    2024年02月03日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包