人脸识别系统实现

it2023-12-03  65

#1,导入库 import cv2 import numpy as np import face_recognition #2,加载图片 liu=cv2.imread('liu.jpg') wang=cv2.imread('wang.jpg') #3,BGR转为RGB liu_RGB=liu[:,:,::-1] wang_RGB=wang[:,:,::-1] #4,检测人脸 liu_face=face_recognition.face_locations(liu_RGB) wang_face=face_recognition.face_locations(wang_RGB) #5,人脸特征编码 liu_encoding=face_recognition.face_encodings(liu_RGB,liu_face)[0] wang_encoding=face_recognition.face_encodings(wang_RGB,wang_face)[0] #6,把所有脸放在一起,当作数据库 encodings=[liu_encoding,wang_encoding] names=['liu','wang'] #7,打开摄像头,读取视频流 cap=cv2.VideoCapture(0) if not cap.isOpened(): raise IOError("Camera Error!") while True: ret,frame=cap.read() frame=cv2.resize(frame,(0,0),fx=0.5,fy=0.5) #8,BGR转为RGB frame_RGB=frame[:,:,::-1] #9,人脸检测 face_locations=face_recognition.face_locations(frame_RGB) #10,人脸特征编码 face_encodings=face_recognition.face_encodings(frame_RGB,face_locations) #11,与数据库中的人脸进行匹配 for (top,right,bottom,left),face_encoding in zip(face_locations,face_encodings): #12,进行匹配 matches=face_recognition.compare_faces(encodings,face_encoding) #13,计算距离 distances=face_recognition.face_distance(encodings,face_encoding) min_distance_index=np.argmin(distances) #14,判断:如果匹配,获取名字 name="unknown" if matches[min_distance_index]: name=names[min_distance_index] #15,绘制人脸矩形框 cv2.rectangle(frame,(left,top),(right,bottom),(0,255,0),3) #16,绘制,显示对应人脸的名字 cv2.rectangle(frame,(left,bottom-30),(right,bottom),(0,0,255),3) #17,显示名字 cv2.putText(frame,name,(left+10,bottom-10),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),1) #18,显示整个效果 cv2.imshow('face recognition',frame) #19,判断Q,退出 if cv2.waitKey(1)&0xFF==ord('q'): break #20,关闭资源 cap.release() cv2.destroyAllWindows() import face_recognition import os import cv2 from PIL import Image,ImageDraw,ImageFont import numpy as np #解析已有人员的所有照片名和人物面部编码信息 def load_img(path): print('正在加载已知人员的图片。。。。') for dirpath,dirnames,filenames in os.walk(path): print(dirpath,dirnames,filenames) facelib=[] for filename in filenames: filepath=os.sep.join([dirpath,filename]) #把对应每张图像加载进来 face_image=face_recognition.load_image_file(filepath) face_encoding=face_recognition.face_encodings(face_image)[0] facelib.append(face_encoding) return facelib,filenames facelib,facenames=load_img(r'D:\temp\faces') #调用摄像头 video_capture=cv2.VideoCapture(0) while True: ret,frame=video_capture.read() #通过缩小图片(缩小为1/4),提高对比效率) if frame is not None: small_frame=cv2.resize(frame,(0,0),fx=0.25,fy=0.25) rgb_small_frame=small_frame[:,:,::-1] #将opencv的BGR格式转化为RGB格式 face_locations=face_recognition.face_locations(rgb_small_frame) face_encodings=face_recognition.face_encodings(rgb_small_frame,face_locations) face_names=[] #循环多张脸 for face_encoding in face_encodings: matches=face_recognition.compare_faces(facelib,face_encoding,tolerance=0.39) name='未知头像' if True in matches: #如果摄像头里面的头像匹配了已知人物头像,则取出第一个True的位置 first_match_index=matches.index(True) name=facenames[first_match_index][:-4] #取出文件上对应的人名 face_names.append(name) for (top,right,bottom,left),name in zip(face_locations,face_names): #还原图片大小 top *=4 right *=4 bottom *=4 left *=4 cv2.rectangle(frame,(left,top),(right,bottom),(0,0,225),2) #标注人脸信息 img_PIL=Image.fromarray(cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)) font=ImageFont.truetype('simhei.ttf',40) draw=ImageDraw.Draw(img_PIL) draw.text((left+6,bottom-6),name,font=font,fill=(255,255,255)) frame=cv2.cvtColor(np.asarray(img_PIL),cv2.COLOR_RGB2BGR) cv2.imshow('Video',frame) if cv2.waitKey(1)&0xFF==ord('q'): break video_capture.release()
最新回复(0)