我正在使用OpenCV SURF实现。
我发现通过使用SurfFeatureDetector
默认参数获得的关键点永远不会在图像上独立于八度0找到。
有人可以解释这个结果吗?
答案 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)