0

我不明白 opencv 中 hog.cpp 中伽马校正的代码,我在这里浏览了一些与 opencv hog.cpp 中的代码不匹配的链接

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 的二维数组,如果伽玛校正为真,它将计算数据的平方根。我试图调试与此代码相关的所有文件,但我理解。任何人都可以简单地告诉这里发生了什么。

请帮助
提前谢谢。

4

1 回答 1

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]]);
        }
于 2013-05-17T15:12:51.210 回答