opencv hog.cpp中的gamma校正

时间:2013-05-16 16:47:30

标签: opencv image-processing object-detection

我不理解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理解。任何人都可以简单地说出这里发生的事情。

请帮助
提前谢谢。

1 个答案:

答案 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]]);
        }