Расчет координат косого аэрофотоснимка

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

У меня есть фотоаппараты:

  1. Высота
  2. Горизонтальное и вертикальное поле зрения
  3. Вращение по всем 3 осям

Я нашел несколько решений, но не могу перевести их для своих целей. Ближайший из найденных мной - здесь https://photo.stackexchange.com/questions/56596/how-do-i-calculate-the-ground-footprint-of-an-aerial-camera, но я не могу понять, как и возможно ли это для меня использовать это. Особенно, когда мне нужно принимать во внимание и тангаж, и крен.

Спасибо за любую помощь, которую я получаю.

Изменить: я кодирую свое программное обеспечение на Java.


person Milan Zelenka    schedule 29.06.2016    source источник
comment
Что значит координаты углов? Вы имеете в виду в фокальной / проекционной плоскости камеры или в четырех углах земли, как в вопросе? Если вы имеете в виду последнее, это все еще возможно, но может быть более эффективным использовать векторный подход.   -  person    schedule 29.06.2016
comment
Да, я имею в виду четыре угла на земле, определяющие трапецию. Вы имеете в виду, что я должен искать точки пересечения четырех лучей, выходящих из камеры, с землей?   -  person Milan Zelenka    schedule 29.06.2016
comment
да, вы должны рассчитать их и выполнить стандартный тест на пересечение лучей и плоскостей. если бы вы попытались сделать это с помощью триггерных функций, как в приведенной вами ссылке ... ну, удачи.   -  person    schedule 29.06.2016
comment
Просто убедился - какие у вас параметры вращения? тангаж, рыскание, крен?   -  person    schedule 29.06.2016
comment
Да, но в основном мне нужны только тангаж и крен.   -  person Milan Zelenka    schedule 30.06.2016


Ответы (1)


Если у вас есть вращения по всем трем осям, вы можете использовать эти матрицы - http://planning.cs.uiuc.edu/node102.html - чтобы построить полную матрицу вращения (3x3) для вашей камеры.

Предполагая, что, когда матрица вращения является тождественной (т.е.в кадре камеры), вы определили оси камеры следующим образом:

  • Ось X для передней части
  • Y для стороны (слева)
  • Z для вверх

В кадре камеры лучи имеют направления:

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

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

Чтобы вычислить точки на земле: https://www.cs.princeton.edu/courses/archive/fall00/cs426/lectures/raycast/sld017.htm

person Community    schedule 29.06.2016
comment
Большое спасибо! - person Milan Zelenka; 30.06.2016
comment
@MilanZelenka без проблем. и еще кое-что - вам может понадобиться нормализовать векторы лучей - person ; 30.06.2016
comment
Я только что провел несколько тестов, чтобы проверить результаты своих расчетов, и обнаружил то, в чем не уверен. Я устанавливаю камеру лицевой стороной вниз, и лучи имеют направление: (+ -тан (FOVv / 2), + -тан (FOVh / 2), -1). Теперь, если я прав, угол между левым нижним и правым верхним лучом должен соответствовать диагонали поля зрения камеры, но это не так. Характеристики камеры: FOVh = 64,4, FOVv = 37,2, FOVd = 73,6. Два вектора: (0,336,0,629, -1,0) и (-0,336, -0,629, -1,0). Угол между ними составляет 71 градус. Я что-то упустил? Нормализация не меняет результатов. - person Milan Zelenka; 08.07.2016
comment
этого следовало ожидать, потому что вы вычисляете угол на наклонной стороне усеченного конуса, тогда как fov - это угол прямого поперечного сечения. Они разные, как видно из правила синуса. - person ; 08.07.2016
comment
@MilanZelenka - у вас получилось сделать эту работу? Я пытаюсь сделать то же самое и никогда не работал с поворотом матрицы, хотя я смог понять и провести эти начальные вычисления. Что делать с повернутыми результатами, чтобы получить координаты поверхности контура с известными координатами источника, высотой и углом? - person ssast; 28.11.2017
comment
Да, мне удалось заставить его работать. Вы можете найти источник здесь github.com/zelenmi6/thesis/ blob / master / src / geometry / Посмотрите на метод getBoundingPolygon (..) и дайте мне знать, достаточно ли этого для вас. - person Milan Zelenka; 28.11.2017
comment
@MilanZelenka Отлично, спасибо. Я работаю на Python, но думаю, что могу последовать вашему примеру. Я немного не уверен, как работать с долгосрочными координатами, такими как x, y, и высотой в метрах, но я вижу, что вы установили источник на (0, 0 высота), так что, возможно, я был именно там споткнувшись. - person ssast; 28.11.2017
comment
Я обнаружил, что могу заставить это работать с моими данными, сначала преобразовав мои географические координаты в utm, чтобы все единицы были в метрах, а затем выполнив вращение и пересечение лучей. Еще я не осознавал, что рыскание (и другие) измеряются против часовой стрелки и должны выражаться в радианах, а не в градусах. - person ssast; 28.11.2017
comment
Я вижу, что CameraCalculator.getBoundingPolygon () использует constants.CameraTests.MAX_DISTANCE, для которого установлено значение 100. Я предполагаю, что мне следует установить MAX_DISTANCE на очень большое число, превышающее любую высоту, которую я буду использовать и перекомпилировать перед использованием, верно? - person Tomasso; 26.07.2019
comment
Привет, @ssast, не могли бы вы поделиться портированием Java-кода на Python? - person Luigi Pirelli; 16.08.2019
comment
для всех и спасибо @MilanZelenka, чтобы поделиться, я подготовил перенос его java-кода на python в масштабе 1: 1. вы можете найти здесь: gist.github.com/luipir/dc33864b53cf6634f912cdd3d9ce7 - person Luigi Pirelli; 24.08.2019