Во многом благодаря отличным ответам на stackoverflow (здесь, здесь и здесь) добились неплохих успехов в выравнивании изображений. Однако есть одна проблема, как вы можете видеть ниже. Когда я сшиваю много изображений вместе, они становятся все меньше и меньше.
Моя теория о том, почему это происходит, заключается в том, что камера не была точно перпендикулярна земле, поэтому по мере того, как я добавлял все больше и больше изображений, естественная перспектива в том, что камера не перпендикулярна земле, приводила к уменьшению дальних изображений. Однако это вполне могло быть совершенно неверным.
Однако даже когда я трансформирую первое изображение так, как если бы оно было снято перпендикулярно земле (я думаю), искажение все равно происходит.
Есть ли у блестящего сообщества stackoverflow идеи, как я могу исправить ситуацию?
Это процесс, который я использую для сшивания изображений:
- Зная угол широты и долготы углов изображений, деформируйте их так, чтобы первое изображение было перпендикулярно земле. Омография, которую я использую для этого, - это базовая гомография.
- Найдите общие черты между каждым изображением и последним, используя
goodFeaturesToTrack()
иcalcOpticalFlowPyrLK()
- Используйте
findHomography()
, чтобы найти гомографию между двумя изображениями. Затем составьте эту гомографию со всеми предыдущими омографиями, чтобы получить чистую гомографию - Примените трансформацию и наложите на изображение чистый результат того, что я сделал до сих пор.
Есть одно серьезное ограничение
Мозаика должна быть построена по одному изображению за раз по мере движения камеры. Я пытаюсь создать карту в реальном времени, когда летит дрон, подгоняя каждое изображение к последнему, одно за другим.