OpenCV Q&A Forum - RSS feedhttp://answers.opencv.org/questions/OpenCV answersenCopyright <a href="http://www.opencv.org">OpenCV foundation</a>, 2012-2018.Fri, 17 May 2013 04:05:44 -0500SIFT Detection Octave Calculationhttp://answers.opencv.org/question/13535/sift-detection-octave-calculation/I'm not quite sure if i got the calculation of SIFT keypoint Detection. I looked into the nonfree/sift.cpp file in the SIFT::operator() and adjustLocalExtrema Method. There are some bitmask operations which allow to transport the fractional part of the octave to the SIFT Descriptor. Nevertheless i do not quite understand the data representation.
In SIFT::operator() a local variable named **firstOctave** is initialized with -1 (line 731, nonfree/sift.cpp, branch 2.4). Then there are 2 possibilities:
If **useProvidedKeypoints == true**, the following code is executed:
firstOctave = 0;
int maxOctave = INT_MIN;
for( size_t i = 0; i < keypoints.size(); i++ )
{
int octave, layer;
float scale;
unpackOctave(keypoints[i], octave, layer, scale);
firstOctave = std::min(firstOctave, octave); // stays 0!
maxOctave = std::max(maxOctave, octave);
actualNLayers = std::max(actualNLayers, layer-2);
}
firstOctave = std::min(firstOctave, 0); // stays 0!
firstOctave is first overwritten zero and then by a min-Expression. Whatever octave will be, the value stays 0 (i run a test on this and octave never was <0).
The second posibility is when **useProvidedKeypoints == false**:
if( firstOctave < 0 ) // if useProvidedKeypoints == false, firstOctave is ALWAYS -1!
for( size_t i = 0; i < keypoints.size(); i++ )
{
KeyPoint& kpt = keypoints[i];
float scale = 1.f/(float)(1 << -firstOctave);
kpt.octave = (kpt.octave & ~255) | ((kpt.octave + firstOctave) & 255); // why adding -1 to the last byte?
kpt.pt *= scale;
kpt.size *= scale;
}
This is the main issue. If **useProvidedKeypoints == false** the first code example will never be executet. So, firstOctave will be -1 everytime this second code will be executed. My Questions are:
- Why is there the statement if(
firstOctave < 0 ) when firstOvtave
always is -1?
- Why is the value of
fistOctave added to the last Byte of
kpt.octave if it is always -1? This
results is octave == 255 in some
cases (when the previous octave was 0) for the keypoint output.
DonutFri, 17 May 2013 04:05:44 -0500http://answers.opencv.org/question/13535/