У меня есть вопрос о последней части работы SiftDescriptorExtractor,Как SiftDescriptorExtractor от OpenCV конвертирует дескриптор?
Я делаю следующее:
SiftDescriptorExtractor extractor;
Mat descriptors_object;
extractor.compute(img_object, keypoints_object, descriptors_object);
Теперь я хочу, чтобы проверить элементы объекта descriptors_object Mat:
std::cout<< descriptors_object.row(1) << std::endl;
выход выглядит следующим образом:
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 32, 15, 0, 0, 0, 0, 0, 0, 73, 33, 11, 0, 0, 0, 0, 0, 0, 5, 114, 1, 0, 0, 0, 0, 51, 154, 20, 0, 0, 0, 0, 0, 154, 154, 1, 2, 1, 0, 0, 0, 154, 148, 18, 1, 0, 0, 0, 0, 0, 2, 154, 61, 0, 0, 0, 0, 5, 60, 154, 30, 0, 0, 0, 0, 34, 70, 6, 15, 3, 2, 1, 0, 14, 16, 2, 0, 0, 0, 0, 0, 0, 0, 154, 84, 0, 0, 0, 0, 0, 0, 154, 64, 0, 0, 0, 0, 0, 0, 6, 6, 1, 0, 1, 0, 0, 0]
Но в Lowe paper говорится, что:
Таким образом, мы уменьшаем влияние больших градиентов величин с помощью Thresholding значений в вектор признаков блока к каждому из них будет не больше , чем 0,2, а затем перенормировки к единица измерения длина. Это означает, что сопоставление величин для больших градиентов уже не столь важно и что распределение ориентации имеет больший акцент. Значение 0,2 составляло , определяемое экспериментально с использованием изображений , содержащих различную освещенность для тех же трехмерных объектов.
Таким образом, цифры из вектор-функции должны быть не более 0,2.
Вопрос в том, как эти значения были преобразованы в объект Mat?
спасибо за объяснение! Итак, теперь у нас есть float dst с 128 значениями для каждой ключевой точки. Как поместить их все в объект Mat? – fen1ksss
Если обнаружены ключевые точки «N», дескрипторы сохраняются в матрице «N x 128», то есть в строках «N», где каждая строка (= ключевая точка) имеет 128 столбцов для хранения компонентов SIFT. – deltheil
дополнительно еще один вопрос http://stackoverflow.com/questions/15038797/how-to-use-sift-algorithm-with-a-color-inverted-image – fen1ksss