基于opencv的人脸识别打卡系统
可以自己写入注册人脸,然后进行打卡等等
import cv2
import time
import dlib
import csv
import numpy as np
class face_system():
def __init__(self):
self.identify = dlib.get_frontal_face_detector()
self.shape_detector = dlib.shape_predictor ("D:\PYTHON\opencv\dlib\shape_predictor_68_face_landmarks.dat")
self.face_inf = dlib.face_recognition_model_v1 ("D:\PYTHON\opencv\dlib\dlib_face_recognition_resnet_model_v1.dat")
#加载人脸识别器
def face_identify(self,frame):
face_id = self.identify(frame,1)
face_xy = []
for face in face_id:
x,y,w,h =face.left(),face.top(),face.right(),face.bottom()
# cv2.rectangle(frame,(x,y),(w,h),(200,0,190),1)
return frame,face
#获取64个点位信息
def shape_inf(self,frame,face):
shape_f = self.shape_detector(frame,face)
for piont in shape_f.parts():
cv2.circle (frame, (piont.x, piont.y), 1, (0, 200, 0), -1)
return frame,shape_f
#写入csv文件
def csv_w(self,frame,shape_f,name):
#解析64个点
inf = self.face_inf.compute_face_descriptor(frame,shape_f)
#转化成列表
face_infor = [f for f in inf]
line=[name,face_infor]
if ord('y') == cv2.waitKey(1):
with open(r'D:\PYTHON\shizhanxiangmu\Face recognition system\facedate.csv','a',newline='') as f:
csv_write = csv.writer(f)
csv_write.writerow(line)
print(f'{name}读取成功')
#读取csv文件
def csv_r(self):
name_list=[]
feature_list = None
with open(r'D:\PYTHON\shizhanxiangmu\Face recognition system\facedate.csv','r') as f:
csv_read = csv.reader(f)
for line in csv_read:
name_id = line[0]
name_list.append(name_id)
#变换成二维
predit = eval(line[1])
predit = np.asarray(predit,dtype=np.float64)
predit = np.reshape(predit,(1,-1))
if feature_list is None:
feature_list =predit
else:
feature_list=np.concatenate((feature_list,predit),axis=0)
return name_list,feature_list
#人脸信息对比,记录打卡时间
def contrast(self,frame,shape_f,confid=0.5):
facess = face_system()
name_list, feature_list = facess.csv_r ( )
with open (r'D:\PYTHON\shizhanxiangmu\Face recognition system\a.csv', 'a', newline='') as f:
csv_write = csv.writer (f)
recog={}
inf = self.face_inf.compute_face_descriptor (frame, shape_f)
# 转化成列表
face_infor = [f for f in inf]
#计算与库的距离
shape = np.asarray(face_infor,dtype=np.float64)
distance = np.linalg.norm((shape-feature_list),axis=1)
# 找到最小值
min_indel = np.argmin(distance)
min_distance= distance[min_indel]
now = time.time()
need = False
if min_distance < confid:
predit_name= name_list[min_indel]
if predit_name in recog:
if now - recog[predit_name] > 10:
need = True
recog[predit_name] = now
else:
need = False
print('时间未到')
pass
else:
need = True
recog[predit_name] = now
if need is True:
time_local = time.localtime(recog[predit_name])
time_now = time.strftime('%Y-%m-%d %H:%M:%S',time_local)
print(time_now)
lines = [predit_name,time_now]
with open(r'D:\PYTHON\shizhanxiangmu\Face recognition system\timetime.csv','a',newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(lines)
print(f'{predit_name}打卡成功{time_now}')
else:
print('未匹配')
def main(r,t):
cap = cv2.VideoCapture (0)
face_detetor = face_system()
pTime=0
w=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
h = int (cap.get (cv2.CAP_PROP_FRAME_HEIGHT))
while True:
ret, frame = cap.read()
frame = cv2.resize(frame,(w//2,h//2))
frame = cv2.flip(frame,1)
#各类服务加载(人脸识别,64个点提取,人脸特征提取写入,比对信息,记录打卡时间)
if face_detetor.face_identify(frame):
frame , face = (face_detetor.face_identify (frame))
frame , shape_f = face_detetor.shape_inf(frame,face)
if r>0:
face_detetor.csv_w(frame,shape_f,name='abc')
else:
pass
if t>0:
face_detetor.contrast (frame,shape_f)
else:
pass
cTime = time.time ( )
fps = 1 / (cTime - pTime) # 计算fps
pTime = cTime # 更新下一帧图像处理的起始时间
# 把fps值显示在图像上,img画板;fps变成字符串;显示的位置;设置字体;字体大小;字体颜色;线条粗细
cv2.putText (frame, 'FPS:' + str (int (fps)), (10, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 255, 0), 1)
frame = cv2.resize(frame,(700,500))
cv2.imshow ('frame', frame)
if ord ('q') == cv2.waitKey (1):
break
cap.release ( )
cv2.destroyAllWindows()
if __name__ =='__main__':
r=int(input('注册请输入1否则为0-(按下y键写入数据):'))
t=int(input('打卡请输入1否则为0:'))
main(r,t)