基于cv的人脸识别
代码
import cv2 as cv import os import sys from PIL import Image import numpy as np #人脸检测函数 def face_detect(img): #图片转换为灰度图 gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #目标图片 转换模式 #加载人脸特征,级联分类器 face_detect=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #检测人脸,检测多个范围 faces = face_detect.detectMultiScale(gray_img) #参数检测目标 #循环遍历,绘制检测结果 for x,y,w,h in faces: #绘制矩形: 绘制目标,坐标,颜色,粗细 cv.rectangle(img,(x,y),(x+w,y+h),color=(255,0,0),thickness=2) #BGR #绘制圆形: cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=2) #显示图片 cv.imshow('image',img) def video_face_detect(path): #捕获视频每一帧 cap = cv.VideoCapture(path) while True: #当有内容flag为True,frame为每一帧图片 flag,frame = cap.read() #当没有帧数退出 if not flag: break #检测人脸 face_detect(frame) if ord('q')==cv.waitKey(10): break #传入训练集的文件夹并训练 def train_datas(path): #人脸样本容器 faceSample = [] #对应的id容器 ids = [] #遍历训练集的文件 imgPaths = [os.path.join(path,f) for f in os.listdir(path)] #加载级联分类器识别 face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #遍历图片列表 for imgPath in imgPaths: #将图片转换为灰度图 PIL_img = Image.open(imgPath).convert('L') #将图像转化为数组 img_numpy = np.array(PIL_img,'uint8') #获取每张图片的id ###切片路径 id = int(os.path.split(imgPath)[1].split('.')[0]) #将图片数据中的人脸部分提取 faces = face_detect.detectMultiScale(img_numpy) #循环切片 for x,y,w,h in faces: #人脸数据切片添加到容器 faceSample.append(img_numpy[y:y+h,x:x+w]) #获取id并添加到容器 ids.append(id) #返回人脸样本和id # return faceSample,ids #创建LBPH人脸训练器 recognizer = cv.face.LBPHFaceRecognizer_create() #识别器训练数据 recognizer.train(faceSample,np.array(ids)) #保存文件 recognizer.write('trainer.yml') #加载训练集并验证识别置信度 #path:训练集文件路径 #img : 识别的图片 def train_after_recognizer(path,imgPath): #加载训练集 recognizer = cv.face.LBPHFaceRecognizer_create() #读取训练集 recognizer.read('trainer.yml') #读取识别的图转换为灰度图 img = cv.imread(imgPath) gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #加载人脸特征集 face_detect=cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml') #多范围检测人脸 faces = face_detect.detectMultiScale(gray_img) #循环 for x,y,w,h in faces: #人脸检测 cv.rectangle(img,(x,y),(x+w,y+h),color=(0,255,0),thickness=2) #人脸识别,灰度图的人脸部分进行识别预测,返回id和置信度 id,confidence=recognizer.predict(gray_img[y:y+h,x:x+w]) #输出id和置信度 print("id:",id,"confidence:",confidence) cv.imshow('result',img) path = 'jm' # train_datas(path) # #人脸识别 video_face_detect('video.mp4') #清除缓存 # train_after_recognizer(path,'6.png') # cv.waitKey(0) cv.destroyAllWindows() cv.release()
M54

浙公网安备 33010602011771号