python opencv 얼굴 인식 출근 시스템 의 전체 소스 코드
실행 결 과 는 다음 과 같 습 니 다.
코드 는 다음 과 같 습 니 다:
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
")
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
")
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=''' ,
# :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 인식,포 지 셔 닝 QR 코드 기반
https://www.jb51.net/article/207158.htm
python opencv 얼굴 인식 출근 시스템 의 전체 소스 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 얼굴 인식 출근 시스템 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.