1. 人脸检测基础

人脸检测基础:使用OpenCV Haar Cascade 学习卡片

任务说明

本案例实现一个基于OpenCV Haar Cascade的静态图像人脸检测器。输入一张包含人脸的图片,程序输出标注了人脸边界框的结果图片,并在控制台打印检测到的人脸数量与坐标信息。

实现方案

使用OpenCV预训练的Haar级联分类器haarcascade_frontalface_default.xml完成检测。核心流程为:加载分类器→读取图像→转为灰度图→执行检测→绘制矩形框→保存并显示结果。检测参数中scaleFactor=1.1控制每层缩放比例,minNeighbors=5用于过滤误检,minSize=(30,30)忽略小于该尺寸的候选区域。

代码实现

import cv2

# 加载Haar级联分类器(OpenCV自带预训练模型)
cascade_path = cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
face_cascade = cv2.CascadeClassifier(cascade_path)

# 读取输入图像(请将图片放在与本脚本相同目录)
img_path = 'test_face.jpg'
img = cv2.imread(img_path)
if img is None:
    raise FileNotFoundError(f'无法读取图像: {img_path},请检查文件路径')

# 转为灰度图(Haar特征在灰度图上计算)
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)
    print(f'检测到人脸: x={x}, y={y}, width={w}, height={h}')

print(f'共检测到 {len(faces)} 张人脸')

# 保存结果并显示
output_path = 'output_faces.jpg'
cv2.imwrite(output_path, img)
print(f'结果已保存至: {output_path}')

cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行与验证

依赖安装:确保Python环境已安装OpenCV库,执行pip install opencv-python。

运行步骤:

  1. 将代码保存为face_detect.py;
  2. 准备一张包含人脸的测试图片(如test_face.jpg),放在同一目录;
  3. 执行python face_detect.py。

判定标准:

  • 程序正常结束,无报错;
  • 控制台输出检测到的人脸坐标与数量;
  • 弹出窗口显示原图,人脸位置有绿色矩形框;
  • 同目录下生成output_faces.jpg,矩形框位置与显示一致。
Haar Cascade 人脸检测流程 输入图像 test_face.jpg 灰度转换 cvtColor Haar级联检测 detectMultiScale 绘制边界框 rectangle 输出结果 output_faces.jpg + 坐标信息 关键参数 scaleFactor=1.1 — 每层图像缩放比例,越小检测越精细但更慢 minNeighbors=5 — 每个候选区域至少保留5个邻近检测,过滤误检 minSize=(30,30) — 忽略小于30×30像素的候选区域

注意事项

Haar Cascade对正面人脸检测效果较好,对侧脸、遮挡或光照不均的情况可能出现漏检。若检测效果不理想,可尝试调整scaleFactor至1.05~1.1之间,或降低minNeighbors至3~4,但误检率会相应上升。本案例仅处理静态单张图片,视频流检测需在循环中逐帧调用相同接口。