c++ - OpenCV 2.3 SURF关键点倍频程永远不等于0

标签 c++ c opencv computer-vision

我正在研究 OpenCV SURF 实现。

我发现通过使用具有默认参数的 SurfFeatureDetector 获得的关键点从未在独立于图像的 Octave 音程 0 处找到。

有人能解释一下这个结果吗?

最佳答案

它看起来像是以下函数中的错误(它从 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开始。根据min_diff = FLT_MAX的初始化,diff变量明显小于min_diff

因此,在 nOctaves > 1 的情况下,结果 best_octave 永远不会是 0 即使我们实际上在 Octave 处找到了关键点 0.

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

关于c++ - OpenCV 2.3 SURF关键点倍频程永远不等于0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9974375/

相关文章:

OpenCV - 在 fitEllipse() 的轮廓内拟合叶子

opencv - 在 ubuntu 18.04 上安装 openCV 2.4.9 时遇到问题

c++ - 在 Opencv 中清理分割图像

javascript - C 中的 IsNan 等价物

c - execv() 的路径查找

python - 使用 OpenCV 进行网络摄像头颜色校准

c++ - Qt QTreeWidget 一项一项添加

c++ - STL:从A到B的自然数集

c++ - sizeof 和按引用传递

c - C 语言 BST 转换器