OpenCV demo演示见本人的另一篇灌水博客 http://blog.csdn.net/soidnhp/article/details/11720801
本人源码分析见 http://blog.csdn.net/soidnhp/article/details/11880425
参考文献:《N. Dalal and B. Triggs, “Histograms of Oriented Gradients for Human Detection,”Proc. IEEE Conf. Computer Vision and Pattern Recognition,2005.》
作者源码: http://pascal.inrialpes.fr/soft/olt/
参考链接 http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html
一、基本思想
上图是目标检测的基本流程。
HOG属于特征提取,它统计梯度直方图特征。具体来说就是将梯度方向(0->360°)划分为9个区间,将图像化为16x16的若干个block,每个block在化为4个cell(8x8)。对每一个cell,算出每一点的梯度方向和模,按梯度方向增加对应bin的值,最终综合N个cell的梯度直方图形成一个高维描述子向量。实际实现的时候会有各种插值。
选用的分类器是经典的SVM。
检测框架为经典的滑动窗口法,即在位置空间和尺度空间遍历搜索检测。
二、基本概念
原始图像打完补丁后就直接用固定的窗口在图像中移动,计算检测窗口下的梯度,形成描述子向量,然后就直接SVM了
三、HOG算法流程
算法流程比较简单:
1、gamma校正
r=0.5,暗区对比度提高,亮区对比度下降
2、计算梯度
微分算子[-1 0 1],取RGB通道中模值最大的为该像素点的梯度。
插值策略:对与该点梯度方向相邻的两个bin按距离进行线性插值。
3 、权值
高斯权值:与到block中心负相关,对于图中的大圆圈
cell中心权值:到对称cell中心的“距离”正相关,对应下图中小方块到十字的距离。
这一部分比较复杂, 每一个像素点还要对cell插值。
1)F,J,G,K区域内的像素点对四个cell都有贡献,比如P4对cell 0 的权重是倒对称cell中心即cell 3的“距离” P4-cell 3 即图中绿色虚线的“长度”,对其它cell 的权值依次类推
2)B,C,E,I,N,O,H,L区域的像素点要对两个cell中心插值。比如P2虽然处在cell 1中,但是对cell 0 也有贡献,对虚线中的红,绿两个十字所在的cell 也有贡献。那对cell 0的权重计算方法同P4。
取到对称cell 中心的 “距离”,即到绿色中心的“距离”。
3)A,D,M,P,区域的点对周围的四个cell也有贡献,但是block覆盖的只有一个cell,自然只要对其本身所在的cell插值即可。比如P1,到对称cell 中心的“距离”,即图中的cell中心。
但是要注意:cell的编号顺序是从上到下,从左到右,即(cell 0 cell 1 cell 2 cell 3)但是四个cell的偏移量存储顺序却是(cell 0 ->cell 2 ->cell 1->cell 3)
这张图没画完,也可以说有错误,大家参加这篇博客吧,http://blog.csdn.net/wobuaishangdiao/article/details/7750723,等找好工作了再来细改
4、归一化
L2 Hys归一化,比较简单
5、获取整个检测窗口内的所有block的梯度直方图组成一个很高很高维的描述子向量
用查表替代了八重循环,大大减少了时间开销。
最笨的方法是依次循环:
1.检测窗口在输入图像中滑动
2.block在检测窗口win中滑动
3.cell在block中滑动
4.在cell中循环获取像素的梯度值
每一层循环都是2维的这样下来就是八重循环…………子子孙孙无穷尽也
作者通过预先计算好的pixData,blockData基本上化为了3重循环。
1.循环图像中的每一个检测窗口win
2.循环检测窗口内的每一个block
3.循环每一个block中的像素点,getblock()
每一层都是一维。
6、SVM分类
计算到分类超平面的距离
四、HOG算法OpenCV实现流程
五、源码分析
http://blog.csdn.net/soidnhp/article/details/11880425