在这行代码中:
face_cascade = cv2.CascadeClassifier(FACE_DETECT_PATH)
face_cascade
是一个 cv2.CascadeClassifier
对象,FACE_DETECT_PATH
是预训练的特征分类器模型文件的路径,例如 haarcascade_frontalface_alt.xml
。这个对象将用于在图像中检测人脸或其他对象。
预训练特征分类器
预训练特征分类器是一种通过机器学习方法训练出来的模型,能够识别特定的对象(例如人脸)。训练过程使用了大量标记为正样本(包含目标对象)和负样本(不包含目标对象)的图像。
主要概念
Haar 特征:
- Haar 特征是一种简单的矩形特征,用于描述图像中不同区域的像素强度差异。例如,边缘特征、线特征和四角特征。
积分图像:
- 积分图像用于快速计算矩形区域内的像素和,从而加速特征计算过程。积分图像的计算时间与图像大小无关,因此非常高效。
AdaBoost 算法:
- AdaBoost 是一种提升算法,用于选择最有辨别力的特征并组合成一个强分类器。通过多次迭代,从特征集中选择若干弱分类器,并赋予它们不同的权重。
级联分类器:
- 级联分类器由多个阶段组成,每个阶段包含若干个弱分类器。输入图像区域逐级通过这些分类器,如果某个阶段判断为非目标对象,则立即丢弃该区域,减少计算量。如果通过所有阶段,则认为该区域包含目标对象。
具体示例
以下是如何使用预训练的 Haar 特征级联分类器进行人脸检测的完整代码示例:
import cv2
# 定义预训练模型文件路径
FACE_DETECT_PATH = cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml'
# 创建 Haar 特征级联分类器对象
face_cascade = cv2.CascadeClassifier(FACE_DETECT_PATH)
# 加载图像并转换为灰度图像
image = cv2.imread('path_to_image.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用分类器检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=4, flags=cv2.CASCADE_SCALE_IMAGE, minSize=(30, 30))
# 绘制检测到的人脸矩形框
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示结果图像
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码说明
加载预训练模型文件:
FACE_DETECT_PATH = cv2.data.haarcascades + 'haarcascade_frontalface_alt.xml'
FACE_DETECT_PATH
是存储预训练模型文件的路径。创建 Haar 特征级联分类器对象:
face_cascade = cv2.CascadeClassifier(FACE_DETECT_PATH)
face_cascade
是一个cv2.CascadeClassifier
对象,加载了预训练的模型文件。加载图像并转换为灰度图像:
image = cv2.imread('path_to_image.jpg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
使用分类器检测人脸:
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=4, flags=cv2.CASCADE_SCALE_IMAGE, minSize=(30, 30))
detectMultiScale
方法检测图像中的人脸,返回一个包含每个检测到的人脸的矩形框列表。绘制检测到的人脸矩形框:
for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
显示结果图像:
cv2.imshow('Detected Faces', image) cv2.waitKey(0) cv2.destroyAllWindows()