一、介绍
本次将使用OpenCV的Haar级联分类器对一张静态图片进行人脸检测,在检测到的每个人脸周围绘制绿色矩形框,并输出检测到的人脸数量和位置坐标。
二、Haar级联分类器工作原理
特征:使用Haar-like矩形特征(边缘、线段、中心特征),通过积分图快速计算。
训练:Adaboost算法挑选关键特征并组合成弱分类器,再级联成强分类器。
检测:滑动窗口在不同尺度的图像金字塔上扫描,每一级快速排除非人脸区域,最终通过所有级的区域被判定为人脸。
三、核心代码讲解
3.1 首先导入cv2,读取图像。

3.2将原图转换为灰度图

Haar级联分类器要求输入为灰度图像(单通道),因为特征计算基于亮度差异,忽略颜色信息可以减少计算量并提高检测稳定性。
cv2.cvtColor()将BGR转换为灰度
3.3加载Haar级联分类器

cv2.CascadeClassifier()创建一个级联分类器对象。
cv2.data.haarcascades是OpenCV自带的预训练Haar特征XML文件所在目录的路径,haarcascade_frontalface_default.xml是用于检测正面人脸的经典模型。
该分类器基于AdaBoost训练,包含多个阶段的强分类器,通过级联方式快速排除非人脸区域。
3.4执行人脸检测

detectMultiScale()是核心检测函数,返回一个列表,每个元素为 (x, y, w, h) 表示人脸矩形左上角坐标和宽高。
scaleFactor=1.05:图像金字塔的缩放比例。每次将图像缩小为原来的 1/1.05 ≈ 0.952,以检测不同大小的人脸。值越接近 1,搜索的尺度越精细,耗时越长,但漏检率降低;值过大(如 1.3)则速度更快但可能漏检小脸。这里 1.05 较精细。
minNeighbors=9:每个候选矩形至少需要多少个邻近检测框才被保留。值越大,对误检的抑制越强,但也会漏掉一些真正的人脸(尤其当人脸被遮挡或角度不佳时)。常用范围 3~6,这里设置为 9 较为严格,适合高精度需求。
minSize=(8,8):检测目标的最小尺寸(像素)。小于该尺寸的人脸会被忽略,可以加快检测速度并过滤噪声。这里 8×8 非常小,几乎能检测任何微小人脸(但实际效果受模型训练尺度影响)。
输出faces是一个二维数组,例如 [[112, 45, 80, 80], [300, 150, 60, 60]]
3.5 绘制矩形框

遍历每个人脸矩形,在原图上绘制绿色边框。
cv2.rectangle()参数:图像、左上角坐标、右下角坐标、颜色(BGR,此处是绿色)、线宽。