HOG特征

HOG特征描述算子中的数据

1. grad和qangle

// 都是2通道的

grad.create(gradsize, CV_32FC2); //
qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation


for( y = 0; y < gradsize.height; y++ )
{
float* gradPtr = (float*)grad.ptr(y);
uchar* qanglePtr = (uchar*)qangle.ptr(y);
for( x = 0; x < width; x++ )
{

....................

// qanlge存储的是相邻bin的标号

qanglePtr[x*2] = (uchar)hidx;

qanglePtr[x*2] = (uchar)hidx;

..................

// grad存储的是相邻bin的幅值

gradPtr[x*2] = mag*(1.f - angle);
gradPtr[x*2+1] = mag*angle;

}
}

2.特征向量

特征向量的生成?先看看hog特征生成的大概过程

大概过程:

提取一个imagehog特征方法:

1)图像处理:采用Gamma校正法?;目的是调节图像的对比度,降低图像局部的阴影和光照变化所造成的影响

// 函数中的gamma查找表

Mat_ _lut(1, 256);
const float* lut = &_lut(0,0);
if( gammaCorrection ){
for( i = 0; i < 256; i++ )
_lut(0,i) = std::sqrt((float)i);}
else{
for( i = 0; i < 256; i++ ){
_lut(0,i) = (float)i;}}

2)梯度:计算图像每个像素的 grad和qangle,捕获轮廓信息。

opencv中的函数void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle, Size paddingTL, Size paddingBR) const

上面的查找表在此函数中。

3)特征描述子

(a)将图像划分为若干个block,一个block划分为若干个cell;

(b)统计每个cell的梯度直方图,即可形成每个celldescriptor

(c) block中cell的descriptor组成block的descriptor

(d)所有blockdescriptor串联起来就得到该imagehog特征descriptor


hog特征就是归一化后的梯度直方图连起来。








你可能感兴趣的:(HOG特征)