第4章 人脸检测基础

Haar Cascade分类器原理 · OpenCV内置模型使用 · 检测参数调优

4.1 Haar Cascade 分类器原理

Haar Cascade 是一种基于机器学习的对象检测方法,由 Paul Viola 和 Michael Jones 在 2001 年提出。它通过大量正负样本训练级联分类器,利用 Haar-like 特征快速计算并筛选人脸区域。

  • Haar-like 特征:矩形区域像素和之差,可描述边缘、线条、中心特征。
  • 积分图:快速计算任意矩形区域像素和,使特征计算达到常数时间。
  • AdaBoost 训练:从大量弱分类器中筛选出关键特征,构建强分类器。
  • 级联结构:早期阶段快速排除非人脸区域,减少计算量。
Haar-like 特征模板 边缘特征 线性特征 中心特征

4.2 OpenCV 内置人脸检测模型使用

OpenCV 提供预训练的 Haar Cascade 模型文件(XML),可直接加载使用。常用模型包括正面人脸、眼睛、微笑等检测器。

模型文件检测目标特点
haarcascade_frontalface_default.xml正面人脸快速、轻量,适合实时
haarcascade_frontalface_alt2.xml正面人脸(改进)准确率略高
haarcascade_eye.xml眼睛常与人脸检测配合
haarcascade_smile.xml微笑可用于表情辅助

基本使用流程:加载模型 → 读取图像(灰度) → 调用 detectMultiScale 检测 → 绘制矩形框。

import cv2

# 加载 Haar Cascade 模型
face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)

# 读取图像并转为灰度
img = cv2.imread('photo.jpg')
gray = cv2.cvtColor(img, 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(img, (x, y), (x+w, y+h), (0, 255, 0), 2)

cv2.imshow('Face Detection', img)
cv2.waitKey(0)
加载模型 灰度转换 detectMultiScale 绘制

4.3 检测参数调优

detectMultiScale 提供多个关键参数,直接影响检测精度与速度。合理调优可平衡漏检与误检。

参数说明推荐范围调优方向
scaleFactor图像缩放比例,每次缩小图像尺寸1.05 ~ 1.3越小越慢但更准确
minNeighbors候选矩形最少邻近检测数3 ~ 6越大误检越少,但可能漏检
minSize最小人脸尺寸 (宽, 高)(30,30) ~ (100,100)过滤过小区域,提升速度
maxSize最大人脸尺寸根据图像设定限制过大区域

调优建议:

  • 若漏检过多:降低 scaleFactor(如 1.05),降低 minNeighbors(如 2~3)。
  • 若误检过多:提高 minNeighbors(如 5~8),适当提高 scaleFactor。
  • 实时场景:使用 minSize=(80,80) 以上,scaleFactor=1.2 左右。
参数调优平衡示意 scaleFactor 增大 → minNeighbors 增大 → 最佳平衡点 漏检多 误检多