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特征生成的大概过程
大概过程:
提取一个image的hog特征方法:
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的梯度直方图,即可形成每个cell的descriptor;
(c) block中cell的descriptor组成block的descriptor 。
(d)所有block的descriptor串联起来就得到该image的hog特征descriptor。
hog特征就是归一化后的梯度直方图连起来。