Я копал в OpenCV's implementation of SIFT descriptor extraction. Я натолкнулся на какой-то загадочный код, чтобы получить радиус окрестности точки интереса. Ниже приводится аннотированный код с переменной имена изменены, чтобы быть более описательным:Радиус действия ключа OpenCV SIFT
// keep octave below 256 (255 is 1111 1111)
int octave = kpt.octave & 255;
// if octave is >= 128, ...????
octave = octave < 128 ? octave : (-128 | octave);
// 1/2^absval(octave)
float scale = octave >= 0 ? 1.0f/(1 << octave) : (float)(1 << -octave);
// multiply the point's radius by the calculated scale
float scl = kpt.size * 0.5f * scale;
// the constant sclFactor is 3 and has the following comment:
// determines the size of a single descriptor orientation histogram
float histWidth = sclFactor * scl;
// descWidth is the number of histograms on one side of the descriptor
// the long float is sqrt(2)
int radius = (int)(histWidth * 1.4142135623730951f * (descWidth + 1) * 0.5f);
Я понимаю, что это что-то делать с преобразованием в масштабе, из которого была взята точка интерес (я прочитал статью Лоу), но я не могу подключить точки к коду. В частности, я не понимаю первые 3 строки и последнюю строку.
Мне нужно понять это, чтобы создать аналогичный дескриптор локальной точки для движения.
спасибо! Это отличное описание. – greenbeansugar
Благодарим вас за подробное объяснение! Единственное, чего я еще не понимаю: обычно ключевые точки не должны обнаруживаться в самом верхнем масштабе (помните, что проверка экстремумов с 26 соседями, которые являются пикселями вокруг и соседями в следующих масштабах?) Итак, почему здесь SIFT создал ключевую точку со шкалой 2 (октава -1)? –