第4章 人脸检测基础
Haar Cascade分类器原理 · OpenCV内置模型使用 · 检测参数调优
4.1 Haar Cascade 分类器原理
Haar Cascade 是一种基于机器学习的对象检测方法,由 Paul Viola 和 Michael Jones 在 2001 年提出。它通过大量正负样本训练级联分类器,利用 Haar-like 特征快速计算并筛选人脸区域。
- Haar-like 特征:矩形区域像素和之差,可描述边缘、线条、中心特征。
- 积分图:快速计算任意矩形区域像素和,使特征计算达到常数时间。
- AdaBoost 训练:从大量弱分类器中筛选出关键特征,构建强分类器。
- 级联结构:早期阶段快速排除非人脸区域,减少计算量。
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)
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左右。