参考:
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(, ), Size block_size=Size(, ),
Size block_stride=Size(, ), Size cell_size=Size(, ),
int nbins=, 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",); //读取图片
resize(trainImg, trainImg,Size(, ));
HOGDescriptor *hog=new HOGDescriptor(cvSize(,),cvSize(,),cvSize(,),cvSize(,),); //具体意思见参考文献和opencv的api文档
vector<float>descriptors;//结果数组
hog->compute(trainImg, descriptors,Size(,), Size(,)); //调用计算函数开始计算
printf("%d\n",descriptors.size()); //打屏一下结果数组的大小,看看是否符合文献的预估, 发现完全一样,那篇文章很给力
//打印结果 3780
}