Определение местоположения камеры по 3 известным точкам
Я новичок здесь - так что, пожалуйста, потерпите меня, если я сделаю ложную ошибку!
У меня вопрос: есть ли хороший алгоритм для определения 3d-местоположения и ориентации камеры на основе того, где 3 (или более) известных 3d-точки оказываются на изображении, если смотреть с этой камеры?
Вопрос сводится в моем расчете к 6 уравнениям с 6 неизвестными, хотя я ищу общее решение, и уравнения сложные и тригонометрические.
Любые идеи с благодарностью получены!
Ура,
Майк
6 ответов
В общем, я думаю, что не будет единственного решения.
Вы можете разделить его на две задачи по три неизвестных в каждой: положение и ориентация. Сначала предположим, что камера не вносит неизвестных искажений (например, проецируя сферу на плоский кусок пленки). Не обращайте внимания на ориентацию в течение минуты, и вы измеряете угловое разделение между объектами. С этого момента я буду предполагать, что есть только три пункта и что вы можете различить их - они разных цветов или что-то в этом роде. Измерение угла между двумя известными точками ставит вас на двухмерную поверхность в пространстве (я не могу легко построить графику, но они выглядят как линии электрического поля). Добавление другой точки поставит вас на другую, пересекающуюся поверхность; есть много вырождения, и не очевидно, что уравнения имеют точное точное решение.
Стоит отметить, что каждая пара, на которую вы смотрите, накладывает ограничение громкости, поэтому может быть полезно сначала посмотреть на самые тупые углы и наложить некоторые границы на то, где может находиться камера.
Если вы можете определить положение, то ориентация проста и требует только двух (не затмевающих) точек.
Вы должны использовать алгоритм Ransac! у вас должно быть эталонное фото, которое вы знаете по его местоположению с камеры в xyz, тогда вы должны сравнить новое изображение с эталонным изображением с помощью ransac. Затем вы можете найти смещение между двумя фотографиями, а затем добавить его в xyz refernce
Если вы думаете об этом... это на самом деле довольно простая идея... вот мой ход мыслей:
- Найдите самолет, на котором находятся 3 точки. Эта плоскость будет параллельна вашей плоскости проекции.
- Предполагая, что у вас есть точки A, B и C. Найдите перекрестное произведение вектора, идущего от A к B и от A к C
- Нормализуй это. Это твой самолет нормальный.
- Решите для барицентрического уравнения, вставив значения для Ax + By + Cz + D = 0, где A - x нормали, B - y нормали, C - z нормали, и вы решаете для D. Как только вы есть D, у вас есть представление самолета.
- Найдите ограничивающий прямоугольник вокруг всех трех точек на этой плоскости, это будет ваша геометрия рендеринга, конец вашего усеченного конуса (объем рендеринга).
- Найдите центральную точку этого ограничительного прямоугольника, который мы только что нашли. Это ваш начальный центр проекции.
- Переместите эту центральную точку от ограничивающего прямоугольника, добавляя (или вычитая) нормаль из точки. Продолжайте двигаться, пока не достигнете желаемого поля зрения.
С более чем тремя точками это, безусловно, возможно.
Именно так работают звездные трекеры для контроля ориентации космического корабля.
Это виртуальная камера или настоящая камера? Вам также нужно будет смотреть как f/stop и фокусное расстояние и, возможно, даже форму оптики. Это действительно зависит от того, насколько точно вы должны быть в соответствии с положением и насколько далеко друг от друга сфотографированные объекты. Если вы используете 200-миллиметровый зум с фокусировкой всего в несколько футов, ваше поле зрения может иметь ширину всего несколько дюймов. Тем не менее, если вы используете 4,5-миллиметровый полный круг "рыбий глаз" и имеете прямую круговую проекцию, у вас может быть 180 градусов обзора.
С калиброванной камерой - да.
Все, что вам нужно, это фокусное расстояние (отображает пиксели в углы), центральная ось камеры (помещает луч в вашу сцену), а затем проецировать точку на этом луче просто.
Взгляните на OpenCV, он делает это как часть калибровки камеры для стерео