OpenCV 2.3 SURF关键点八度音程永远不会等于0

时间:2012-04-02 10:01:48

标签: c++ c opencv computer-vision

我正在使用OpenCV SURF实现。

我发现通过使用SurfFeatureDetector默认参数获得的关键点永远不会在图像上独立于八度0找到。

有人可以解释这个结果吗?

1 个答案:

答案 0 :(得分:2)

它看起来像以下函数中的错误(它在surf.cpp中从SURF::operator()调用):

static int getPointOctave(const CvSURFPoint& kpt, const CvSURFParams& params)
{
    int octave = 0, layer = 0, best_octave = 0;
    float min_diff = FLT_MAX;
    for( octave = 1; octave < params.nOctaves; octave++ ) <---- octave counter starts from 1
        for( layer = 0; layer < params.nOctaveLayers; layer++ )
        {
            float diff = std::abs(kpt.size - (float)((HAAR_SIZE0 + HAAR_SIZE_INC*layer) << octave));
            if( min_diff > diff )
            {
                min_diff = diff;
                best_octave = octave;
                if( min_diff == 0 )
                return best_octave;
        }
    }
    return best_octave;
}

在上面编写的代码中,我们可以看到octave计数器从1开始。根据{{​​1}}的初始化,min_diff = FLT_MAX变量显然小于diff

因此,如果是min_diff,即使我们确实在八度nOctaves > 1处找到了关键点,结果best_octave也永远不会是0

编辑:此问题已在OpenCV的下一版本中修复(2.4)