OpenCV, Python: устранение возможного сужения при сшивании изображений

Во многом благодаря отличным ответам на stackoverflow (здесь, здесь и здесь) добились неплохих успехов в выравнивании изображений. Однако есть одна проблема, как вы можете видеть ниже. Когда я сшиваю много изображений вместе, они становятся все меньше и меньше.

Моя теория о том, почему это происходит, заключается в том, что камера не была точно перпендикулярна земле, поэтому по мере того, как я добавлял все больше и больше изображений, естественная перспектива в том, что камера не перпендикулярна земле, приводила к уменьшению дальних изображений. Однако это вполне могло быть совершенно неверным.

Однако даже когда я трансформирую первое изображение так, как если бы оно было снято перпендикулярно земле (я думаю), искажение все равно происходит.

Есть ли у блестящего сообщества stackoverflow идеи, как я могу исправить ситуацию?

Это процесс, который я использую для сшивания изображений:

  1. Зная угол широты и долготы углов изображений, деформируйте их так, чтобы первое изображение было перпендикулярно земле. Омография, которую я использую для этого, - это базовая гомография.
  2. Найдите общие черты между каждым изображением и последним, используя goodFeaturesToTrack() и calcOpticalFlowPyrLK()
  3. Используйте findHomography(), чтобы найти гомографию между двумя изображениями. Затем составьте эту гомографию со всеми предыдущими омографиями, чтобы получить чистую гомографию
  4. Примените трансформацию и наложите на изображение чистый результат того, что я сделал до сих пор.

Есть одно серьезное ограничение

Мозаика должна быть построена по одному изображению за раз по мере движения камеры. Я пытаюсь создать карту в реальном времени, когда летит дрон, подгоняя каждое изображение к последнему, одно за другим.

введите описание изображения здесь


person Victor Odouard    schedule 26.07.2017    source источник


Ответы (1)


Моя теория о том, почему это происходит, заключается в том, что камера не была точно перпендикулярна земле.

Это хорошая интуиция. Если камера повернута под углом, то по мере того, как она движется к объекту, этот объект становится больше в кадре. Поэтому, если вы сшиваете это с предыдущим кадром, текущий кадр должен сжаться, чтобы соответствовать объекту в предыдущем кадре.

Полные 3x3 омографии включают искажения в направлениях x и y, а 2x3 аффинные преобразования - нет. Чтобы придерживаться текущего конвейера, вы можете вместо этого попробовать найти аффинное или евклидово (жесткое) преобразование. Разница между ними в том, что аффинная основа позволяет раздельно сдвигать и растягивать в направлениях x и y, евклидовы преобразования выполняют только перенос, вращение и равномерное масштабирование. Оба сохраняют параллельные линии, тогда как полная гомография - нет, поэтому вы можете получить квадратное изображение, которое станет более трапециевидным, и повторение этого уменьшит ваше изображение. Аффинная деформация все еще может сжиматься только в одном направлении, превращая квадрат в прямоугольник, поэтому он все еще может сжиматься. Евклидовы преобразования могут масштабировать только весь квадрат, поэтому он все равно может сжиматься.

Конечно, они не будут такими идеальными, как findHomography, но они должны быть в состоянии заставить вас близкие совпадения, не сильно искажая размер. Есть два варианта поиска евклидовых или аффинных преобразований с помощью OpenCV:

  1. estimateRigidTransform() вместо warpPerspective(), чтобы получить либо жесткая деформация с параметром fullAffine=False или аффинная деформация с fullAffine=True.

  2. findTransformECC() с дополнительным параметром motionType=cv2.MOTION_EUCLIDEAN или motionType=cv2.MOTION_AFFINE ( но аффинное значение по умолчанию, поэтому указывать его не обязательно).

Вы можете проверить разницу между алгоритмами на их страницах документации или попробовать оба, чтобы увидеть, что лучше всего подходит для вас.

Если и это не сработает, вы можете попробовать оценить гомографию, деформирующую кадр, так, чтобы она была полностью перпендикулярна земле. Если вы это сделаете, вы можете попробовать применить его ко всем кадрам сначала, а затем сопоставить изображения. В противном случае вы, вероятно, захотите перейти к более продвинутым методам, чем поиск простой гомографии между каждым кадром.

person alkasm    schedule 27.07.2017
comment
Ух ты. Использование аффинных преобразований сработало ОЧЕНЬ хорошо. Я ожидал, что изображения тоже не выровняются, но разница по сравнению с перспективными трансформациями почти незаметна, и мозаика не сжимается. - person Victor Odouard; 31.07.2017
comment
@ user2457666 фантастика! Возможно, ваш исходный вид земли не был сильно искажен в обоих направлениях, поэтому аффинное преобразование подойдет. Рад, что вы получили желаемые результаты. - person alkasm; 01.08.2017