HOG特征
有关HOG特征的介绍、详解、代码在网上都能找到很多。我是在处理车牌识别中字符识别问题时,无意之中接触到HOG特征算法的,当时赶时间完成作业,正愁于如何对数字和字母,以及部分汉子提取特征,以便能够准确地实现识别的功能。一看到HOG特征,让我眼前一亮,虽然算法是设计用来识别行人的,但用来识别字符肯定一样十分有效。
我对HOG的一些理解:
HOG算法的核心思想就是利用物体表面的光强或边缘方向的分布可以描述整个物体,利用HOG算法提取的特征实质就是图像的光强和边缘方向的分布。HOG算法的具体操作就是将图像分割成很多小的连接区域,在每个小的区域之中生产多个方向梯度直方图或像素点的边缘方向,图像所有的这些区域的方向梯度直方图或像素点边缘方向就构成了图像的描述子HOGDescriptor,这个描述子即可作为识别该图像物体的特征向量。
Opencv中HOG算法在实现过程中,采用窗口移动的方法对整幅图进行计算,每个窗口中又有块,块由四个小区域组成,块在窗口中移动,块遍历完整个窗口后,窗口在移动,直到整个图片被计算完。具体如下图所示:
窗口大小为28*28,使用opencv中的函数,实现HOG特征的提取并将其由vector保存到cvMat的代码实现如下:
其中img[i]是要提取HOG特征和保存特征的图片。
IplImage* trainTempImg=cvCreateImage(cvSize(28,28),8,1);
cvZero(trainTempImg);
cvResize(img[i],trainTempImg);
HOGDescriptor *hog=new HOGDescriptor(cvSize(28,28),cvSize(14,14),cvSize(7,7),cvSize(7,7),9);
vector<float>descriptors; //结果数组
hog->compute(trainTempImg, descriptors,Size(1,1), Size(0,0));
CvMat* SVMtrainMat=cvCreateMat(1,descriptors.size(),CV_32FC1);
int n=0;
//将特征保存到MAT中
for(vector<float>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
{
cvmSet(SVMtrainMat,0,n,*iter);
n++;
}