如下:

import cv2
import numpy as np
import os

# 训练数据路径
data_path = 'train_data'

# 人脸检测器
face_detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# LBPH人脸识别器
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 获取训练数据
def get_training_data():

    faces = []
    labels = []

    # 遍历训练数据路径下的所有子文件夹
    for sub_dir_name in os.listdir(data_path):

        sub_dir_path = os.path.join(data_path, sub_dir_name)

        # 如果不是文件夹则跳过
        if not os.path.isdir(sub_dir_path):
            continue

        # 获取标签(文件夹名)
        label = int(sub_dir_name)

        # 遍历文件夹下的所有图片
        for img_name in os.listdir(sub_dir_path):

            img_path = os.path.join(sub_dir_path, img_name)

            # 加载图片
            img = cv2.imread(img_path)

            # 转换为灰度图像
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

            # 检测人脸
            faces_rects = face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

            # 如果检测到多张人脸则跳过
            if len(faces_rects) != 1:
                continue

            # 获取人脸区域
            x, y, w, h = faces_rects[0]
            face_roi = gray[y:y+h, x:x+w]

            # 添加到训练数据中
            faces.append(face_roi)
            labels.append(label)

    return faces, labels

# 训练模型
def train():

    # 获取训练数据
    faces, labels = get_training_data()

    # 训练模型
    recognizer.train(faces, np.array(labels))

# 运行程序
if __name__ == '__main__':

    # 训练模型
    train()

    # 加载测试图片
    img = cv2.imread('test.jpg')

    # 转换为灰度图像
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 检测人脸
    faces_rects = face_detector.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5)

    # 遍历检测到的人脸
    for (x, y, w, h) in faces_rects:

        # 获取人脸区域
        face_roi = gray[y:y+h, x:x+w]

        # 预测标签
        label, confidence = recognizer.predict(face_roi)

        # 显示标签和置信度
        print('Label: {}, Confidence: {}'.format(label, confidence))

        # 在图片上绘制人脸和标签
        cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
        cv2.putText(img, str(label), (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 显示图片
    cv2.imshow('Face Recognition', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

该代码实现了人脸识别的基本流程,包括获取训练数据、训练模型、加载测试图片、检测人脸、预测标签和显示结果。其中,人脸检测采用Haar特征检测算法,人脸识别采用LBPH算法。具体实现过程可以参考代码注释


原文地址: https://www.cveoy.top/t/topic/fdKT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录