Python基于Opencv来快速实现人脸识别过程详解(完整版)

  

Python基于Opencv来快速实现人脸识别过程详解(完整版)

简介

本文将详细介绍使用Python和OpenCV完成人脸识别的方法和步骤,由于OpenCV是一个广泛应用于计算机视觉的开源库,本文将利用其强大的功能来实现人脸识别的全过程。

步骤

步骤1、 准备数据集

在进行人脸识别过程中,我们需要一个包含训练数据的数据集,数据集是包含一组图片的集合,图片应该包括训练样本和测试样本,用于训练和测试模型。数据集可以自己手动准备,也可以从网络上下载现成的人脸数据集,如脸部识别数据集等。

步骤2、 训练模型

训练模型是人脸识别过程中的重要步骤,其目的是通过数据集训练模型,从而实现对新的人脸进行识别。在本文中,我们将使用基于Opencv的LBPH算法来训练我们的模型,使用OpenCV库自带的特征提取函数,将人脸图像转换为LBPH特征向量,然后进行训练。

import cv2
import numpy as np
import os 

# 读取人脸数据
def read_data(path):
    X, y = [], []
    for foldername in os.listdir(path):
        label = int(foldername == "s1") # 如果文件夹是s1,则标签为1,否则标签为0
        folderpath = os.path.join(path, foldername)
        for filename in os.listdir(folderpath):
            imagePath = os.path.join(folderpath, filename)
            image = cv2.imread(imagePath, cv2.IMREAD_GRAYSCALE) # 以灰度形式读取图像
            # 使用LBPH特征提取算法将图像转换为特征向量
            lbp = cv2.face.LBPHFaceRecognizer_create()
            lbp.train(np.array(X), np.array(y))
            return lbp

步骤3、 进行人脸识别

在训练模型后,我们就可以开始进行人脸识别了。人脸识别主要包括两个步骤,即人脸检测和人脸识别。

3.1、 人脸检测

人脸检测是人脸识别的第一步,基于OpenCV的Haar级联检测器可以用来检测图像中的物体(对象)是否是我们感兴趣的对象(人脸)。

import cv2
import numpy as np

# 初始化级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载图像并转换为灰度图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 绘制矩形框框出人脸
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2、 人脸识别

人脸检测的目的是找到输入图像中的人脸,并将其切割成一个正方形,作为人脸识别的输入。然后使用已经训练好的模型来进行人脸识别。

import cv2
import numpy as np
import os 

# 加载模型
model = read_data('dataset')

# 初始化级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载图像并转换为灰度图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 绘制矩形框框出人脸
for (x, y, w, h) in faces:
    face_roi = gray[y:y+h,x:x+w]
    label, conf = model.predict(face_roi)
    if label == 1:
        cv2.putText(img, "s1", (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA)
    else:
        cv2.putText(img, "unknown", (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA)
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)  

# 显示结果
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

示例

示例1:人脸检测

import cv2
import numpy as np

# 初始化级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载图像并转换为灰度图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 绘制矩形框框出人脸
for (x, y, w, h) in faces:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

# 显示结果
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

该示例演示了如何使用OpenCV的Haar级联检测器来检测图像中的人脸,通过绘制矩形框可以清晰地框出人脸位置。

示例2:人脸识别

import cv2
import numpy as np
import os 

# 加载模型
model = read_data('dataset')

# 初始化级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 加载图像并转换为灰度图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)

# 绘制矩形框框出人脸
for (x, y, w, h) in faces:
    face_roi = gray[y:y+h,x:x+w]
    label, conf = model.predict(face_roi)
    if label == 1:
        cv2.putText(img, "s1", (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA)
    else:
        cv2.putText(img, "unknown", (x,y - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2, cv2.LINE_AA)
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)  

# 显示结果
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

该示例演示了如何使用已经训练好的模型进行人脸识别,通过绘制矩形框和添加文本信息可以清晰地显示出识别结果。

相关文章