机器视觉学习(十三)—— 人脸识别
Haar分类器、人脸识别相关函数讲解、人脸识别示例代码
目录
2.3 cv2.face.createLBPHFaceRecognizer()函数
一、Haar分类器
1.1 Haar分类器的概念
Haar分类器是一种用于目标检测的机器学习算法,特别适用于人脸检测。它基于Haar特征和级联分类器的概念。
Haar特征是一种用于描述图像局部特征的数学模型,常用于对图像进行特征提取。它可以捕捉到图像中具有边缘、线段或纹理等特征的区域。通过计算Haar特征的各种组合,可以构建出一个用于检测目标的分类器。
级联分类器是一种由多个弱分类器组成的强分类器。每个弱分类器都是一个简单的二分类器,它可以根据某个特征对图像进行分类。级联分类器通过级联多个弱分类器,每个弱分类器都有一个阈值来决定是否通过,从而实现对目标的准确检测。
Haar分类器通过训练大量正负样本图像,并使用AdaBoost算法来选择最具代表性的Haar特征和阈值,构建出一个能够有效检测目标的级联分类器。在检测时,Haar分类器会对图像中的每个区域进行特征计算和分类判断,从而找到可能包含目标的区域。
1.2 获取Haar分类器
您可以从OpenCV官方网站下载Haar分类器。以下是一些步骤:
- 访问OpenCV官方网站:https://opencv.org/
- 在网站上找到并点击“Download”按钮。
- 在下载页面上,选择适用于您的操作系统的OpenCV版本,并下载安装程序。
- 安装OpenCV并确保安装路径正确配置。
一旦您安装了OpenCV,您可以在以下路径中找到Haar分类器文件:
在OpenCV库的安装目录中,有一个名为“data”的子文件夹。在这个文件夹中,您将找到一些预训练的Haar分类器文件,例如人脸检测器(haarcascade_frontalface_default.xml)和眼睛检测器(haarcascade_eye.xml)。
二、人脸识别相关函数讲解
2.1 cv2.CascadeClassifier()函数
cv2.CascadeClassifier()函数是用于加载和使用级联分类器(Cascade Classifier)进行目标检测的函数。在人脸识别中,我们通常使用级联分类器来检测图像中的人脸。
函数原型如下:
CascadeClassifier对象 = cv2.CascadeClassifier([filename])
参数:
filename:级联分类器的模型文件路径。可以是OpenCV提供的预训练模型文件,也可以是用户自己训练的模型文件。
返回值:
CascadeClassifier对象:表示加载的级联分类器模型。
2.2 cv2.detectMultiScale()函数
cv2.detectMultiScale()函数是OpenCV中用于检测图像中目标(如人脸)的函数。它使用级联分类器(Cascade Classifier)来检测目标,并返回检测到的目标的边界框。
函数原型如下:
Numpy数组 = cv2.detectMultiScale(image, scaleFactor, minNeighbors, minSize, maxSize)
参数:
image:要进行目标检测的输入图像。scaleFactor:表示每次图像缩小的比例。默认值为1.1。minNeighbors:每个候选矩形应该保留的最小邻居数。默认值为3。minSize:目标的最小尺寸。默认为(30, 30)。maxSize:目标的最大尺寸。默认为空,表示没有最大尺寸限制。
返回值:
- 返回一个包含检测到的目标边界框的Numpy数组,每个边界框表示为(x, y, w, h),其中(x, y)是左上角的坐标,(w, h)是宽度和高度。
2.3 cv2.face.createLBPHFaceRecognizer()函数
cv2.face.createLBPHFaceRecognizer()函数是OpenCV中用于创建基于LBPH(Local Binary Patterns Histograms)算法的人脸识别器的函数。
函数原型如下:
LBPH对象 = cv2.face.createLBPHFaceRecognizer([radius[, neighbors[, grid_x[, grid_y[, threshold]]]]])
参数:
radius:LBPH算法的半径,默认为1。neighbors:每个像素点的邻居数量,默认为8。grid_x:将图像分成多少个等分的网格,用于提取LBPH特征,水平方向上的网格数量,默认为8。grid_y:将图像分成多少个等分的网格,用于提取LBPH特征,垂直方向上的网格数量,默认为8。threshold:用于判断是否匹配的阈值,默认为80。
返回值:
- 返回一个LBPH人脸识别器对象。
三、人脸识别
3.1 对图像进行人脸识别
使用以下代码示例进行人脸识别:
import cv2
# 加载人脸识别器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取图像
image = cv2.imread('image.jpg')
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 在图像中标记人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示图像
cv2.imshow('Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,首先加载了人脸识别器 haarcascade_frontalface_default.xml ,然后读取了一张图像。接下来,将图像转换为灰度图像,并使用detectMultiScale函数检测图像中的人脸。最后,通过在图像中绘制矩形框来标记检测到的人脸,并显示图像。
注意:
请将代码中的image.jpg替换为您要进行人脸识别的图像路径。
3.2 在人脸范围内检测眼睛
下面是在人脸图像中检测眼睛的代码示例:
import cv2
# 加载人脸检测器和眼睛检测器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
# 加载图像并转换为灰度
image = cv2.imread('face_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
# 遍历每个检测到的人脸
for (x, y, w, h) in faces:
# 在人脸周围绘制矩形框
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = image[y:y+h, x:x+w]
# 在人脸区域内检测眼睛
eyes = eye_cascade.detectMultiScale(roi_gray)
# 遍历每个检测到的眼睛
for (ex, ey, ew, eh) in eyes:
# 在眼睛周围绘制矩形框
cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
# 显示结果图像
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,将人脸检测器和眼睛检测器分别加载为 CascadeClassifier 对象。然后,加载图像并将其转换为灰度图像。使用人脸检测器检测人脸,并在检测到的人脸周围绘制一个矩形框。然后,从人脸区域提取感兴趣的灰度图像,并使用眼睛检测器检测眼睛。在检测到的眼睛周围绘制矩形框。最后,显示带有矩形框的结果图像。
注意:
将 haarcascade_frontalface_default.xml 和 haarcascade_eye.xml 这两个级联分类器文件与代码放在同一目录下。
3.3 视频中的人脸识别
下面是一个使用OpenCV进行人脸识别的示例代码:
import cv2
# 加载人脸识别器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取摄像头捕捉的图像
ret, frame = cap.read()
# 将图像转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 在图像中检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 在人脸位置画一个矩形框
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)
# 显示图像
cv2.imshow('Face Detection', frame)
# 按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头和关闭窗口
cap.release()
cv2.destroyAllWindows()
此代码中使用了OpenCV提供的 Haar级联分类器 haarcascade_frontalface_default.xml 来进行人脸检测。首先加载该分类器,然后打开摄像头并循环读取捕捉到的图像。将图像转换为灰度图像后,使用detectMultiScale方法找到图像中的人脸位置,并在这些位置上画矩形框。最后将处理后的图像显示出来,按下"q"键退出循环并关闭窗口。
更多推荐

所有评论(0)