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

 

posted @ 2023-01-13 11:07  Crown-V  阅读(85)  评论(0)    收藏  举报