OpenCV 从零学习 · 第 17 讲:人脸检测
函数:cv2.CascadeClassifier / detectMultiScale | 难度:★★☆☆☆
人脸检测是计算机视觉的"hello world"。OpenCV 自带训练好的 Haar 级联分类器,加载一个 .xml 模型文件,调用 detectMultiScale 就能在一张图里找出所有人脸并框出来。无需训练、开箱即用,适合入门和实时场景。
一、加载分类器并检测
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(
gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
| 参数 | 含义 |
scaleFactor | 图像缩放步长,>1(如 1.1);越小越准越慢 |
minNeighbors | 候选框保留所需邻数,越大越严(去误检) |
minSize | 最小目标尺寸,过滤太小的框 |
返回 numpy 数组,每行是 (x, y, w, h),可遍历画框。cv2.data.haarcascades 是 OpenCV 自带模型目录,免得自己找路径。
场景 A · 图片人脸框 + 计数
len(faces) 就是人数,遍历画绿框。合影人数统计的最简实现。
场景 B · 接第 16 讲做实时人脸
把检测放进摄像头循环,逐帧框脸——经典"实时人脸追踪"demo,可顺便统计画面里出现的人数。
把检测放进摄像头循环,逐帧框脸——经典"实时人脸追踪"demo,可顺便统计画面里出现的人数。
场景 C · 眼睛 / 笑脸检测
同级联还有
同级联还有
haarcascade_eye.xml、haarcascade_smile.xml,对同一张人脸区域再做一次检测即可做"睁眼/微笑"判断。
⚠ 新手必踩坑
detectMultiScale吃灰度图,传彩色会报错或结果异常。- 分类器文件路径必须存在;用
cv2.data.haarcascades + 文件名最稳,别硬编码本地绝对路径。 scaleFactor太小(如 1.01)极慢,太大(如 1.5)会漏检,常用 1.1~1.3。- Haar 只认"正脸",侧脸/遮挡/太远效果差;精度要求高请升级 DNN 人脸检测(后续进阶)。
本讲要点
CascadeClassifier加载 xml,detectMultiScale返回 (x,y,w,h) 列表。- 输入灰度图;
scaleFactor/minNeighbors/minSize调严谨度。 - 开箱即用、可实时;缺点是正脸专用、精度有限。
下一讲:第 18 讲 · 霍夫变换(HoughLines / HoughCircles)——检测直线和圆,用于车道线、表格线、圆孔计数。
