OpenCV中的Haar+Adaboost(二):积分图和45°旋转积分图
2017-08-11 12:16
435 查看
缩进前一篇文章分析了Haar特征,即通过“平移+放大”能够产生一系列数量巨大的Haar子特征,同时给出了Haar特征值计算公式。那么这就有一个问题:如何快速的计算出图像任意位置的某个Haar特征值?这就需要用到本节介绍的积分图。
缩进以OpenCV自带的人脸分类器haarcascade_frontalface_alt2.xml为例,其中存储了超过1000个大小和位置都不相同的Haar特征(XML文件解释见下节)。在运算中,伴随着检测窗口的移动,如何快速计算Haar特征值就成了一个很重要的问题。试想一下,如果采用最笨的办法,每次移动检测窗口时都进行一系列的求和运算,机器彻底要卡死。为了解决这个问题,在设计Haar+AdaBoost算法时,Paul
Viola等人就提出积分图。
缩进说明:本文中提到的索引都是从0开始,即符合C语言习惯。
1 一般积分图
缩进在连续空间中一般采用积分方式计算体积、面积等和重量等物理量;而在离散空间中也可以用积分方式计算,只不过这里的“积分”实际上就是求和而已。用于计算Haar特征值灰度图像是一个离散的二维矩阵,所以我认为“积分图”这个词应该改为“加和图”更确切。废话到此为止,接下来我们一起看看积分图的定义。
缩进对于灰度图像中任意一点image(x,y),定义其积分图为sum(x,y)为:
缩进其中image(x',y')为点(x',y')处的原始灰度图。这样就定义了一张类似于数学中“积分”的积分图。如图1,如果要计算D区域内灰度和,只需计算sum(x4,y4)-sum(x3,y3)-sum(x2,y2)+sum(x1,y1),其中ii是积分图,(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4)依次代表图1中image的1
2 3 4点的图像坐标。需要说明,在计算D区域灰度和时sum(x1,y1)深蓝色区域被减去了2次,最后需要补上。显然可以通过此方法快速计算图像中任意位置和大小区域的灰度和,即通过积分图只需要做有限次操作就能获得任意位置的Haar特征值
图1 积分图计算Haar矩形框示意图
缩进与上面理论不同的是,为了方便计算,在opencv中width*height的灰度图计算出的积分图大小为(width+1)*(height+1)。OpenCV中的积分图定义为:
缩进这种方式实际上对原积分图进行了“扩边”,积分图中第0行和第0列的值都为0。采用这种“扩边”方式计算积分图主要是为了方便计算。为了便于说明,设计算灰度图是w*h大小的二维数组image(w,h),积分图是一个(w+1)*(h+1)大小的二维数组sum(w+1,h+1),那么用伪代码表示OpenCV中的“扩边”积分图计算方式:
[cpp] view
plain copy
// 初始化积分图二维数组元素全部为0,保证第一行和第一列为0
for r = 0:h-1 // row index
for c = 0:w-1 // col index
sum(r,c) ← 0
end
end
// 计算积分图二维数组每个元素的值
for r = 1:h
for col = 1:w
sum(r,c) ← sum(r-1,c) + sum(r,c-1) - sum(r-1,c-1) + image(r-1,c-1)
end
end
缩进以图2为例说明此段伪代码。积分图sum矩阵被初始化为全0,这就保证了积分图第0列和第0行的值都为0;之后从第1行和第1列开始遍历积分图矩阵,计算方式如下为:
sum(r,c) = sum(r-1,c) + sum(r,c-1) - sum(r-1,c-1) + image(r-1,c-1)
其中(r-1,c-1)左上点积分图值对应的深蓝区域被加了2次,所以要减去1次。这样就能够很快的求出积分图。
图2
2 45°旋转积分图
缩进为了提高检测精度,Rainer Lienhart等人首先提出了45°旋转积分图,如图3。旋转积分图用于快速计算上一篇文中介绍的titled_x2和titled_y2等共6种旋转Haar特征。
图3
缩进与一般积分图类似,OpenCV中45°旋转积分图同样采用了“扩边”方式(即旋转积分图比原灰度图多1行和1列,其中第1行和第1列元素为0),对应的计算公式为:
缩进<
b7be
span style="color:rgb(51,51,51);">有了旋转积分图如何计算任意位置和大小的45°倾斜长方形区域的灰度和呢?设有如图4红色方框大小的灰度图image,其计算出来的45°旋转灰度图为titled(第1行和第1列为0),虚线代表image中cv::Rect为<3 1 2 3>区域。显然虚线区域的灰度和为:titled(2,6) - titled(1,4)
- titled(6,3) + titled(1,4),应该不难理解。
图4
缩进在实际中,如果使用旋转特征,则需要多计算一张积分图。但是旋转特征的效果往往不理想,得不偿失,不建议使用。
-------------------------------------------
PS:45°旋转旋转积分图还有另外一种实现方式,但是OpenCV由于数据存储方式限定,不那样做。
图5 另外一种45积分图实现方式(非opencv方法)
-------------------------------------------
参考文献:
[1]An Extended Set of Haar-like Features for Rapid Object Detection.
[2]http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/miscellaneous_transformations.html?highlight=integral#cv.Integral
-------------------------------------------
关于积分图的分析就结束了。
下一篇,我会结合OpenCV中的XML,文件分析Adaboost级联分类器的结构,同时分析XML里面的internalNodes和leafValues等标签的具体含义。
缩进以OpenCV自带的人脸分类器haarcascade_frontalface_alt2.xml为例,其中存储了超过1000个大小和位置都不相同的Haar特征(XML文件解释见下节)。在运算中,伴随着检测窗口的移动,如何快速计算Haar特征值就成了一个很重要的问题。试想一下,如果采用最笨的办法,每次移动检测窗口时都进行一系列的求和运算,机器彻底要卡死。为了解决这个问题,在设计Haar+AdaBoost算法时,Paul
Viola等人就提出积分图。
缩进说明:本文中提到的索引都是从0开始,即符合C语言习惯。
1 一般积分图
缩进在连续空间中一般采用积分方式计算体积、面积等和重量等物理量;而在离散空间中也可以用积分方式计算,只不过这里的“积分”实际上就是求和而已。用于计算Haar特征值灰度图像是一个离散的二维矩阵,所以我认为“积分图”这个词应该改为“加和图”更确切。废话到此为止,接下来我们一起看看积分图的定义。
缩进对于灰度图像中任意一点image(x,y),定义其积分图为sum(x,y)为:
缩进其中image(x',y')为点(x',y')处的原始灰度图。这样就定义了一张类似于数学中“积分”的积分图。如图1,如果要计算D区域内灰度和,只需计算sum(x4,y4)-sum(x3,y3)-sum(x2,y2)+sum(x1,y1),其中ii是积分图,(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4)依次代表图1中image的1
2 3 4点的图像坐标。需要说明,在计算D区域灰度和时sum(x1,y1)深蓝色区域被减去了2次,最后需要补上。显然可以通过此方法快速计算图像中任意位置和大小区域的灰度和,即通过积分图只需要做有限次操作就能获得任意位置的Haar特征值
图1 积分图计算Haar矩形框示意图
缩进与上面理论不同的是,为了方便计算,在opencv中width*height的灰度图计算出的积分图大小为(width+1)*(height+1)。OpenCV中的积分图定义为:
缩进这种方式实际上对原积分图进行了“扩边”,积分图中第0行和第0列的值都为0。采用这种“扩边”方式计算积分图主要是为了方便计算。为了便于说明,设计算灰度图是w*h大小的二维数组image(w,h),积分图是一个(w+1)*(h+1)大小的二维数组sum(w+1,h+1),那么用伪代码表示OpenCV中的“扩边”积分图计算方式:
[cpp] view
plain copy
// 初始化积分图二维数组元素全部为0,保证第一行和第一列为0
for r = 0:h-1 // row index
for c = 0:w-1 // col index
sum(r,c) ← 0
end
end
// 计算积分图二维数组每个元素的值
for r = 1:h
for col = 1:w
sum(r,c) ← sum(r-1,c) + sum(r,c-1) - sum(r-1,c-1) + image(r-1,c-1)
end
end
缩进以图2为例说明此段伪代码。积分图sum矩阵被初始化为全0,这就保证了积分图第0列和第0行的值都为0;之后从第1行和第1列开始遍历积分图矩阵,计算方式如下为:
sum(r,c) = sum(r-1,c) + sum(r,c-1) - sum(r-1,c-1) + image(r-1,c-1)
其中(r-1,c-1)左上点积分图值对应的深蓝区域被加了2次,所以要减去1次。这样就能够很快的求出积分图。
图2
2 45°旋转积分图
缩进为了提高检测精度,Rainer Lienhart等人首先提出了45°旋转积分图,如图3。旋转积分图用于快速计算上一篇文中介绍的titled_x2和titled_y2等共6种旋转Haar特征。
图3
缩进与一般积分图类似,OpenCV中45°旋转积分图同样采用了“扩边”方式(即旋转积分图比原灰度图多1行和1列,其中第1行和第1列元素为0),对应的计算公式为:
缩进<
b7be
span style="color:rgb(51,51,51);">有了旋转积分图如何计算任意位置和大小的45°倾斜长方形区域的灰度和呢?设有如图4红色方框大小的灰度图image,其计算出来的45°旋转灰度图为titled(第1行和第1列为0),虚线代表image中cv::Rect为<3 1 2 3>区域。显然虚线区域的灰度和为:titled(2,6) - titled(1,4)
- titled(6,3) + titled(1,4),应该不难理解。
图4
缩进在实际中,如果使用旋转特征,则需要多计算一张积分图。但是旋转特征的效果往往不理想,得不偿失,不建议使用。
-------------------------------------------
PS:45°旋转旋转积分图还有另外一种实现方式,但是OpenCV由于数据存储方式限定,不那样做。
图5 另外一种45积分图实现方式(非opencv方法)
-------------------------------------------
参考文献:
[1]An Extended Set of Haar-like Features for Rapid Object Detection.
[2]http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/miscellaneous_transformations.html?highlight=integral#cv.Integral
-------------------------------------------
关于积分图的分析就结束了。
下一篇,我会结合OpenCV中的XML,文件分析Adaboost级联分类器的结构,同时分析XML里面的internalNodes和leafValues等标签的具体含义。
相关文章推荐
- opencv机器学习 Haar特征 LBP特征 adaboost集成学习 级联分类器 支持向量机SVM 主成分分析PCA 人工神经网络(ANN) 笑脸检测 SVM分类 笑脸 检测
- OpenCV中的Haar+Adaboost(六):minHitRate与maxFalseAlarm
- Adaboost+Haar+Opencv博客
- OpenCV中的Haar+Adaboost(七):分类器训练过程
- opencv haar+adaboost使用心得
- opencv haar+adaboost使用心得
- OpenCV Haar AdaBoost源码改进据说是比EMCV快6倍
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 .
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- opencv haar+adaboost使用心得
- opencv haar+adaboost使用心得 .
- 《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题
- OpenCV中的Haar+Adaboost(三):级联分类器结构与XML文件含义
- 使用OpenCV训练Haar like+Adaboost分类器的常见问题
- OpenCV中的Haar+Adaboost(五):AdaBoost之DAB与GAB
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图
- AdaBoost中利用Haar特征进行人脸识别算法分析与总结1——Haar特征与积分图 .
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(二):积分图和45°旋转积分图