基于Python与OpenCV的Haar特征结合Adaboost人脸识别实战

七月
七月
发布时间:2026-10-14 | 6人浏览过
原创

本文详解如何利用Python和OpenCV库实现基于Haar特征与Adaboost算法的人脸识别系统。内容涵盖Haar特征原理、积分图加速计算、Adaboost弱分类器训练流程,并提供从加载分类器到图像预处理、人脸及眼睛检测标记的完整代码示例,帮助开发者快速掌握传统机器学习在计算机视觉中的应用。

Haar特征原理与积分图加速

Haar特征

哈尔特征通过检测窗口内指定位置的相邻矩形区域,计算每个矩形内的像素总和,并取这些总和的差值作为特征值。利用这些差值,算法能够对图像的子区域进行分类判断。

常见的haar特征模板主要包括以下几种类型:

以第一个haar特征模板为例进行说明

计算方式

1. 特征值等于白色区域像素总和减去黑色区域像素总和(即白色区域像素之和减去黑色区域像素之和);

2. 特征值等于整个区域像素总和乘以权重加上黑色区域像素总和乘以权重。

使用haar模板处理图像的过程

从图像的起始位置开始,利用haar模板从左至右、从上至下遍历图像,同时设置合适的步长,并综合考虑图像尺寸与模板大小的关系。

假设当前处理一张 1080 * 720 分辨率的图像,使用 10*10 尺寸的haar模板,且步长设置为2。此时所需的计算量约为:(1080 / 2 * 720 / 2) * 100 * 模板数量 * 缩放系数,估算结果约为50亿至100亿次运算,计算量过于庞大。

积分图

引入积分图可以大幅减少运算时间,其核心原理是运用前缀和的概念来加速矩形区域像素和的计算。

Adaboost分类器算法流程

Adaboost分类器

Adaboost是一种迭代式算法,其核心思想是针对同一训练集训练多个不同的分类器(即弱分类器),随后将这些弱分类器组合起来,构建出一个性能更强的最终分类器(即强分类器)。

算法流程

该算法本质上是一个简单的弱分类算法提升过程,通过不断训练迭代,逐步提高对数据的分类能力。具体流程如下所示:

1. 首先通过对N个训练样本的学习,得到第一个弱分类器; 2. 将上一轮分错的样本与其他新数据重新组合,构成包含N个样本的新训练集,通过学习得到第二个弱分类器; 3. 将前两轮均分错的样本与其他新样本再次组合,构成另一个新的N个样本的训练集,通过学习得到第三个弱分类器; 4. 最终形成的强分类器,其分类结果由各个分类器的权值共同决定。

我们需要从官方资源下载两个Adaboost分类器文件,分别用于人脸检测和眼睛检测: 下载地址:https://github.com/opencv/opencv/tree/master/data/haarcascades


Python OpenCV代码实现

代码实现

实现人脸识别的基本步骤如下:

1. 加载分类器文件及输入图片; 2. 对图像进行灰度处理; 3. 提取haar特征; 4. 执行人脸检测; 5. 对检测结果进行标记。

我们使用 cv2.CascadeClassifier() 函数来加载预先下载好的分类器文件。

随后,调用 detectMultiScale() 方法来获取识别结果。


import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1.加载文件和图片 2.进行灰度处理 3.得到haar特征 4.检测人脸 5.标记

face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
img = cv2.imread('img.png')
cv2.imshow('img', img)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 1.灰色图像 2.缩放系数 3.目标大小
faces = face_xml.detectMultiScale(gray, 1.3, 5)
print('face = ',len(faces))
print(faces)
#绘制人脸,为人脸画方框
for (x,y,w,h) in faces:
  cv2.rectangle(img, (x,y), (x + w, y + h), (255,0,0), 2)
  roi_face = gray[y:y+h,x:x+w]
  roi_color = img[y:y+h,x:x+w]
  eyes = eye_xml.detectMultiScale(roi_face)
  print('eyes = ',len(eyes))
  for (ex,ey,ew,eh) in eyes:
    cv2.rectangle(roi_color, (ex,ey),(ex + ew, ey + eh), (0,255,0), 2)
cv2.imshow('dat', img)
cv2.waitKey(0)

face = 1
[[133 82 94 94]]
eyes = 2


至此,关于使用Python和cv2实现基于Haar特征与Adaboost的人脸识别示例介绍完毕。如需了解更多关于Python cv2人脸识别的内容,请搜索本站历史文章或继续浏览后续相关文章,希望大家以后多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表