感谢优秀的你打开了小白的文章
“希望在看文章的你今天又进步了一点点,离美好生活更近一步!”
灰度转换 | 人脸识别基础-灰度转换与修改图片尺寸_am_student的博客-CSDN博客 |
矩形圆形的绘制 | 人脸识别-矩形圆形的绘制_am_student的博客-CSDN博客 |
Hrr级联 | 人脸识别-Haar级联_am_student的博客-CSDN博客 |
多张人脸检测 |
目录
前言:
人脸检测是 OpenCV 重要的一个功能,它是人脸识别的基础。人脸识别其实就是一个程序能识别给定图像或视频中的人脸。实现这一目标的方法之一是用一系列分好类的图像来“训练”程序,并基于这些图像来进行识别。 这就是 OpenCV 及其人脸识别模块进行人脸识别的过程。 人脸识别模块的另外一个重要特征是:每个识别都具有转置信(confidence)评分,因此可在实际应用中通过对其设置阈值来进行筛选。
有了数据,需要将这些样本图像加载到人脸识别算法中。所有的人脸识别算法在它们的 train()函数中都有两个参数:图像数组和标签数组。这些标签表示进行识别时候某人人脸的 ID,因此根据 ID 可以知道被识别的人是谁。要做到这一点,将在「trainer/」目录中保存为.yml 文件。
代码展示
import os
import cv2
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f) for f in os.listdir(path)]
#检测人脸
face_detector = cv2.CascadeClassifier(
'C:/Users/ZXY13/Desktop/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml')
#遍历列表中的图片
for imagePath in imagePaths:
#打开图片
PIL_img=Image.open(imagePath).convert('L')
#将图像转换为数组
img_numpy=np.array(PIL_img,'uint8')
faces = face_detector.detectMultiScale(img_numpy)
#获取每张图片的id
id=int(os.path.split(imagePath)[1].split('.')[0])
for x,y,w,h in faces:
facesSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return facesSamples,ids
if __name__ == '__main__':
#图片路径
path='./data/jm/'
#获取图像数组和id标签数组
faces,ids=getImageAndLabels(path)
#获取训练对象
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids))
#保存文件
recognizer.write('trainer/trainer.yml')
注:data文件可从链接中获取:
https://pan.baidu.com/s/1PSZIooRVKdv9AvB4b-ddFQ
提取码:6666
相关解释
os.listdir(path):为了获取该路径的所有文件。
img_numpy=np.array(PIL_img,'uint8'):将图像转化为数组。
faces = face_detector.detectMultiScale(img_numpy):获取到人脸的数据。
recognizer=cv2.face.LBPHFaceRecognizer_create()
recognizer.train(faces,np.array(ids)):调用train进行训练获取的是图像数组和id标签数组。
得到结果:
可以关注公众号获取本项目具体代码,欢迎关注,一起学习!