当前位置:   article > 正文

机器视觉学习(十三)—— 人脸识别_机器视觉 人脸识别

机器视觉 人脸识别

目录

一、Haar分类器

1.1 Haar分类器的概念

1.2 获取Haar分类器

二、人脸识别相关函数讲解

2.1 cv2.CascadeClassifier()函数

2.2 cv2.detectMultiScale()函数

2.3 cv2.face.createLBPHFaceRecognizer()函数

三、人脸识别

3.1 对图像进行人脸识别

3.2 在人脸范围内检测眼睛

3.3 视频中的人脸识别


一、Haar分类器

1.1 Haar分类器的概念

Haar分类器是一种用于目标检测的机器学习算法,特别适用于人脸检测。它基于Haar特征级联分类器的概念。

Haar特征是一种用于描述图像局部特征的数学模型,常用于对图像进行特征提取。它可以捕捉到图像中具有边缘、线段或纹理等特征的区域。通过计算Haar特征的各种组合,可以构建出一个用于检测目标的分类器。

级联分类器是一种由多个弱分类器组成的强分类器。每个弱分类器都是一个简单的二分类器,它可以根据某个特征对图像进行分类。级联分类器通过级联多个弱分类器,每个弱分类器都有一个阈值来决定是否通过,从而实现对目标的准确检测。

Haar分类器通过训练大量正负样本图像,并使用AdaBoost算法来选择最具代表性的Haar特征和阈值,构建出一个能够有效检测目标的级联分类器。在检测时,Haar分类器会对图像中的每个区域进行特征计算和分类判断,从而找到可能包含目标的区域。

1.2 获取Haar分类器

您可以从OpenCV官方网站下载Haar分类器。以下是一些步骤:

  1. 访问OpenCV官方网站:https://opencv.org/
  2. 在网站上找到并点击“Download”按钮。
  3. 在下载页面上,选择适用于您的操作系统的OpenCV版本,并下载安装程序。
  4. 安装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 对图像进行人脸识别

使用以下代码示例进行人脸识别:

  1. import cv2
  2. # 加载人脸识别器
  3. face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  4. # 读取图像
  5. image = cv2.imread('image.jpg')
  6. # 将图像转换为灰度图像
  7. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  8. # 检测人脸
  9. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  10. # 在图像中标记人脸
  11. for (x, y, w, h) in faces:
  12. cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
  13. # 显示图像
  14. cv2.imshow('Faces', image)
  15. cv2.waitKey(0)
  16. cv2.destroyAllWindows()

在上面的代码中,首先加载了人脸识别器   haarcascade_frontalface_default.xml ,然后读取了一张图像。接下来,将图像转换为灰度图像,并使用detectMultiScale函数检测图像中的人脸。最后,通过在图像中绘制矩形框来标记检测到的人脸,并显示图像。

注意:

请将代码中的image.jpg替换为您要进行人脸识别的图像路径。

3.2 在人脸范围内检测眼睛

下面是在人脸图像中检测眼睛的代码示例:

  1. import cv2
  2. # 加载人脸检测器和眼睛检测器
  3. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  4. eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
  5. # 加载图像并转换为灰度
  6. image = cv2.imread('face_image.jpg')
  7. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  8. # 检测人脸
  9. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
  10. # 遍历每个检测到的人脸
  11. for (x, y, w, h) in faces:
  12. # 在人脸周围绘制矩形框
  13. cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
  14. roi_gray = gray[y:y+h, x:x+w]
  15. roi_color = image[y:y+h, x:x+w]
  16. # 在人脸区域内检测眼睛
  17. eyes = eye_cascade.detectMultiScale(roi_gray)
  18. # 遍历每个检测到的眼睛
  19. for (ex, ey, ew, eh) in eyes:
  20. # 在眼睛周围绘制矩形框
  21. cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
  22. # 显示结果图像
  23. cv2.imshow('Face Detection', image)
  24. cv2.waitKey(0)
  25. cv2.destroyAllWindows()

在上述代码中,将人脸检测器和眼睛检测器分别加载为 CascadeClassifier 对象。然后,加载图像并将其转换为灰度图像。使用人脸检测器检测人脸,并在检测到的人脸周围绘制一个矩形框。然后,从人脸区域提取感兴趣的灰度图像,并使用眼睛检测器检测眼睛。在检测到的眼睛周围绘制矩形框。最后,显示带有矩形框的结果图像。

注意:

将 haarcascade_frontalface_default.xml haarcascade_eye.xml 这两个级联分类器文件与代码放在同一目录下。

3.3 视频中的人脸识别

下面是一个使用OpenCV进行人脸识别的示例代码:

  1. import cv2
  2. # 加载人脸识别器
  3. face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
  4. # 打开摄像头
  5. cap = cv2.VideoCapture(0)
  6. while True:
  7. # 读取摄像头捕捉的图像
  8. ret, frame = cap.read()
  9. # 将图像转换为灰度图像
  10. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  11. # 在图像中检测人脸
  12. faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
  13. # 在人脸位置画一个矩形框
  14. for (x, y, w, h) in faces:
  15. cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 3)
  16. # 显示图像
  17. cv2.imshow('Face Detection', frame)
  18. # 按下 'q' 键退出循环
  19. if cv2.waitKey(1) & 0xFF == ord('q'):
  20. break
  21. # 释放摄像头和关闭窗口
  22. cap.release()
  23. cv2.destroyAllWindows()

此代码中使用了OpenCV提供的 Haar级联分类器 haarcascade_frontalface_default.xml 来进行人脸检测。首先加载该分类器,然后打开摄像头并循环读取捕捉到的图像。将图像转换为灰度图像后,使用detectMultiScale方法找到图像中的人脸位置,并在这些位置上画矩形框。最后将处理后的图像显示出来,按下"q"键退出循环并关闭窗口。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/627849
推荐阅读
相关标签
  

闽ICP备14008679号