我不理解opencv中hog.cpp中伽马校正的代码,我经历了一些与opencv hog.cpp中的代码不匹配的链接here
Mat_<float> _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;
我从代码中理解的是它创建了1x256的二维数组,如果伽马校正为真,它将计算数据的平方根。我试图调试遍历与此代码相关的所有文件,但dint理解。任何人都可以简单地说出这里发生的事情。
请帮助
提前谢谢。
答案 0 :(得分:5)
你所做的就是建立一个查找表;你知道输入数据是字符,所以所有像素只能有0到255之间的值,所以如果你正在进行伽马校正,你会预先计算平方根。稍后将在每像素梯度计算中使用它。 稍后在computeGradients()中,您将获得行指针:
const uchar* imgPtr = img.data + img.step*ymap[y];
然后索引到查找表中以获取[-1 0 1]渐变的像素值:
for( x = 0; x < width; x++ )
{
int x1 = xmap[x];
dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
}