婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > python opencv人臉識別考勤系統的完整源碼

python opencv人臉識別考勤系統的完整源碼

熱門標簽:幫人做地圖標注收費算詐騙嗎 悟空智電銷機器人6 蘇州電銷機器人十大排行榜 電信營業廳400電話申請 溫州旅游地圖標注 江蘇房產電銷機器人廠家 外呼不封號系統 遼寧400電話辦理多少錢 荊州云電銷機器人供應商

如需安裝運行環境或遠程調試,可加QQ905733049, 或QQ2945218359由專業技術人員遠程協助!

運行結果如下:

代碼如下:

import wx
import wx.grid
from time import localtime,strftime
import os
import io
import zlib
import dlib  # 人臉識別的庫dlib
import numpy as np  # 數據處理的庫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 預測器
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="員工考勤系統",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, "關閉日志")
        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):
        # 創建 cv2 攝像頭對象
        self.cap = cv2.VideoCapture(0)
        # cap.set(propId, value)
        # 設置視頻參數,propId設置的視頻參數,value設置的參數值
        # 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()
 
            # 每幀數據延時1ms,延時為0讀取的是靜態幀
            kk = cv2.waitKey(1)
            # 人臉數 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)
 
                # 獲取當前捕獲到的圖像的所有人臉的特征,存儲到 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):
                    # 將某張人臉與存儲的所有人臉數據進行比對
                    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]+" 的人臉數據已存在\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="請輸入您的的姓名,用于創建姓名文件夾",
                                           caption="溫馨提示",
                                      default_value="", parent=self.bmp)
 
            # 監測是否重名
            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+" 的人臉數據已成功存入\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='''您錯過了今天的簽到時間,請明天再來\n
        #     每天的簽到時間是: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+"]"
 
    #數據庫部分
    #初始化數據庫
    def initDatabase(self):
        conn = sqlite3.connect("inspurer.db")  #建立數據庫連接
        cur = conn.cursor()             #得到游標對象
        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()
        # 壓縮數據流
        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()
        # 解壓縮數據流
        out = io.BytesIO(zlib.decompress(dataa))
        return np.load(out)
 
    def insertARow(self,Row,type):
        conn = sqlite3.connect("inspurer.db")  # 建立數據庫連接
        cur = conn.cursor()  # 得到游標對象
        if type == 1:
            cur.execute("insert into worker_info (id,name,face_feature) values(?,?,?)",
                    (Row[0],Row[1],self.adapt_array(Row[2])))
            print("寫人臉數據成功")
        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")  # 建立數據庫連接
        cur = conn.cursor()  # 得到游標對象
 
        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()

運行結果如下:

C++學習參考實例

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

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

C++實現簡易五子棋游戲

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

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

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

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

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

標簽:宿遷 臺灣 喀什 濟南 三沙 黃山 景德鎮 欽州

