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

验证方法与判定标准

运行程序后,观察终端输出的人脸数量。判定标准如下:

  1. 程序正常结束且无异常报错;
  2. 输出图像result.jpg已生成;
  3. 打开输出图像,图像中每张正脸(正面、光线充足)均被绿色矩形框准确框出,且无明显误检(如将非人脸区域框出)。

若检测效果不理想,可调整detectMultiScale参数:增大minNeighbors可减少误检,减小scaleFactor可提高检测精度但降低速度。

Haar级联人脸检测器处理流程 输入图像 test.jpg (彩色/BGR) 灰度转换 cvtColor BGR → Gray Haar级联检测 detectMultiScale scaleFactor=1.1 minNeighbors=5 minSize=(30,30) 绘制检测框 rectangle 绿色 (0,255,0) 输出图像 result.jpg 带检测框 返回人脸数量 关键参数说明: scaleFactor=1.1 → 每次检测窗口缩放10%,值越小精度越高但速度越慢 minNeighbors=5 → 每个候选区域需被5个邻近窗口确认,值越大误检越少

预期输出示例

对于一张包含3张正脸的测试图像,程序运行后终端输出:

检测到 3 张人脸,结果已保存至: result.jpg

输出图像中每张人脸周围将出现一个绿色矩形框。实际检测数量取决于输入图像中的人脸数量、姿态和光照条件。