сшивание аэрофотоснимков

Я пытаюсь сшить два аэрофотоснимка вместе с очень небольшим перекрытием, вероятно, менее 500 пикселей перекрытия. Эти изображения имеют разрешение 3600x2100. Я использую библиотеку OpenCV для выполнения этой задачи.

Вот мой подход:

1. Find feature points and match points between the two images.
2. Find homography between two images
3. Warp one of the images using the homgraphy
4. Stitch the two images

Прямо сейчас я пытаюсь заставить это работать с двумя изображениями. У меня проблемы с шагом 3 и, возможно, с шагом 2. Я использовал findHomography() из библиотеки OpenCV, чтобы получить свою гомографию между двумя изображениями. Затем я вызвал warpPerspective() на одно из моих изображений, используя хомографию.

Проблема с этим подходом состоит в том, что все преобразованное изображение искажено. Кроме того, кажется, что трансформируется только определенная часть изображения. Понятия не имею, почему он не трансформирует все изображение.

Может ли кто-нибудь дать мне совет, как мне подойти к этой проблеме?
Спасибо


person Hien    schedule 16.05.2011    source источник
comment
Можно ли опубликовать уменьшенную версию результата?   -  person bjoernz    schedule 16.05.2011
comment
imageshack.us/f/689/test2yz.png imageshack.us/f/16/test1uf.png Вот мои результаты. Спасибо   -  person Hien    schedule 16.05.2011
comment
Эти изображения изначально были довольно плохими. Вот тестовые изображения с немного большим перекрытием. Цветные точки - это точки матча. РЕЗУЛЬТАТЫ   -  person Hien    schedule 16.05.2011


Ответы (3)


В опубликованных вами результатах я вижу, что у вас есть по крайней мере одно несоответствие ключевых точек. Если вы используете findHomography(src, dst, 0), это испортит вашу гомографию. Вместо этого вы должны использовать findHomography(src, dst, CV_RANSAC).

Вы также можете попробовать использовать warpAffine вместо warpPerspective.

Изменить. По результатам, которые вы опубликовали в комментариях к своему вопросу, у меня сложилось впечатление, что соответствие работает довольно стабильно. Это означает, что вы также сможете добиться хороших результатов с этим примером. Поскольку вам в основном приходится иметь дело с переводом, вы можете попытаться отфильтровать выбросы с помощью следующего схематичного алгоритма:

  1. вычислить средний (или медианный) вектор движения x_avg
  2. вычислить нормализованное скалярное произведение <x_avg, x_match>
  3. отменить x_match, если скалярное произведение меньше порогового значения
person bjoernz    schedule 16.05.2011
comment
После того, как вы упомянули об этом, я попробовал это на нескольких парах изображений с большей площадью перекрытия, и результаты были действительно хорошими. Думаю, это нужно будет делать, пока я не найду способ заставить эту работу работать с изображениями с небольшой площадью перекрытия. Спасибо - person Hien; 17.05.2011
comment
Я давно не работал с векторами, поэтому меня немного смущает тот определенный порог, о котором вы говорите. Поскольку мы собираемся сравнить нормализованный скалярный продукт с порогом, какой порог должен быть хорошим в этой ситуации? Я знаю, что нормализованный скалярный продукт меньше или равен 1, так что это значит, когда порог равен 0,5? Спасибо - person Hien; 17.05.2011
comment
Умножая два нормализованных вектора, вы получаете косинус угла между этими векторами. Возможно, страница википедии поможет визуализировать это: en.wikipedia.org/wiki/Dot_product. Таким образом, вы, вероятно, можете сказать, что все, что меньше 0,7 (например), является выбросом. - person bjoernz; 17.05.2011

Чтобы он работал для изображений с меньшим перекрытием, вам нужно будет посмотреть на детектор, дескрипторы и совпадения. Вы не указываете, с какими дескрипторами вы работаете, но я бы предложил использовать дескрипторы SIFT или SURF и соответствующие детекторы. Вы также должны установить параметры детектора, чтобы сделать выборку плотной (т.е. попытаться обнаружить больше функций).

Вы можете обратиться к этому ответу, который немного связан: OpenCV - сшивание изображений

person KMS    schedule 18.05.2011
comment
Я использую дескриптор и детектор SURF прямо сейчас. Я не стал использовать SIFT, поскольку он был значительно медленнее, чем SURF, хотя и давал лучшие результаты. Первоначально мой проект заключался в сшивании сотен изображений для создания карты, поэтому я использовал SURF, который дал достойный результат и намного быстрее, чем SIFT. - person Hien; 19.05.2011
comment
В этом случае попробуйте настроить детектор, чтобы получить плотную выборку точек. - person KMS; 22.05.2011

Чтобы сшить изображения с помощью гомографии, самое главное, о чем следует позаботиться, - это нахождение точек соответствия в обоих изображениях. Чем меньше выбросов в точках соответствия, тем лучше сгенерированная гомография. Использование надежных методов, таких как RANSAC вместе с функцией FindHomography () в OpenCV (используйте CV_RANSAC в качестве опции), по-прежнему будет генерировать разумную гомографию при условии, что процент выбросов больше, чем процент выбросов. Также убедитесь, что в точках соответствия, переданных в функцию FindHomography, есть как минимум 4 вставки.

person NoOne    schedule 19.11.2013