主体思路:
将某一目录下的图片转化为数组,获取每张图片中人脸部分的数据保存到事先创建好的列表中,同时获取每张图片的ID,同样保存在事先创建好的列表中,最后将训练后的数据保存。
import cv2 as cv
import os
import sys
from PIL import Image
import numpy as np
def getImageAndLabels(path):
facesSamples = []
ids = []
# 将图片路径保存在imagePaths 列表里
# 先获取目录下图片名称再将名称与路径连接最后添加到imagePaths 列表里
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
print(imagePaths)
# 检测人脸
face_detector = cv.CascadeClassifier('E:/python/opencv/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/tran/'
# 获取图像数组和id标签组
faces, ids = getImageAndLabels(path)
# 获取循环对象
recoginzer = cv.face.LBPHFaceRecognizer_create()
recoginzer.train(faces,np.array(ids))
# 保存数据
recoginzer.write('./trainer/trainer.yml')