2013-06-12 08:16:28 -0600 received badge ● Student (source) 2013-05-17 04:05:44 -0600 asked a question 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.