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

python opencv人臉識別考勤系統(tǒng)的完整源碼

 更新時(shí)間:2021年04月26日 11:59:29   作者:alicema1111  
這篇文章主要介紹了python opencv人臉識別考勤系統(tǒng)的完整源碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

如需安裝運(yùn)行環(huán)境或遠(yuǎn)程調(diào)試,可加QQ905733049, 或QQ2945218359由專業(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  # 人臉識別的庫dlib
import numpy as np  # 數(shù)據(jù)處理的庫numpy
import cv2  # 圖像處理的庫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ù)測器
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,"開始簽到")
        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,"&人臉錄入")
        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 攝像頭對象
        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()
            # 返回兩個值:
            #    一個布爾值true/false,用來判斷讀取視頻是否成功/是否到視頻末尾
            #    圖像對象,圖像的三維矩陣
            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)
 
            # 檢測到人臉
            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)前捕獲到的圖像的所有人臉的特征,存儲到 features_cap_arr
                shape = 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):
                    # 將某張人臉與存儲的所有人臉數(shù)據(jù)進(jìn)行比對
                    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]+" 的人臉數(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="工號已存在,請重新輸入", caption="警告")
 
        while self.name == '':
            self.name = wx.GetTextFromUser(message="請輸入您的的姓名,用于創(chuàng)建姓名文件夾",
                                           caption="溫馨提示",
                                      default_value="", parent=self.bmp)
 
            # 監(jiān)測是否重名
            for exsit_name in (os.listdir(PATH_FACE)):
                if self.name == exsit_name:
                    wx.MessageBox(message="姓名文件夾已存在,請重新輸入", 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("未在照片中識別到人臉")
            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+" 的人臉數(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='''您錯過了今天的簽到時(shí)間,請明天再來\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ù)庫部分
    #初始化數(shù)據(jù)庫
    def initDatabase(self):
        conn = sqlite3.connect("inspurer.db")  #建立數(shù)據(jù)庫連接
        cur = conn.cursor()             #得到游標(biāo)對象
        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ù)庫連接
        cur = conn.cursor()  # 得到游標(biāo)對象
        if type == 1:
            cur.execute("insert into worker_info (id,name,face_feature) values(?,?,?)",
                    (Row[0],Row[1],self.adapt_array(Row[2])))
            print("寫人臉數(shù)據(jù)成功")
        if type == 2:
            cur.execute("insert into logcat (id,name,datetime,late) values(?,?,?,?)",
                        (Row[0],Row[1],Row[2],Row[3]))
            print("寫日志成功")
            pass
        cur.close()
        conn.commit()
        conn.close()
        pass
 
    def loadDataBase(self,type):
 
        conn = sqlite3.connect("inspurer.db")  # 建立數(shù)據(jù)庫連接
        cur = conn.cursor()  # 得到游標(biāo)對象
 
        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é)果如下:

C++學(xué)習(xí)參考實(shí)例

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

http://www.dbjr.com.cn/article/180940.htm

C++實(shí)現(xiàn)簡易五子棋游戲

http://www.dbjr.com.cn/article/190548.htm

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

http://www.dbjr.com.cn/article/207158.htm

到此這篇關(guān)于python opencv人臉識別考勤系統(tǒng)的完整源碼的文章就介紹到這了,更多相關(guān)python 人臉識別考勤系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python?tkinter庫的Text記錄點(diǎn)擊路經(jīng)和刪除記錄詳情

    python?tkinter庫的Text記錄點(diǎn)擊路經(jīng)和刪除記錄詳情

    這篇文章主要介紹了python?tkinter庫的Text記錄點(diǎn)擊路經(jīng)和刪除記錄詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • Windows下Python的Django框架環(huán)境部署及應(yīng)用編寫入門

    Windows下Python的Django框架環(huán)境部署及應(yīng)用編寫入門

    這篇文章主要介紹了Windows下Python的Django框架環(huán)境部署及程序編寫入門,Django在Python的框架中算是一個重量級的MVC框架,本文將從程序部署開始講到hellow world web應(yīng)用的編寫,需要的朋友可以參考下
    2016-03-03
  • python BeautifulSoup庫的常用操作

    python BeautifulSoup庫的常用操作

    Beautiful Soup 是一個可以從HTML或XML文件中提取數(shù)據(jù)的Python庫,它能夠通過你喜歡的轉(zhuǎn)換器實(shí)現(xiàn)慣用的文檔導(dǎo)航,查詢,修改文檔的方式,本文就來給大家簡單介紹一下BeautifulSoup庫的常用操作,需要的朋友可以參考下
    2023-08-08
  • Python實(shí)現(xiàn)將DOC文檔轉(zhuǎn)換為PDF的方法

    Python實(shí)現(xiàn)將DOC文檔轉(zhuǎn)換為PDF的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)將DOC文檔轉(zhuǎn)換為PDF的方法,涉及Python調(diào)用系統(tǒng)win32com組件實(shí)現(xiàn)文件格式轉(zhuǎn)換的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • Python編程中time模塊的一些關(guān)鍵用法解析

    Python編程中time模塊的一些關(guān)鍵用法解析

    這篇文章主要介紹了Python編程中time模塊的一些關(guān)鍵用法解析,像mktime和localtime以及gmtime這些常用方法都有講到,需要的朋友可以參考下
    2016-01-01
  • Python 串口讀寫的實(shí)現(xiàn)方法

    Python 串口讀寫的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇Python 串口讀寫的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • python中reader的next用法

    python中reader的next用法

    這篇文章主要介紹了python中reader的next用法,分別介紹了python3中的用法和python2中的用法,具體實(shí)例代碼大家參考下本文
    2018-07-07
  • Python getopt模塊處理命令行選項(xiàng)實(shí)例

    Python getopt模塊處理命令行選項(xiàng)實(shí)例

    這篇文章主要介紹了Python getopt模塊處理命令行選項(xiàng)實(shí)例,本文講解相對簡單,需要的朋友可以參考下
    2014-05-05
  • Python合并列表、字典、字符串、CSV文件、多文件技巧

    Python合并列表、字典、字符串、CSV文件、多文件技巧

    在 Python 中,有多種方法可以實(shí)現(xiàn)數(shù)據(jù)合并,無論是合并列表、合并字典、合并字符串、合并CSV文件還是合并多個文件夾中的文件,都可以使用簡單而強(qiáng)大的Python技巧來實(shí)現(xiàn),通過合并數(shù)據(jù),可以更方便地進(jìn)行數(shù)據(jù)處理和分析
    2024-03-03
  • Python基于wordcloud及jieba實(shí)現(xiàn)中國地圖詞云圖

    Python基于wordcloud及jieba實(shí)現(xiàn)中國地圖詞云圖

    這篇文章主要介紹了Python基于wordcloud及jieba實(shí)現(xiàn)中國地圖詞云圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評論