好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁(yè) > 知識(shí)庫(kù) > python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼

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

熱門(mén)標(biāo)簽:幫人做地圖標(biāo)注收費(fèi)算詐騙嗎 悟空智電銷機(jī)器人6 蘇州電銷機(jī)器人十大排行榜 電信營(yíng)業(yè)廳400電話申請(qǐng) 溫州旅游地圖標(biāo)注 江蘇房產(chǎn)電銷機(jī)器人廠家 外呼不封號(hào)系統(tǒng) 遼寧400電話辦理多少錢(qián) 荊州云電銷機(jī)器人供應(yīng)商

如需安裝運(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  # 人臉識(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ù)浫?)
        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_hour6:
        #     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é)果如下:

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

使用C++ MFC編寫(xiě)一個(gè)簡(jiǎn)單的五子棋游戲程序

https://www.jb51.net/article/180940.htm

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

https://www.jb51.net/article/190548.htm

c++ 基于opencv 識(shí)別、定位二維碼

https://www.jb51.net/article/207158.htm

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

您可能感興趣的文章:
  • 詳解Python OpenCV數(shù)字識(shí)別案例
  • Python基于Opencv識(shí)別兩張相似圖片
  • python基于OpenCV模板匹配識(shí)別圖片中的數(shù)字
  • Python+Opencv實(shí)現(xiàn)數(shù)字識(shí)別的示例代碼
  • Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法
  • Opencv+Python識(shí)別PCB板圖片的步驟
  • python基于opencv實(shí)現(xiàn)人臉識(shí)別
  • python+opencv實(shí)現(xiàn)文字顏色識(shí)別與標(biāo)定功能

標(biāo)簽:宿遷 臺(tái)灣 喀什 濟(jì)南 三沙 黃山 景德鎮(zhèn) 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼》,本文關(guān)鍵詞  python,opencv,人臉,識(shí)別,考勤系統(tǒng),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于python opencv人臉識(shí)別考勤系統(tǒng)的完整源碼的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 伊人久久综合在合线亚洲| 亚洲第一网址| 色吊丝色吊丝色吊丝av| 把女人弄爽特黄a大片视频| 一级做性色a爰片久久毛片| 色戒在线观看电影| 91麻豆精品国产自产高清观看| 黄频45分钟| 黄色大片看看| 丁香六月色婷婷| 《交换:完美的邻居》3| 《性/生活3》未删减版| 沟厕一个接一个美女撒尿| 日b视频免费| 羞羞漫画阅读| 色妞永久免费视频| 91精品国产亚洲| 最新最好看免费毛片基地| 娇妻被五个教练戳破丝袜| 边摸边吃奶边做爽动作动态| 欧美性生交大片免费观看| 久久久久精品国产亚洲果冻| 久青草视频97国内免费影视| 欧美精产国品一二三产品动漫 | 美女调教踩踏vk| 乖?啊?嗯~出水了宝贝作文| 香蕉大伊伊视频在线观看| 欧美特级AAAAA片免费观看| h视频在线观看免费网站| 最好免费高清视频观看韩国| 过来我亲亲舒虞| 精品日韩一区二区三区AV动图 | 性姿势无遮挡的视频| 欧美伊香蕉久久综合类网站| 末发育女AV片一区二区在线观看 | 好看的mu子乱文| 网吧被黑人玩h文| 美女网站黄频| 高h乱一受多攻男男| 91偷拍初高中女厕撒尿| 附近50岁丰满的妇女|