人脸识别项目代码
人脸识别项目代码
·
项目代码
1.拍照程序
import cv2 #摄像头 cap = cv2.VideoCapture(0) falg = 1 num = 1 #拍照程序,按下键盘的s进行照片保存,图片默认保存名称是id.huang.jpg # 检测是否在开启状态 while(cap.isOpened()): # 得到每帧图像 ret_flag, Vshow = cap.read() cv2.imshow("Capture_Test", Vshow)# 显示图像 k = cv2.waitKey(1) & 0xFF# 按键判断 if k == ord('s'):# 键盘按下s键即保存 #里面的huang代表姓名,可自行修改 cv2.imwrite(str(num)+".huang"+".jpg", Vshow) print("success to save"+str(num)+".jpg") print("-------------------") num += 1 elif k == ord(' '):#退出 break # 释放摄像头 cap.release() # 释放内存 cv2.destroyAllWindows()
2.录制视频程序
# -*-coding:utf-8-*- import datetime import time import cv2 import os cam = cv2.VideoCapture(0) time_now = time.time() os.makedirs('capture', exist_ok=True) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') video_out = None #录制视频程序:每10秒自动录制一个10秒左右的视频,视频格式.mp4,mp4的文件名称格式为时间搓.mp4 while True: ret, frame = cam.read() if video_out: video_out.write(frame) cv2.imshow("Video", frame) cv2.waitKey(1) if video_out is None or time.time() - time_now > 10: if video_out: print("save", video_path) video_out.release() video_out = None time_str = datetime.datetime.now().strftime('%Y%m%d%H%M%S') video_path = time_str + '.mp4' video_out = cv2.VideoWriter(video_path, fourcc, 30.0, (640, 480)) time_now = time.time()
3.人脸数据录入程序
import os import cv2 import sys from PIL import Image import numpy as np #函数功能:通过LBPHF识别器把面部和身份信息绑定 def getImageAndLabels(path): #保存人脸特征数据的数组 facesSamples=[] #存储人的基本信息,id和name ids=[] #储存图片信息 imagePaths=[os.path.join(path,f) for f in os.listdir(path)] #加载分类器检测人脸 face_detector = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') #打印数组imagePaths print('数据排列:',imagePaths) #将保存的全部图片一一进行遍历将身份信息一一保存起来 for imagePath in imagePaths: #打开图片,PIL的L打开方式指明图片是灰度图像,每一个像素点从0到255的信息保存在PIL_img PIL_img=Image.open(imagePath).convert('L') #将转换为灰度数的图片向量化,转成能让计算机读懂,将每一个像素点变成一个数值,保存在 img_numpy img_numpy=np.array(PIL_img, 'uint8') #通过face_detector人脸检测分类器获取图片人脸特征到数组face里面 faces = face_detector.detectMultiScale(img_numpy) #通过图片的文件名获取身份信息,包括id和name id = int(os.path.split(imagePath)[1].split('.')[0]) #将id,name和 for x,y,w,h in faces: ids.append(id) facesSamples.append(img_numpy[y:y+h,x:x+w]) #打印脸部特征和id print('fs:', facesSamples) print('id:', id) # print('fs:', facesSamples[id]) print('fs:', facesSamples) print('脸部例子:',facesSamples[0]) print('身份信息:',ids[0]) return facesSamples,ids #人的面部信息保存在data/jm文件下的图片,身份信息是文件名称 #程序3功能:将人的面部信息和人的身份信息进行一一绑定,生成trainer/trainer.yml文件 if __name__ == '__main__': path='./data/jm/' #获取图像数组和id标签数组和姓名 faces,ids=getImageAndLabels(path) #通过加载LBPHF识别器把面部和身份信息通过训练整合在一起 recognizer=cv2.face.LBPHFaceRecognizer_create() recognizer.train(faces, np.array(ids)) #将最后整合的信息保存到一个yml文件里 recognizer.write('trainer/trainer.yml') 4.测试程序
import cv2 import os #加载训练数据集文件 recogizer=cv2.face.LBPHFaceRecognizer_create() recogizer.read('trainer/trainer.yml') #保存身份信息的名字 names=[] warningtime = 0 #准备识别的图片 def face_detect_demo(img): gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将导入的图片灰度化 face_detector=cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml') #画个框 face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300)) for x,y,w,h in face: cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2) cv2.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1) # 人脸识别评分,如果分比较高说明不可信,warningtime变量+1 #当warningtime变量加到一定程度人认为不是我们所录入的人员 ids, confidence = recogizer.predict(gray[y:y + h, x:x + w]) if confidence > 80: global warningtime warningtime += 1 if warningtime > 100: warningtime = 0 #不是录入人员在输出视频中显示unKonw cv2.putText(img, 'unkonw', (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1) else: #检测到为录入人员,在视频中显示录入人员的姓名 cv2.putText(img,str(names[ids-1]), (x + 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1) cv2.imshow('result',img) def name(): path = './data/jm/' imagePaths=[os.path.join(path,f) for f in os.listdir(path)] for imagePath in imagePaths: name = str(os.path.split(imagePath)[1].split('.',2)[1]) names.append(name) #读入根目录下的1.mp4文件进行人脸录入 cap=cv2.VideoCapture('1.mp4') name() while True: flag,frame=cap.read() if not flag: break face_detect_demo(frame) if ord(' ') == cv2.waitKey(10): break cv2.destroyAllWindows() cap.release()
更多推荐
已为社区贡献1条内容
所有评论(0)