概述

在本文中,我们将制作一个人脸检测应用程序,它将检测图像中的单个人脸并同时检测多个人脸,因此,整篇文章将重点介绍使用计算机视觉进行人脸检测。在这里,我们将使用 HAAR 级联分类器进行检测;出于检测目的,我们将学习检测图像中人脸所涉及的所有技术和过程。

人脸识别在计算机视觉 人脸识别 计算机视觉_人脸识别

人脸检测的应用

  1. 人脸识别:人脸识别是进一步做的事情,即在人脸检测之后,进行人脸识别。
  2. 滤镜:如今,我们生活在社交媒体的世界里,我们可以看到全球市场上有各种各样的滤镜和有趣的应用程序;要进行此类应用,我们还需要先检测人脸,然后应用滤镜。
  3. 人脸解锁应用程序:我们经常在手机中使用此功能,但我们知道,这也需要检测人脸。

所以让我们开始吧!

加载必要的库
# Import the necessary libraries
import numpy as np
import cv2 
import matplotlib.pyplot as plt
%matplotlib inline
加载图像
#  Loading the image to be tested
test_image = cv2.imread('data/baby1.png')
# Here we are converting the colored image into gray image
if(test_image is not None):
    test_image_gray = cv2.cvtColor(test_image, cv2.COLOR_BGR2GRAY)
test_image_gray
# Displaying grayscale image
plt.imshow(test_image_gray, cmap='gray')

输出:

人脸识别在计算机视觉 人脸识别 计算机视觉_人脸识别在计算机视觉_02

我们很清楚 OpenCV 的检测器功能默认读取 BGR 格式的现有图像,但最终用户通常不会考虑 BGR 格式;因此我们需要将 BGR 格式的图像转换为 RGB 格式,即彩色图像,它具有负责创建彩色图像的所有 3 个通道(R-Red、G-Green、B-Blue)。

因此,我们将创建一个函数来将 BGR 图像转换为 RGB 图像。

def convertToRGB(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
HAAR 级联文件

HAAR 级联是计算机视觉领域的一个很好的术语。当我们谈论 HAAR 级联分类器时,不仅仅是人脸预训练分类器,我们可以得到经过训练来检测微笑、汽车、公共汽车的分类器,这些级联文件总是采用 XML 文件格式,通常我们使用现有的级联文件,但事实上我们也可以在这里创建它们,为了简单起见,我们将使用 HAAR 级联正面人脸分类器来检测图像中人脸的位置。

加载正面分类器
haar_cascade_face = cv2.CascadeClassifier('data/haarcascades/haarcascade_frontalface_alt2.xml')

人脸检测

对于人脸检测,我们需要从坐标中获取人脸的坐标,我的意思是 X、Y 坐标以及人脸的高度和宽度,然后我们可以在给定的坐标下在图像上绘制一个矩形,我们有detectMultiScale函数,它将为我们提供所有需要的坐标来规划矩形。

face_coordinate = haar_cascade_face.detectMultiScale(test_image_gray, scaleFactor = 1.2, minNeighbors = 5);
# Let us print the no. of faces found
print('Faces found: ', len(face_coordinate))

输出:

Faces found:  1

所以之前,在使用 detectMultiScale 函数时,我们获取了图像的 x 坐标和 y 坐标以及高度和宽度,现在我们将使用这些点循环遍历图像的每个点并在脸部上绘制厚度为 2 个像素的矩形。

for (x_face,y_face,w_face,h_face) in face_coordinate:
     cv2.rectangle(test_image, (x_face, y_face), (x_face+w_face, y_face+h_face), (0, 255, 0), 2)

由于现在已经完成了完整的过程,是时候检查我们到目前为止执行的所有步骤是否正确,在Matplotlib 的 show 函数的帮助下,我们将看到处理后的图像,看看它是否可以检测到图像中的人脸。

#convert image to RGB and show image
plt.imshow(convertToRGB(test_image))

输出:

人脸识别在计算机视觉 人脸识别 计算机视觉_opencv_03

自动人脸检测过程的函数
def detect_faces(cascade, test_image, scaleFactor = 1.1):
    # Here with the help of copy() function we will hold the copy of the original image
    image_copy = test_image.copy()
    # Here with the help of cvtColor function we are converting the image from BGR format to gray image
    gray_image = cv2.cvtColor(image_copy, cv2.COLOR_BGR2GRAY)
    # Finally we are using the haar cascade function with detectMultiscale to get the coordiates of the faces in the given image
    faces_rect = cascade.detectMultiScale(gray_image, scaleFactor=scaleFactor, minNeighbors=1)
    for (x_face, y_face, w_face, h_face) in faces_rect:
        cv2.rectangle(image_copy, (x_face, y_face), (x_face+w_face, y_face+h_face), (0, 255, 0), 2)
    return image_copy

代码分解:在这里,我们构建了检测人脸的函数;让我们看看这里发生了什么:

  1. 首先,我们使用copy函数来存储原始图像,这样任何不需要的更改都不应该存在于原始图像中
  2. 然后我们将BGR 格式的图像转换为灰度图像,因为 cv2 以灰度格式读取图像只是为了更好的可读性。
  3. 然后,在 detectMultiScale 函数的帮助下, 评论中已经提到了这一点。
  4. 最后,利用 detectMultiScale 函数得到的坐标,绘制出 2 像素厚的绿色矩形
在新图像上测试
#loading image
test_image2 = cv2.imread('data/baby2.png')
#call the function to detect faces
faces = detect_faces(haar_cascade_face, test_image2)
#convert to RGB and display image
plt.imshow(convertToRGB(faces))

输出:

人脸识别在计算机视觉 人脸识别 计算机视觉_人脸识别在计算机视觉_04

检测多个人脸的测试
#loading image
test_image2 = cv2.imread('data/group.png')
#call the function to detect faces
faces = detect_faces(haar_cascade_face, test_image2)
#convert to RGB and display image
plt.imshow(convertToRGB(faces))

输出:

人脸识别在计算机视觉 人脸识别 计算机视觉_opencv_05

保存图像
cv2.imwrite('image1.png',faces)

输出:

True

结论

  1. 因此,在使用计算机视觉进行人脸检测时,我们首先导入必要的库并加载我们需要执行人脸检测的图像。
  2. 然后我们了解了 HAAR 级联文件和正面分类器。除此之外,还学习了 detectMultiScale 函数的使用。
  3. 当我们意识到整个检测过程非常耗时的时候,我们尝试构建一个函数来自动化这个过程。
  4. 然后使用函数,我们可以检测到图像的多张人脸。
  5. 最后,我们保存了检测到的人脸图像。

因此,以上是使用计算机视觉准备人脸检测应用程序时必须遵循的步骤