参考:
http://blog.csdn.net/liulina603/article/details/8291093
http://blog.csdn.net/woxincd/article/details/18351807
http://hi.baidu.com/nokltkmtsfbnsyq/item/f4b73d06f066cd193a53eec3
http://www.tuicool.com/articles/fM3Mvu
http://blog.csdn.net/yangtrees/article/details/7463431
http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html(源码解读)
下面给出opencv的HOG特征提取代码:
HOGDescriptor类可以完成HOG的特征提取过程,构造函数
HOGDescriptor(Size win_size=Size(64, 128), Size block_size=Size(16, 16), Size block_stride=Size(8, 8), Size cell_size=Size(8, 8), int nbins=9, double win_sigma=DEFAULT_WIN_SIGMA, double threshold_L2hys=0.2, bool gamma_correction=true, int nlevels=DEFAULT_NLEVELS);
win_size 检测窗口大小为128*64;
block_size Block大小为16*16;
block_stride Block在检测窗口中上下移动尺寸为8*8;
cell_size Cell大小为8*8;
1个cell的梯度直方图化成9个bin;
//滑动窗口在检测图片中滑动的尺寸为8*8;
代码中的一个hog描述子是针对一个检测窗口而言的,所以一个检测窗口共有105= ((128-16)/8+1)*((64-16)/8+1)个block;一个block中有4个cell,而一个cell的hog描述子向量的长度为 9;所以检测窗口的hog向量长度=3780=105*4*9维。
void main() { Mat trainImg; //需要分析的图片 trainImg=imread("test.png",0); //读取图片 resize(trainImg, trainImg,Size(64, 128)); HOGDescriptor *hog=new HOGDescriptor(cvSize(64,128),cvSize(16,16),cvSize(8,8),cvSize(8,8),9); //具体意思见参考文献和opencv的api文档 vector<float>descriptors;//结果数组 hog->compute(trainImg, descriptors,Size(1,1), Size(0,0)); //调用计算函数开始计算 printf("%d ",descriptors.size()); //打屏一下结果数组的大小,看看是否符合文献的预估, 发现完全一样,那篇文章很给力
//打印结果 3780 }