1. 人脸检测器搭建
任务说明
本案例的目标是使用OpenCV的Haar级联分类器,对输入图像中的人脸进行检测,并在图像上绘制矩形检测框,最终将结果保存为输出图像。实现将采用OpenCV预训练的Haar级联模型,无需额外训练数据,适合作为人脸识别系统的第一步——人脸检测器搭建。
实现方案
核心实现包含以下步骤:加载预训练的Haar级联分类器文件(haarcascade_frontalface_default.xml),读取输入图像并转换为灰度图,调用detectMultiScale方法检测人脸区域,最后在原图上绘制绿色矩形框并保存结果。代码将封装为可复用的函数detect_faces,支持通过命令行参数指定输入图像路径。
代码实现
import cv2
import sys
import os
def detect_faces(input_path, output_path="output.jpg"):
"""
使用Haar级联分类器检测图像中的人脸并绘制检测框。
参数:
input_path: 输入图像路径
output_path: 输出图像保存路径
返回:
检测到的人脸数量
"""
# 加载预训练Haar级联分类器
cascade_path = cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(cascade_path)
# 检查分类器是否加载成功
if face_cascade.empty():
raise IOError("无法加载Haar级联分类器文件,请检查OpenCV安装完整性")
# 读取输入图像
img = cv2.imread(input_path)
if img is None:
raise FileNotFoundError(f"无法读取图像文件: {input_path}")
# 转换为灰度图(Haar特征检测需要灰度图像)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 执行人脸检测
# 参数说明:
# scaleFactor=1.1: 每次缩放图像的比例
# minNeighbors=5: 每个候选矩形需要保留的邻近矩形数量
# minSize=(30, 30): 最小人脸尺寸
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.imwrite(output_path, img)
print(f"检测到 {len(faces)} 张人脸,结果已保存至: {output_path}")
return len(faces)
if __name__ == "__main__":
# 命令行入口: python face_detector.py <输入图像路径> [输出图像路径]
if len(sys.argv) < 2:
print("用法: python face_detector.py <输入图像路径> [输出图像路径]")
sys.exit(1)
input_image = sys.argv[1]
output_image = sys.argv[2] if len(sys.argv) > 2 else "output.jpg"
detect_faces(input_image, output_image)
落地与运行
依赖安装:确保Python环境已安装OpenCV库,执行以下命令:
pip install opencv-python
运行方式:将上述代码保存为face_detector.py,准备一张包含人脸的测试图像(如test.jpg),在终端执行:
python face_detector.py test.jpg result.jpg
验证方法与判定标准
运行程序后,观察终端输出的人脸数量。判定标准如下:
- 程序正常结束且无异常报错;
- 输出图像
result.jpg已生成; - 打开输出图像,图像中每张正脸(正面、光线充足)均被绿色矩形框准确框出,且无明显误检(如将非人脸区域框出)。
若检测效果不理想,可调整detectMultiScale参数:增大minNeighbors可减少误检,减小scaleFactor可提高检测精度但降低速度。
预期输出示例
对于一张包含3张正脸的测试图像,程序运行后终端输出:
检测到 3 张人脸,结果已保存至: result.jpg
输出图像中每张人脸周围将出现一个绿色矩形框。实际检测数量取决于输入图像中的人脸数量、姿态和光照条件。