【OpenCV】计算Haar特征个数
2013-03-04 10:27
239 查看
最早的Haar特征由Papageorgiou C.等提出(《A general framework for object detection》),后来Paul Viola和Michal Jones提出利用积分图像法快速计算Haar特征的方法(《Rapid
object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set
of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。
Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去白色矩形所有像素值的和。
看过Rainer Lienhart文章的人知道,Rainer Lienhart在文章中给出了计算特定图像面积内Haar特征个数公式。小女才拙,到最后也没推出那个公式来,还望看明白的大牛留言指教~
其中,
为图片大小,
为矩形特征大小,
表示矩形特征在水平和垂直方向的能放大的最大比例系数。
对于45°的rotated特征(如1(c)和1(d)),w,h表示如下图所示:
其计算公式为:
*论文中没有说明,个人认为此处除了Z,XY值也有变化:
首先有两点要清楚:
1、对于某特定大小的特征,在窗口内滑动计算。
也就是如图1(a)特征大小为2*1,对于24*24的图像。水平可滑动23步,垂直滑动24步,所以共有23*24个特征。
2、对于一个特征,特征本身沿水平、竖直方向分别缩放。
还看特征1(a),特征大小为2*1,则延水平方向可放大为:4*1,6*1,8*1,…,24*1;竖直方向可放大为:2*1,2*2,2*3,…,2*24。即每个特征有XY种放大方式。(!放大的矩形特征并限制保持2:1的比例!)
清楚这两点,就很容易写出计算特征个数的代码:
[html] view
plaincopy
int getHaarCount(int W,int H,int w,int h){
int X=W/w;
int Y=H/h;
int count=0;
//放大Haar特征到 iw*jh
for (int i=1;i<=X;i++)
for(int j=1;j<=Y;j++)
//滑动iw*jh矩形,遍历图像计算每个位置Haar特征
for(int x=1;x<=W-i*w+1;x++)
for(int y=1;y<=H-j*h+1;y++)
count++;
return count;
}
对于45°特征,由于Rainer Lienhart定义的w,h与原矩阵含义不同(参见第一幅图),即实际滑动的矩阵框为(h+w)*(w+h)。
所以只要用如下方式调用原函数:
[html] view
plaincopy
getHaarCount(W,H,h+w,w+h);
当然如果你喜欢写代码,也可以写个新的函数:
[html] view
plaincopy
int getRotatedHaarCount(int W,int H,int w,int h){
int X=W/(w+h);//计算新的X
int Y=H/(w+h);//计算新的Y
int count=0;
for (int i=1;i<=X;i++)
for(int j=1;j<=Y;j++)
//注意这里滑动窗口边界变化
for(int x=1;x<=W-i*(w+h)+1;x++)
for(int y=1;y<=H-j*(w+h)+1;y++)
count++;
return count;
}
可以看到和论文用公式计算得到的值是一致的~
特征个数虽然很大,但很有规律,不用程序用笔也很容易推出递推公式。
如1(a)和1(b)特征递推为:(12^2)*(1+2+...+24)=43,200
具体参见此贴:Re: [OpenCV] Re: Number of haar features
object detection using a boosted cascade of simple features》)。之后,Rainer Lienhart 和 Jochen Maydt用对角特征对Haar特征库进行了扩展(《An extended set
of Haar-like features for rapid object detection》)。OpenCV的Haar分类器就是基于扩展后的特征库实现的。
Haar特征/矩形特征
Haar特征本身并不复杂,就是用图中黑色矩形所有像素值的和减去白色矩形所有像素值的和。看过Rainer Lienhart文章的人知道,Rainer Lienhart在文章中给出了计算特定图像面积内Haar特征个数公式。小女才拙,到最后也没推出那个公式来,还望看明白的大牛留言指教~
Haar特征个数计算
Rainer Lienhart计算Haar特征个数的公式:
其中,
为图片大小,
为矩形特征大小,
表示矩形特征在水平和垂直方向的能放大的最大比例系数。
对于45°的rotated特征(如1(c)和1(d)),w,h表示如下图所示:
其计算公式为:
*论文中没有说明,个人认为此处除了Z,XY值也有变化:
下面是我理解的计算过程~
首先有两点要清楚:1、对于某特定大小的特征,在窗口内滑动计算。
也就是如图1(a)特征大小为2*1,对于24*24的图像。水平可滑动23步,垂直滑动24步,所以共有23*24个特征。
2、对于一个特征,特征本身沿水平、竖直方向分别缩放。
还看特征1(a),特征大小为2*1,则延水平方向可放大为:4*1,6*1,8*1,…,24*1;竖直方向可放大为:2*1,2*2,2*3,…,2*24。即每个特征有XY种放大方式。(!放大的矩形特征并限制保持2:1的比例!)
清楚这两点,就很容易写出计算特征个数的代码:
[html] view
plaincopy
int getHaarCount(int W,int H,int w,int h){
int X=W/w;
int Y=H/h;
int count=0;
//放大Haar特征到 iw*jh
for (int i=1;i<=X;i++)
for(int j=1;j<=Y;j++)
//滑动iw*jh矩形,遍历图像计算每个位置Haar特征
for(int x=1;x<=W-i*w+1;x++)
for(int y=1;y<=H-j*h+1;y++)
count++;
return count;
}
对于45°特征,由于Rainer Lienhart定义的w,h与原矩阵含义不同(参见第一幅图),即实际滑动的矩阵框为(h+w)*(w+h)。
所以只要用如下方式调用原函数:
[html] view
plaincopy
getHaarCount(W,H,h+w,w+h);
当然如果你喜欢写代码,也可以写个新的函数:
[html] view
plaincopy
int getRotatedHaarCount(int W,int H,int w,int h){
int X=W/(w+h);//计算新的X
int Y=H/(w+h);//计算新的Y
int count=0;
for (int i=1;i<=X;i++)
for(int j=1;j<=Y;j++)
//注意这里滑动窗口边界变化
for(int x=1;x<=W-i*(w+h)+1;x++)
for(int y=1;y<=H-j*(w+h)+1;y++)
count++;
return count;
}
计算在24*24的图片中,几种特征的个数为:
可以看到和论文用公式计算得到的值是一致的~
另一种递推计算方法:
特征个数虽然很大,但很有规律,不用程序用笔也很容易推出递推公式。如1(a)和1(b)特征递推为:(12^2)*(1+2+...+24)=43,200
具体参见此贴:Re: [OpenCV] Re: Number of haar features
(转载请注明作者和出处:http://blog.csdn.net/xiaowei_cqu 未经允许请勿用于商业用途)
相关文章推荐
- 【OpenCV】计算Haar特征个数
- 【人脸检测:Haar】计算Haar特征个数(一)
- 【Paper】利用积分图像法快速计算Haar特征
- OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己
- Adaboost应用系列之一:Opencv2.0中利用Adaboost训练Haar特征产生xml分类器
- 计算Haar特征个数
- opencv 利用类haar小波特征的人脸、人眼等特征检测(带代码)
- OpenCV Haar特征分类器的训练
- 使用opencv作物件识别(一) —— 积分直方图加速HOG特征计算
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别 标签: 脸部识别opencv 2017-07-03 21:38 26人阅读
- 【人脸检测:Haar】利用积分图像法快速计算Haar特征(二)
- 【图像处理】计算Haar特征个数
- 人脸检测——OpenCV的分类器的haar特征数据
- OpenCV中Haar-like特征人脸检测函数介绍
- python 计算积分图和haar特征
- 【OpenCV】基于Adaboost和Haar-like特征人脸识别
- opencv中haar特征检测人脸(适合小白)
- opencv之haar特征+AdaBoos分类器算法流程(二)
- opencv之haar特征+AdaBoos分类器算法流程(三)
- 使用OpenCV的Haar特征训练身份证级联分类器