我正在研究 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/