2014-10-30 6 views
0

Я использую следующий код в примере 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 и других. Изображения: Результаты с различными дескрипторами для случая А и В:

enter image description here

+0

Интуитивно я вижу 3 возможности: 1: ваша загрузка и сохранение не работают. 2: ваши сбережения и загрузка действительно работают, но вы теряете некоторую точность вашего поплавка, чтобы ваши дескрипторы менялись.3: сопряжение может использовать некоторый RANSAC, который не является детерминированным, поэтому результаты отличаются. Мой любимый номер # 2, и я советую сохранить/загрузить ключевые точки и вычислить дескрипторы снова. если это работает, снова возможны две возможности: A: потеря точности или sth. B: ключевые точки получают неправильные дескрипторы (из другой ключевой точки). – Micka

+0

Привет! Кажется, что настройка okey, поскольку она работает для некоторых дескрипторов (по крайней мере для SURF). Но если я перейду к BRIEF, ORB или другим дескрипторам, есть разница ... – alti

ответ

0

Попробуйте повторить А или В по отдельности и посмотреть, если результаты выходят в том же самом. Я подозреваю, что они этого не сделают, и я говорю это, потому что, # 1 Ваш объект интереса имеет плохую структуру, и это приведет к плохим дескрипторам. # 2 Изменение точки обзора между двумя изображениями огромно и приводит к проблеме неповторяемости даже для лучших дескрипторов, таких как SIFT.

Теперь, как часть решения этой проблемы повторяемости, # 1 использует некоторый порог по норме дескриптора, так что для согласования используются только очень сильные функции. # 2 используют эпиполярное ограничение вместе с RANSAC для фильтрации неправильных совпадений. Я прикрепляю два изображения, чтобы показать, как фильтр сильно влияет на соответствия. enter image description here Используя SURF, чтобы найти соответствие между двумя изображениями (два изображения в красно-голубой палитре) enter image description here После фильтрации изображений с помощью RANSAC используя эпиполярное ограничение.

Не стесняйтесь комментировать и обсуждать по этому вопросу. :-)

+0

Привет, спасибо за ваш ответ! Я добавил некоторые новые результаты тестирования выше и использовал другой набор изображений. Как вы можете видеть работы по экономии и загрузке, например. для SURF, но не для ORB. То же самое для некоторых других дескрипторов ... любая идея почему? – alti

 Смежные вопросы

  • Нет связанных вопросов^_^