📜  使用 OpenCV-Python 的 Cascade Classifier 进行人脸检测

📅  最后修改于: 2022-05-13 01:54:48.395000             🧑  作者: Mango

使用 OpenCV-Python 的 Cascade Classifier 进行人脸检测

在本文中,我们将了解如何使用 OpenCV Python中的级联分类器检测人脸。人脸检测在当今世界的不同领域具有重要意义。它在人脸识别(也用作生物识别技术)、摄影(用于面部自动对焦)、人脸分析(年龄、性别、情绪识别)、视频监控等多个应用中迈出了重要的一步。

面部检测的流行算法之一是“haarcascade”。它的计算成本较低,算法速度快,并且精度高。

Haarcascade 文件可以从这里下载: haarcascade_frontalface_default.xml

它分四个阶段工作:

  • Haar-feature selection :类似 Haar 的特征由暗区和亮区组成。它通过取暗区域强度之和与亮区域强度之和的差来产生单个值。这样做是为了提取识别对象所需的有用元素。 viola 和 jones 提出的特征是:

  • 积分图像的创建:积分图像中的给定像素是左侧所有像素及其上方所有像素的总和。由于提取类 Haar 特征的过程涉及计算暗矩形区域和亮矩形区域的差异,因此 Integral Images 的引入显着减少了完成该任务所需的时间。
  • AdaBoost 训练:该算法从所有特征中选择最佳特征。它将多个“弱分类器”(最佳特征)组合成一个“强分类器”。生成的“强分类器”基本上是所有“弱分类器”的线性组合。
  • 级联分类器:这是一种在级联中组合越来越复杂的分类器(如 AdaBoost)的方法,它允许快速丢弃负输入(非人脸),同时在有希望或正人脸区域上花费更多计算。它显着减少了计算时间并提高了处理效率。

OpenCV 带有许多预训练的分类器。这些 XML 文件可以通过 cv2 模块的 cascadeClassifier 方法加载。在这里,我们将使用 haarcascade_frontalface_default.xml 来检测人脸。

逐步实施:

第 1 步:加载图像

Python
img = cv2.imread('Photos/cric.jpg')


Python
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)


Python
haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')


Python
faces_rect = haar_cascade.detectMultiScale(
    gray, scaleFactor=1.1, minNeighbors=9)


Python
for (x, y, w, h) in faces_rect:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), thickness=2)
  
cv2.imshow('Detected faces', img)
cv2.waitKey(0)


Python
# Importing OpenCV package
import cv2
  
# Reading the image
img = cv2.imread('Photos/cric4.jpg')
  
# Converting image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
# Loading the required haar-cascade xml classifier file
haar_cascade = cv2.CascadeClassifier('Haarcascade_frontalface_default.xml')
  
# Applying the face detection method on the grayscale image
faces_rect = haar_cascade.detectMultiScale(gray_img, 1.1, 9)
  
# Iterating through rectangles of detected faces
for (x, y, w, h) in faces_rect:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
  
cv2.imshow('Detected faces', img)
  
cv2.waitKey(0)


步骤 2:将图像转换为灰度

最初,图像是三层图像(即RGB),因此将其转换为一层图像(即灰度)。

Python

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

第 3 步:加载所需的 haar-cascade XML 分类器文件

cv2 模块中的 CascadeClassifier 方法支持加载 haar-cascade XML 文件。在这里,我们需要“haarcascade_frontalface_default.xml”来进行人脸检测。

Python

haar_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

第四步:在灰度图像上应用人脸检测方法

这是使用 cv2::CascadeClassifier::detectMultiScale 方法完成的,该方法返回检测到的人脸的边界矩形(即 x、y、w、h)。它有两个参数,即 scaleFactor 和 minNeighbors。 ScaleFactor 确定窗口大小的增加因子,最初从大小“minSize”开始,在测试该大小的所有窗口后,窗口按“scaleFactor”放大,窗口大小上升到“maxSize”。如果“scaleFactor”很大,(例如,2.0),步数会更少,所以检测会更快,但我们可能会错过大小在两个测试尺度之间的对象。 (默认比例因子为 1.3)。 “minNeighbors”的值越高,误报的数量就越少,在人脸错误检测方面的错误也就越少。但是,也有可能遗漏一些不清楚的面部痕迹。

Python

faces_rect = haar_cascade.detectMultiScale(
    gray, scaleFactor=1.1, minNeighbors=9)

第 5 步:遍历检测到的人脸的矩形

通过 cv2 模块的 rectangle 方法通过迭代所有检测到的人脸,在检测到的人脸周围绘制矩形。

Python

for (x, y, w, h) in faces_rect:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), thickness=2)
  
cv2.imshow('Detected faces', img)
cv2.waitKey(0)

下面是实现:

Python

# Importing OpenCV package
import cv2
  
# Reading the image
img = cv2.imread('Photos/cric4.jpg')
  
# Converting image to grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  
# Loading the required haar-cascade xml classifier file
haar_cascade = cv2.CascadeClassifier('Haarcascade_frontalface_default.xml')
  
# Applying the face detection method on the grayscale image
faces_rect = haar_cascade.detectMultiScale(gray_img, 1.1, 9)
  
# Iterating through rectangles of detected faces
for (x, y, w, h) in faces_rect:
    cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
  
cv2.imshow('Detected faces', img)
  
cv2.waitKey(0)

输出: