工作原理:
- 特征提取:使用Haar特征(一种矩形特征)来捕捉人脸的局部特征。例如,眼睛区域通常比脸颊暗,鼻梁比两侧亮,这些明暗差异可以被Haar特征捕获。
- 积分图加速:通过积分图技术快速计算任意矩形区域内像素值的和,大大提升了特征计算的速度。
- 级联分类:采用一种由多个简单分类器(“弱分类器”)串联组成的"级联"结构。检测窗口需要依次通过每一级分类器,任何一级不通过都会被立即丢弃,这使得系统能够快速排除图像中大量的非人脸区域,将计算资源集中在可能包含人脸的区域。
在实际使用中,你可能需要根据具体图片调整 detectMultiScale
的参数来优化检测效果:
- 如果漏检较多(特别是侧脸或较小的人脸):可以尝试**减小
scaleFactor
(如1.05)或减小minNeighbors
**(如3)。 - 如果误检较多(将非人脸的物体识别为人脸):可以尝试**增大
minNeighbors
**(如10或更高)。
import cv2
import numpy as np
def simple_face_detect(image_path):
"""
使用OpenCV Haar级联分类器进行人脸检测
"""
# 加载预训练的人脸检测器
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'
)
# 读取图片
img = cv2.imread(image_path)
if img is None:
raise ValueError(f"无法读取图片: {image_path}")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1,
minNeighbors=5, minSize=(30, 30))
results = []
for i, (x, y, w, h) in enumerate(faces):
# 转换格式为 [x1, y1, x2, y2]
x1, y1, x2, y2 = x, y, x+w, y+h
results.append([x1, y1, x2, y2])
# 绘制检测结果
cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.putText(img, f'Face {i+1}', (x, y-10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
# 显示结果
cv2.imshow('Haar Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
return results
# 使用示例
if __name__ == '__main__':
# 检测单张图片中的人脸
image_path = '1.jpg' # 替换为你的图片路径
face_boxes = simple_face_detect(image_path)
if face_boxes is not None:
for i, box in enumerate(face_boxes):
x1, y1, x2, y2 = box
print(f'人脸 {i+1}: 左上角({x1}, {y1}), 右下角({x2}, {y2})')
print(f'人脸 {i+1} 宽度: {x2-x1} 像素, 高度: {y2-y1} 像素')
else:
print('未检测到人脸')