haar特征(转)
转载链接:http://blog.csdn.net/lanxuecc/article/details/52222369
Haar特征
Haar特征原理综述
Haar特征是一种反映图像的灰度变化的,像素分模块求差值的一种特征。它分为三类:边缘特征、线性特征、中心特征和对角线特征。用黑白两种矩形框组合成特征模板,在特征模板内用 黑色矩形像素和 减去 白色矩形像素和来表示这个模版的特征值。例如:脸部的一些特征能由矩形模块差值特征简单的描述,如:眼睛要比脸颊颜色要深,鼻梁两侧比鼻梁颜色要深,嘴巴比周围颜色要深等。但矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述在特定方向(水平、垂直、对角)上有明显像素模块梯度变化的图像结构。
如上图A、B、D模块的图像Haar特征为:v=Sum白-Sum黑
C 模块的图像Haar特征为:v=Sum白(左)+Sum白(右)-2*Sum黑
这里要保证白色矩形模块中的像素与黑色矩形的模块的像素数相同,所以乘2
对于一幅图像来说,可以通过通过改变特征模板的大小和位置,可穷举出大量的特征来表示一幅图像。上图的特征模板称为“特征原型”;特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。例如在24*24大小的图像中可以以坐标(0,0)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,2)开始宽为20高为20矩形模版计算上图A特征,也可以以坐标(0,0)开始宽为22高为22矩形模版计算上图A特征,这样矩形特征值随着类别、大小和位置的变化,使得很小的一幅很小的图像含有非常多的矩形特征。矩形特征值是矩形模版类别、矩形位置和矩形大小这三个因素的函数。
Haar特征计算方法
首先介绍下积分图:如下述代码所示,是opencv中存储图像积分图的结构体,可以看到有两种积分图sum积分图,titled sum积分图。sum积分图用来计算一般的垂直或水平的矩形特征,如下面的(a)、(b)、(c)、(d)。。。,而titled sum积分图用来计算倾斜45度的积分图,如下面的(1c)、(1d)、(2c)。。。
/* Prepared for training samples */
typedef struct CvHaarTrainingData
{
CvSize winsize; /* training image size */
int maxnum; /* maximum number of samples */
CvMat sum; /* sum images (each row represents image) */
CvMat tilted; /* tilted sum images (each row represents image) */
CvMat normfactor; /* normalization factor */
CvMat cls; /* classes. 1.0 - object, 0.0 - background */
CvMat weights; /* weights */
CvMat* valcache; /* precalculated feature values (CV_32FC1) */
CvMat* idxcache; /* presorted indices (CV_IDX_MAT_TYPE) */
} CvHaarTrainigData;
sum积分图主要的思想是将图像从起点开始到各个点所形成的矩形区域像素之和作为一个数组的元素保存在内存中,当要计算某个区域的像素和时可以直接索引数组的元素,不用重新计算这个区域的像素和。例如:对一个X*Y图像它的积分图也是一个X*Y的元素为int型的积分图,对应积分图中(x,y)位置值表示就是原图像矩形框[(0,0), (x,y)]内所有像素的和。如下图所示:
用公式表示: 其中p(i,j)表示原图在(i,j)位置像素值,f(x,y)表示积分图在(x,y)位置值
积分图能够在多种尺度下,使用相同的时间(常数时间)来计算不同的特征,因此大大提高了检测速度。如下图所示图片不位置不同大小矩形框的两个A特征,他们的计算方式分别为:
[f(x,y)+f(i,j)-f(s,t)-f(l,m)]-[f(s,t)+f(h,k)-f(i,j)-f(n,o)]
[f(X,Y])+f(I,J)-f(S,T)-f(L,M)]-[f(S,T)+f(H,K)-f(I,J)-f(N,O)]
可见两个不同大小的特征计算量却一样!!!
titled sum类积分图计算的是45°旋角的矩形特征。为了便于计算45°旋角的矩形特征,我们定义titled sum类积分图中(x,y)点值为RSAT(x,y),它表示原始图像中(x,y)左上角45°区域和左下角45°区域的像素和。
用公式表示如下:
对于每一点的积分图计算方法有如下递推公式 ,来节约性能,减少生重复计算:
而计算矩阵特征的特征值,是位于十字行矩形RSAT(x,y)之差。如下图的矩形特征为:
[RSAT(m,n)-RSAT(i,j)-RSAT(k,l)+RSAT(s,t)]-[RSAT(o,p)-RSAT(m,n)-RSAT(x,y)+RSAT(k,l)]
同理,该积分图也能够在多种尺度下,使用相同的时间(常数时间)来计算不同的45度矩形特征。
Haar特征对应的opencv源码
Viola提出的haar特征:
Lienhart等牛们提出的Haar-like特征:
opencv源码中负责创建几种haar特征的是函数icvCreateIntHaarFeatures, 在进入分类器训练函数后执行该函数,它根据大小为winsize的图,计算所有HaarFeature的rect的顶点坐标来确定特征并将它存入CvIntHaarFeatures结构体数组中。后续针对不同的图像只需用这些矩形框的顶点来获得积分图在该点的值就可以计算也图像该特征的具体值了。symmetric为0时表示创建所有特征,为1时表示目标图形是垂直对称的所以只需创建所有中心在左半边部位的特征。mode==0表示Viola提出的原始矩形特征,mode==1表示所有垂直的haar特征,mode==2表示所有特征
具体每种特征的名称如下图::
后面原文中还有opencv中的相关源码链接,最后总结一下:
haar特征说是使用灰度差值,其本质我觉得还是相当于边缘特征和连通域特征的结合,想法还是创新性的,引入的积分图的思想来计算灰度差值,正好对于任意尺度任意位置的特征计算量都是相同的,从而只需使用一个结构体数组来存储,然后用查询的方法来计算,大大提高了效率~
haar特征(转)的更多相关文章
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征(转载)
(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...
- Haar特征
转自:http://blog.csdn.net/carson2005/article/details/8094699 Haar-like特征,即很多人常说的Haar特征,是计算机视觉领域一种常用的特征 ...
- 目标检测的图像特征提取之(三)Haar特征
1.Haar-like特征 Haar-like特征最早是由Papageorgiou等应用于人脸表示,Viola和Jones在此基础上,使用3种类型4种形式的特征. Haar特征分为三类:边缘特征.线性 ...
- 图像特征提取三大法宝:HOG特征,LBP特征,Haar特征
(一)HOG特征 1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和 ...
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
原地址:http://blog.csdn.net/watkinsong/article/details/7631241 目前因为做人脸识别的一个小项目,用到了AdaBoost的人脸识别算法,因为在网上 ...
- 基于Haar特征Adaboost人脸检测级联分类
基于Haar特征Adaboost人脸检测级联分类 基于Haar特征Adaboost人脸检测级联分类,称haar分类器. 通过这个算法的名字,我们能够看到这个算法事实上包括了几个关键点:Haar特征.A ...
- AI Haar特征
Haar特征,也叫矩形特征,有四种特征(模板):边缘特征.线性特征.中心特征.对角线特征.每种模板都包含黑白两种区域. 模板的特征值=白色区域的像素和-黑色区域的像素和,反映的是图像的灰度变化情况. ...
- 【图像处理】计算Haar特征个数
http://blog.csdn.net/xiaowei_cqu/article/details/8216109 Haar特征/矩形特征 Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去 ...
- 基于Haar特征的Adaboost级联人脸检测分类器
基于Haar特征的Adaboost级联人脸检测分类器基于Haar特征的Adaboost级联人脸检测分类器,简称haar分类器.通过这个算法的名字,我们可以看到这个算法其实包含了几个关键点:Haar特征 ...
随机推荐
- 开源工作流程引擎ccflow多人待办处理模式的详解
多人待办工作处理模式,也是待办处理模式.是当接受的节点是多个人的时候,如何处理待办? 根据不用的场景,ccbpm把多人在普通节点下的处理模式分为如下几种. 抢办模式: A发送到B ,B节点上有n个人可 ...
- Python的二叉树实现
二叉树需要实现的功能及思路 找到最小值 没什么好说的就是二叉树最左下的顶点 找到最大值 没什么好说的就是二叉树最右下的顶点 插入 分情况,如果二叉树为空那么直接直接设置成根节点就好了.否则就逐层向下, ...
- 安装workflowmanager 1.0 server
1· 下载安装 Web Platform Installer v4 Command Line (WebPICMD.exe) Tool.(http://download.microsoft.com/do ...
- Android 友盟SDK 终极解决报错:SocialSDK_QQZone_2.jar contains native libraries that
转自:http://bbs.umeng.com/thread-6552-1-2.html 报错信息:The library `SocialSDK_QQZone_2.jar` contains nati ...
- Android设置RadioButton在文字的右边
效果图如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro ...
- Ubuntu 13.04下构建Qt5开发环境
虽然Qt命运多舛,但是也阻挡不了程序员对它的喜爱.经历了一系列波折之后,现在到在芬兰公司Digia手中,Qt又将迎来一个发展.Qt5就是在这种情况之下发布的.正值Ubuntu刚刚发布了13.04版,我 ...
- centos6.5安装jdk(解压tar.gz)
0.说明 下载jdk文件包jdk-7u79-linux-x64.tar.gz. 1.环境清理(系统自带的OpenJDK) 1.1 查看OpenJDK的安装包 $ rpm -qa |grep java ...
- C#基础 常用语&数据类型定义&类型转换
int temp = Console.Read(); Console.WriteLine(temp); Console.Read(); Console.Write(" ");直接 ...
- 迭代器_iter_,生成器yeild,三元运算,列表解析(十三)
迭代器: l = [1, 2, 3, 4] iter = l.__iter__() print(iter) print(iter.__next__()) print(iter.__next__()) ...
- cdn模式下vue的基本用法
我们知道jq是简化了dom操作,而react和vue则是通过使用虚拟dom的方式,不需要频繁的更改ui界面,而是通过更改数据的方式来更新界面. 我们知道些jq插件时会在IFFE中传入jQuery,jQ ...