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()
该示例演示了如何使用已经训练好的模型进行人脸识别,通过绘制矩形框和添加文本信息可以清晰地显示出识别结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python基于Opencv来快速实现人脸识别过程详解(完整版) - Python技术站