Haar-like是一种非常经典的特征提取算法,尤其是它与AdaBoost组合使用时对人脸检测有着不错的效果,虽然只是在当时而言。OpenCV也对AdaBoost与Haar-like组成的级联人脸检测做了封装,所以一般提及Haar-like的时候,一般都会和AdaBoost,级联分类器,人脸检测,积分图等等一同出现。但是Haar-like本质上只是一种特征提取算法,下面我们只从特征提取的角度聊一聊Haar-like。它一共涉及到3篇经典的论文。
基本haar特征
最原始的Haar-like特征在2002年的《A general framework for object detection》提出,它定义了四个基本特征结构,如下A,B,C,D所示,可以将它们理解成为一个窗口,这个窗口将在图像中做步长为1的滑动,最终遍历整个图像。
比较特殊的一点是,当一次遍历结束后,窗口将在宽度或长度上成比例的放大,再重复之前遍历的步骤,直到放大到最后一个比例后结束。
那么可以放大的比例系数如何确定呢?设在宽度上可以放大的最大倍数为 Kw K w ,高度上可以放大的最大倍数为 Kh K h ,计算公式如下:
其中 wI w I 和 hI h I 是整个图像的宽高, wwin w w i n 和 hwin h w i n 是haar窗口的初始宽高,可以放大的倍数为 Kw⋅Kh K w ⋅ K h 。
Haar-like特征提取过程就是利用上面定义的窗口在图像中滑动,滑动到一个位置的时候,将窗口覆盖住的区域中的白色位置对应的像素值的和减去黑色位置对应的像素值的和,得到的一个数值就是haar特征中一个维度。
其中对于窗口C,黑色区域的像素值加和要乘以2,2是为了像素点个数相同而增加的权重。
扩展haar特征
积分图计算
区域D的像素值和 sumD s u m D 就应该为 integral1,4 i n t e g r a l 1 , 4 ,但是注意,自积分图中是没有从点1到点4的概念的,它所有的起点都应该是点0,所以:
转化一下就是
上面的内容就是积分图,比如说我们要求 sumD s u m D ,并不需要从点1到点4做行列的遍历,因为这个遍历过程的时间复杂度是O(mn)的。我们只需要先存在下来从0到点1,2,3,4的积分图,然后做一个简单的加减法就好了,这个时间复杂度仅仅为O(1)。当然了,存储的过程是消耗空间复杂度的,这是很典型的空间换时间的套路。这就是上面提到的积分图加速计算的过程,那么它和Haar有啥关系呢?
我们注意到,积分图是在计算一个区域内所有点的像素值的和,Harr的特征提取过程也是这样啊,它们本质上在做一个东西而已,积分图那套东西,搬到Haar特征计算上完全不需要一点改的啊。
比如上面这样图所示的Haar窗口,滑动到了当前位置,我们要计算此时的Haar特征,它是区域A+C的像素值的和减去区域B的:
于是,就计算出了当前的Haar特征。
维度计算
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211693.html原文链接:https://javaforall.net
