1. 人脸检测基础
任务说明
本案例实现一个基于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。
运行步骤:
- 将代码保存为
face_detect.py; - 准备一张包含人脸的测试图片(如
test_face.jpg),放在同一目录; - 执行
python face_detect.py。
判定标准:
- 程序正常结束,无报错;
- 控制台输出检测到的人脸坐标与数量;
- 弹出窗口显示原图,人脸位置有绿色矩形框;
- 同目录下生成
output_faces.jpg,矩形框位置与显示一致。
注意事项
Haar Cascade对正面人脸检测效果较好,对侧脸、遮挡或光照不均的情况可能出现漏检。若检测效果不理想,可尝试调整scaleFactor至1.05~1.1之间,或降低minNeighbors至3~4,但误检率会相应上升。本案例仅处理静态单张图片,视频流检测需在循环中逐帧调用相同接口。