1. 算法理论介绍
haar-like特征:haar(哈尔)特征分为3类:边缘特征、线性特征、中心特征和对角线特征,组成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。
通过改变特征模板的大小和位置,可在图像子窗口中穷举出大量的特征。特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为”矩形特征“;特征的值称为“特征值”。矩形特征值是矩形模板类别、矩形位置和矩形大小这三个因素的函数。
2.Haar-like特征的计算---积分图
积分图就是只便利一次图像就可以求出图像所有区域像素和的快速算法。积分图的主要思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和。
积分图是一种能够描述全局信息的矩阵表示方法。积分图的构造方式是:位置(i,j)处的值是原图像(i,j)左上角方向所有像素的和。
3.计算Haar特征值
该矩形特征的特征值为:区域A的像素值减去区域B的像素值。
区域A的像素值:
区域B的像素值:
所以该区域的像素值为:
矩形的特行值,只与特征矩阵的端点的积分图有关,而与图像的坐标无关。
4. Haar特征值归一化
不同尺度的Haar特征计算出的特征值变化范围非常大,这种跨度大的特性不利于量化评定特征值,所以需要进行“归一化”,压缩特征值范围。
5.级联分类器
其中每一个stage都代表一级强分类器。强分类器是树状结构,强分类器中的每一个弱分类器也是树状结构。只有正样本才会送到下一个强分类器进行校验。
Harr分类器训练步骤:
1. 准备人脸、非人脸样本集
2.计算特征值和积分图
3.筛选出T个优秀的特征值(即最优弱分类器)
4.把这T个最优弱分类器传给AdaBoost进行训练
5.级联,也就是强分类器的强强联手
6. 代码实现
安装opencv-python后,搜索haarcascade_frontalface_default.xml。将其所在的data文件夹拷贝到当前项目路径下,创建py文件:
静态图像检测
import cv2
import numpyas np
haar_front_face_xml ='./data/haarcascades/haarcascade_frontalface_default.xml'
haar_eye_xml ='./data/haarcascades/haarcascade_eye'
# 1. 静态图像中的人脸检测
def StaticDetect(filename):
#创建一个级联分类器 加载一个xml分类器文件 它既可以是haar特征页可以是LBP特征的分类器
face_cascade = cv2.CascadeClassifier(haar_front_face_xml)
# 加载图像
img = cv2.imread(filename)
#转换为灰度图
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#进行人脸检测 传入scaleFactor,minNegihbors 分别表示人脸检测过程中每次迭代时图像的压缩率以及
#每个人脸矩形保留近似数目的最小值
#返回人脸矩形数组
faces = face_cascade.detectMultiScale(gray_img, 1.3, 5)
for(x, y, w, h)in faces:
#在原图像上绘制矩形
img = cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
cv2.namedWindow('face detected!')
cv2.imshow('face detected', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
StaticDetect('ppp.jpg')
检测结果: