opencv人脸识别系统(可以记录打卡时间功能)

基于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)


猜你喜欢

转载自blog.csdn.net/qq_54575112/article/details/128679200