巨人網絡通訊聲明:本文標題《python opencv人臉識別考勤系統的完整源碼》,本文關鍵詞  python,opencv,人臉,識別,考勤系統,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《python opencv人臉識別考勤系統的完整源碼》相關的同類信息!
  • 本頁收集關于python opencv人臉識別考勤系統的完整源碼的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲少妇屁股交4| 欧美色图天堂网| 国产伦理精品不卡| 91精品国产高清一区二区三区 | 欧美精品色一区二区三区| 中文一区在线播放| 国产一区二区剧情av在线| 精品久久人人做人人爱| 亚洲福中文字幕伊人影院| 一本在线高清不卡dvd| 一区二区三区四区精品在线视频| 99视频精品在线| 亚洲精品一区二区三区在线观看 | 欧美高清hd18日本| 日日摸夜夜添夜夜添精品视频| 色综合久久久久综合99| 一区二区激情小说| 666欧美在线视频| 国产精品77777| 国产日本欧洲亚洲| 蜜臀av性久久久久av蜜臀妖精| 国产一区二区日韩精品| 欧美日韩色综合| 裸体歌舞表演一区二区| 欧美一级日韩免费不卡| 国产一区二区免费视频| 欧美一区二区在线视频| 国产传媒日韩欧美成人| 国产精品国产自产拍在线| 日韩欧美第一区| 91网址在线看| 韩国欧美国产1区| 日韩专区在线视频| 国产精品国产三级国产三级人妇| 制服.丝袜.亚洲.中文.综合| 成人a级免费电影| 麻豆久久久久久| 亚洲大片在线观看| 亚洲国产成人91porn| 国产精品成人网| 国产精品免费视频网站| 亚洲国产高清不卡| 久久久不卡影院| 中文字幕精品—区二区四季| 久久蜜臀中文字幕| 久久中文字幕电影| 日韩欧美高清一区| 精品国产髙清在线看国产毛片| 欧美中文字幕久久| 日本特黄久久久高潮| 亚洲午夜久久久久中文字幕久| 欧美精品v日韩精品v韩国精品v| 欧美综合视频在线观看| 欧美日韩亚洲高清一区二区| 69堂精品视频| 国产精品看片你懂得| 亚洲一区二区三区在线看| 午夜久久久影院| 狠狠色狠狠色综合日日91app| 麻豆精品一区二区综合av| 国产乱码精品1区2区3区| 成人精品鲁一区一区二区| 91麻豆123| 日韩欧美一级精品久久| 国产精品国产三级国产a| 亚洲成人激情av| 成人av影院在线| 日韩欧美一级在线播放| 亚洲美女在线国产| 韩国女主播一区| 欧美日韩免费观看一区二区三区 | 免费成人你懂的| 国产大陆a不卡| 欧美一级免费观看| 一区二区三区四区亚洲| 国产福利一区二区三区在线视频| 国产一区二区三区四区五区美女 | 一区二区三区日韩在线观看| 日本不卡免费在线视频| 色婷婷综合在线| 国产精品嫩草久久久久| 国产精品996| 欧美tk—视频vk| 欧洲生活片亚洲生活在线观看| 欧美一区二区精美| 亚洲欧美日韩一区| 国产精品看片你懂得| 亚洲人成精品久久久久久| 中文字幕不卡一区| 国产专区欧美精品| 日韩免费视频一区二区| 精品一区二区三区av| 国产精品一区二区久久不卡| 日韩欧美激情四射| 亚洲美女视频在线观看| jizz一区二区| 亚洲影院免费观看| 欧美一级视频精品观看| 国产精品99久久久久久久vr | 国产精品毛片a∨一区二区三区| 日韩久久一区二区| 色一区在线观看| 美女诱惑一区二区| 日韩一区二区电影在线| 久久99久久精品| 91精品国产综合久久精品app| 成人欧美一区二区三区小说| 成人网男人的天堂| 五月天精品一区二区三区| 精品久久久久久无| 91在线云播放| 久久成人免费网站| 一区二区三区av电影| 国产精品热久久久久夜色精品三区 | 中文字幕一区二区三区四区不卡| 中文字幕精品三区| 色婷婷久久99综合精品jk白丝| 一个色在线综合| 国产日产欧美一区| 国产成人综合视频| 一区二区三区加勒比av| 国内精品视频一区二区三区八戒| 亚洲精品videosex极品| 欧美精品一区二区三区高清aⅴ| 国产精品嫩草99a| 成人免费视频一区| 国产成人自拍在线| 国产视频不卡一区| 国产乱码字幕精品高清av | 欧美性猛交xxxx乱大交退制版| 国产精品免费aⅴ片在线观看| 国产不卡视频在线播放| 日本最新不卡在线| 国产精一区二区三区| 亚洲国产另类av| 亚洲va韩国va欧美va精品| 国产精品久久久久久久久图文区| 亚洲伊人伊色伊影伊综合网| 丝袜亚洲另类丝袜在线| 午夜电影一区二区| 欧美xxxx老人做受| 成人av网站在线观看免费| 蜜桃精品视频在线| 亚洲日本va午夜在线电影| 91黄色激情网站| 亚洲国产一区二区三区青草影视| 亚洲gay无套男同| 中文字幕人成不卡一区| 寂寞少妇一区二区三区| 亚洲精品福利视频网站| 欧美一区二区三区人| 日韩精品一区在线| 国产一区二区久久| 一区二区三区在线影院| 九色|91porny| 91国模大尺度私拍在线视频| 亚洲444eee在线观看| 欧美午夜精品免费| 国产精品国产a级| 日本亚洲一区二区| 视频一区二区不卡| 日韩免费成人网| 亚洲第一主播视频| 国产精品精品国产色婷婷| 在线91免费看| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲一二三区不卡| 在线免费观看成人短视频| 久久99国内精品| 国内精品久久久久影院薰衣草 | 国产精品女主播av| 精品福利av导航| 一区二区不卡在线播放| 大白屁股一区二区视频| 日韩美女一区二区三区| 亚洲尤物在线视频观看| 日韩国产精品久久| 久久精品一区八戒影视| 国内精品国产成人国产三级粉色| 中文字幕精品一区二区精品绿巨人| 亚洲福利国产精品| 日韩片之四级片| 国产成人精品免费视频网站| 色婷婷综合五月| 精品国产乱码91久久久久久网站| 色猫猫国产区一区二在线视频| 香港成人在线视频| 欧美一区二区三区公司| 欧美日本在线视频| 97se亚洲国产综合自在线不卡| 精品中文av资源站在线观看| 欧美一区二区三区视频| 亚洲一区日韩精品中文字幕| 成人国产精品视频| 亚洲第一成年网| 国产精品午夜在线| 欧美精品第1页| 欧美日韩免费一区二区三区 | 中文字幕亚洲视频| 欧美精品粉嫩高潮一区二区|