前言
人脸检测(Face Detection)是当前目标检测领域中一项非常热门的研究领域,它是人脸识别与人脸表情分析的核心,本篇文章介绍采用OpenCV中Haar分类器算法对图片中人脸的检测,并通过矩形框讲人脸与眼睛位置框选与标记.
1. Haar级联分类器
Haar级联分类器是一种基于特征提取和机器学习的对象检测方法。它使用Haar特征进行图像分析,通过训练样本数据集,生成一个多层级联的分类器来检测目标物体。最常用于人脸检测。它是由Paul Viola和Michael Jones于2001年提出的。
Haar级联分类器的基本思想是通过组合多个简单的特征来构建一个强大的分类器。这些特征是基于Haar-like特征的概念,它们可以有效地描述图像的局部区域。Haar-like特征是一种基于图像亮度差异的局部特征,可以用于区分人脸和非人脸区域。例如,一个典型的Haar-like特征可以是在图像上的一个矩形区域,该区域的左上部分具有较暗的像素值,而右下部分具有较亮的像素值。
通过使用Haar-like特征,Haar级联分类器可以对图像的不同区域进行特征计算,并将其输入到级联的分类器中进行分类。级联分类器由多个弱分类器组成,每个弱分类器都负责检测特定的特征。级联分类器通过级联地应用这些弱分类器来逐步筛选出可能的人脸区域,最终得到准确的人脸检测结果。
在实际应用中,OpenCV提供了预训练的Haar级联分类器模型,可以用于人脸检测。这些模型通常以XML文件的形式存在,并包含了在大量正负样本上训练得到的分类器参数。可以使用这些预训练的模型来进行人脸检测,而无需自己训练分类器。
要使用Haar级联分类器进行人脸检测,需要加载相应的分类器文件,如haarcascade_frontalface_default.xml
,然后将图像转换为灰度图像,并使用detectMultiScale()
函数进行人脸检测。
总结来说,Haar级联分类器是一种基于Haar-like特征的人脸检测方法,通过级联的弱分类器来逐步筛选人脸区域。在OpenCV中,可以使用预训练的Haar级联分类器模型进行人脸检测。
Haar级联分类器具有以下优点:
- 高效性:通过使用Haar特征和级联结构,在处理大量数据时能够快速地减少计算量。
- 准确性:根据训练数据集得到的多层级联分类器具有高度准确性。
- 可扩展性:可以通过添加更多的训练数据和调整参数来改进模型性能。
2. 功能实现
2.1 完整代码
# encoding:utf-8
import cv2
import numpy as np
# 通过numpy读取中文路径图像
def image_read_from_chinese_path(image_file_name):
image_numpy_data = cv2.imdecode(np.fromfile(image_file_name, dtype=np.uint8), -1)
#返回numpy的ndarray
return image_numpy_data
# 运行之前,检查cascade文件路径是否在相应的目录下
face_cascade = cv2.CascadeClassifier('model/haarcascade_frontalface_default.xml')
eye_cascade = cv2.CascadeClassifier('model/haarcascade_eye.xml')
# 读取图像
img = image_read_from_chinese_path('./images/test2.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图
# 检测脸部
faces = face_cascade.detectMultiScale(gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(100, 100),
flags=cv2.CASCADE_SCALE_IMAGE)
# 标记位置
for (x, y, w, h) in faces:
img = cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
roi_gray = gray[y: y + h, x: x + w]
roi_color = img[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, 0, 255), 2)
label = f'OpenCV Haar Detected {str(len(faces))} faces'
cv2.putText(img, label, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 1)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
如果新同学不知道如何配置环境,可以参考博主写的【Anaconda3与PyCharm安装配置保姆教程】
其中,函数image_read_from_chinese_path
函数主要是解决cv2无法读取中文路径图像的解决方案,具体可以参考博主写的文章【opencv-python[cv2]读取中文路径图像】
2.2 单个人脸测试效果
2.3 多个人脸测试效果
2.4 Haar级联分类器缺点分析
尽管Haar级联分类器在人脸检测任务上取得了良好的效果,但它也存在一些缺点。以下是一些常见的缺点:
-
计算复杂度高:Haar级联分类器的计算复杂度相对较高,特别是在较大的图像上进行检测时。由于需要在不同尺度和位置上对图像进行滑动窗口检测,以及应用多个级联分类器进行分类,因此会消耗大量的计算资源。
-
对光照和姿态变化敏感:Haar级联分类器对光照和姿态变化比较敏感。由于Haar-like特征是基于亮度差异的,当图像中的光照条件变化较大时,可能会导致人脸检测的性能下降。此外,当人脸出现较大的姿态变化时,级联分类器可能无法准确地检测到人脸。
-
鲁棒性差:Haar级联分类器对遮挡和复杂背景也比较敏感。当人脸被遮挡部分或存在复杂的背景干扰时,级联分类器可能会产生误检或漏检。
-
检测精度有限:尽管Haar级联分类器在一般情况下可以提供较好的人脸检测结果,但在某些具有挑战性的场景下,如低分辨率图像、侧脸或非正面人脸等情况下,其检测精度可能有限。
-
需要大量训练数据和时间:训练一个高质量的Haar级联分类器需要大量的正负样本数据,并且训练过程相对较慢。此外,需要仔细调整和优化级联分类器的参数,以获得良好的检测性能。
尽管存在这些缺点,Haar级联分类器仍然是一种广泛应用的人脸检测方法,特别是在资源受限的嵌入式设备或实时应用中。然而,随着深度学习方法的发展,基于卷积神经网络的人脸检测算法已经取得了更好的性能,并成为当前主流的人脸检测技术。
结束语
由于博主能力有限,本篇文章中提及的方法,也难免会有疏漏之处,希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。