Я использую следующий код в примере descriptor_extractor_matcher.cpp для вычисления дескрипторов img1 (Mat descriptors01), записать его на свой диск и загрузить обратно (Mat descriptors1) , (те же самые шаги для ключевых точек, но код, а так же ...)Различные результаты сопоставления для descriptor_extractor_matcher для opencv при загрузке данных из файла
Ptr<DescriptorExtractor> descriptorExtractor = DescriptorExtractor::create(argv[2]);
...
Mat descriptors01;
descriptorExtractor->compute(img1, keypoints1, descriptors01); // compute descriptors
FileStorage storage("test.yml", FileStorage::WRITE); //save it to disc
storage << "blub" << descriptors01;
storage.release();
Mat descriptors1;
FileStorage storage1("test.yml", FileStorage::READ); // load it again
storage1["blub"] >> descriptors1;
storage1.release();
The & дескрипторы ключевых точек для изображения 2 вычисляются и используются без сохранения и загрузки ,
Я использую только загруженные данные (ключевые точки & дескрипторы) для изображения 1 для соответствия, поэтому для дескрипторов: дескрипторы1.
Теперь вот что: если я сравниваю случаи
A) Используя приведенный выше код для вычисления, хранения и погрузки;
B) Использование только загруженные данные (без вычислений и хранить его снова)
для согласования я получаю разные результаты, как вы можете видеть в изображениях для ключевых точек, как для как хорошо согласующих дескрипторов. Я бы не ожидал никаких различий ... Что мне здесь не хватает? Должен ли я сравнивать 2 изображения и не могу сравнивать изображение с сохраненным набором ключевых точек и его дескрипторами?
Конечно, я использую одни и те же значения для [detectorType] [descriptorType] [matcherType] [matcherFilterType] [image1] [image2] [ransacReprojThreshold], кстати;)
Большое спасибо!
UPDATE:
Кажется, этот вопрос в зависимости от дескриптора. Работа с загруженными дескрипторами работает для SIFT и SURF, но не для ORB и других. Изображения: Результаты с различными дескрипторами для случая А и В:
Интуитивно я вижу 3 возможности: 1: ваша загрузка и сохранение не работают. 2: ваши сбережения и загрузка действительно работают, но вы теряете некоторую точность вашего поплавка, чтобы ваши дескрипторы менялись.3: сопряжение может использовать некоторый RANSAC, который не является детерминированным, поэтому результаты отличаются. Мой любимый номер # 2, и я советую сохранить/загрузить ключевые точки и вычислить дескрипторы снова. если это работает, снова возможны две возможности: A: потеря точности или sth. B: ключевые точки получают неправильные дескрипторы (из другой ключевой точки). – Micka
Привет! Кажется, что настройка okey, поскольку она работает для некоторых дескрипторов (по крайней мере для SURF). Но если я перейду к BRIEF, ORB или другим дескрипторам, есть разница ... – alti