学习使用自带的分类器找出人脸,在有训练数据的情况下进行识别人脸
教程链接https://blog.csdn.net/beyond9305/article/details/93724948
import cv2 as cvfilename = "D:\\New_desktop\\timg.png"face_cascade = cv.CascadeClassifier('D:\\mypython\\workspace\\opencv-master\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_default.xml')img = cv.imread(filename)gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)cv.imshow('Vikings Detected', gray)faces = face_cascade.detectMultiScale(gray, 1.3, 5)#分类器识别出来的人脸for (x, y, w, h) in faces:img = cv.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)cv.namedWindow('Vikings Detected')cv.imshow('Vikings Detected', img)cv.waitKey(0)

# # -*- coding:utf-8 -*-import cv2import osimport numpy as np# 检测人脸def detect_face(img):# 将测试图像转换为灰度图像,因为opencv人脸检测器需要灰度图像gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 加载OpenCV人脸检测分类器Haarface_cascade = cv2.CascadeClassifier('D:\\mypython\\workspace\\opencv-master\\opencv-master\\data\\haarcascades\\haarcascade_frontalface_default.xml')# 检测多尺度图像,返回值是一张脸部区域信息的列表(x,y,宽,高)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)# 如果未检测到面部,则返回原始图像if (len(faces) == 0):return None, None# 目前假设只有一张脸,xy为左上角坐标,wh为矩形的宽高(x, y, w, h) = faces[0]# 返回图像的正面部分return gray[y:y + w, x:x + h], faces[0]# 该函数将读取所有的训练图像,从每个图像检测人脸并将返回两个相同大小的列表,分别为脸部信息和标签def prepare_training_data(data_folder_path):# 获取数据文件夹中的目录(每个主题的一个目录)dirs = os.listdir(data_folder_path)# 两个列表分别保存所有的脸部和标签faces = []labels = []# 浏览每个目录并访问其中的图像for dir_name in dirs:# dir_name(str类型)即标签label = int(dir_name)# 建立包含当前主题主题图像的目录路径subject_dir_path = data_folder_path + "/" + dir_name# 获取给定主题目录内的图像名称subject_images_names = os.listdir(subject_dir_path)# 浏览每张图片并检测脸部,然后将脸部信息添加到脸部列表faces[]for image_name in subject_images_names:# 建立图像路径image_path = subject_dir_path + "/" + image_name# 读取图像image = cv2.imread(image_path)# 显示图像0.1scv2.imshow("Training on image...", image)cv2.waitKey(1000)# 检测脸部face, rect = detect_face(image)# 我们忽略未检测到的脸部if face is not None:# 将脸添加到脸部列表并添加相应的标签faces.append(face)labels.append(label)cv2.waitKey(1)cv2.destroyAllWindows()# 最终返回值为人脸和标签列表return faces, labels# 调用prepare_training_data()函数faces, labels = prepare_training_data("D:\\New_desktop\\train_data")# 创建LBPH识别器并开始训练,当然也可以选择Eigen或者Fisher识别器face_recognizer = cv2.face.LBPHFaceRecognizer_create()face_recognizer.train(faces, np.array(labels))# 根据给定的(x,y)坐标和宽度高度在图像上绘制矩形def draw_rectangle(img, rect):(x, y, w, h) = rectcv2.rectangle(img, (x, y), (x + w, y + h), (128, 128, 0), 2)# 根据给定的(x,y)坐标标识出人名def draw_text(img, text, x, y):cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)# 建立标签与人名的映射列表(标签只能为整数)subjects = ["jiaju", "jiaqiang"]# 此函数识别传递的图像中的人物并在检测到的脸部周围绘制一个矩形及其名称def predict(test_img):# 生成图像的副本,这样就能保留原始图像img = test_img.copy()# 检测人脸face, rect = detect_face(img)# 预测人脸label = face_recognizer.predict(face)# 获取由人脸识别器返回的相应标签的名称label_text = subjects[label[0]]# 在检测到的脸部周围画一个矩形draw_rectangle(img, rect)# 标出预测的名字draw_text(img, label_text, rect[0], rect[1] - 5)# 返回预测的图像return img# 加载测试图像test_img1 = cv2.imread("D:\\New_desktop\\timg.png")# 执行预测predicted_img1 = predict(test_img1)# 显示两个图像cv2.imshow(subjects[0], predicted_img1)cv2.waitKey(0)cv2.destroyAllWindows()
