opencv使用Haar级联分类器进行人脸检测

OpenCV Haar级联人脸检测

工作原理​:

  1. 特征提取​:使用Haar特征(一种矩形特征)来捕捉人脸的局部特征。例如,眼睛区域通常比脸颊暗,鼻梁比两侧亮,这些明暗差异可以被Haar特征捕获。
  2. 积分图加速​:通过积分图技术快速计算任意矩形区域内像素值的和,大大提升了特征计算的速度。
  3. 级联分类​:采用一种由多个简单分类器(“弱分类器”)串联组成的"级联"结构。检测窗口需要依次通过每一级分类器,任何一级不通过都会被立即丢弃,这使得系统能够快速排除图像中大量的非人脸区域,将计算资源集中在可能包含人脸的区域。

在实际使用中,你可能需要根据具体图片调整 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('未检测到人脸')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值