cronk
@cronk
Делаю графику для кино. Роботы, взрывы, пиу-пиу!

Как найти положение камеры по трем точкам в пространстве?

412a921c60e647a4a24c6a4e3543f673.png
Уже некоторое время в моей голове сидит идея скрипта для Блендера, который бы находил положение камеры в прострастве по известным точкам.

Т.е. у нас есть фотография, в данном случае стула. Мне кажется возможным, зная положение точек в пространстве, зная координаты тех же точек на фотографии (а также угол зрения камеры), найти положение камеры. Но как подступиться к решению этой задачи я не понимаю. В голове крутятся обрывки мыслей вроде "сечение пирамиды", "центральная проекция" и прочая "стереометрия".

Подскажите, в каком направлении копать?
Скрипт будет писаться на третьем питоне, может есть какие-то полезные пакеты?
  • Вопрос задан
  • 4161 просмотр
Пригласить эксперта
Ответы на вопрос 3
Mrrl
@Mrrl
Заводчик кардиганов
Непростая задача.
Сначала по фотографии измеряете углы между лучами, а по модели - расстояния между точками. Потом обозначаете через x,y,z неизвестные расстояния от камеры до точек (длину каждого луча), и записываете уравнения из теоремы косинусов:
x^2-2*a*x*y+y^2=P^2
x^2-2*b*x*z+z^2=Q^2
y^2-2*c*y*z+z^2=R^2
Здесь a,b,c - косинусы углов между лучами, а P,Q,R - расстояния.
Дальше надо решить эту систему. Теоретически, она сводится к уравнению 8-й степени от одной переменной z. MAPLE смог найти этот многочлен, он занимает чуть больше экрана. Не знаю, хороший ли это вариант - может быть, и да. Можно попытаться решить систему численно - перебрать разные стартовые значения x,y,z и искать корень методом Ньютона. Но учтите, что система плохая - у неё вполне могут найтись 4 близких корня с положительными x,y,z. А могут и не найтись - тогда будут локальные минимумы. Можно перебрать расстояние x с мелким шагом. Для каждого x найти два варианта y, два варианта z, подставить их в третье уравнение, и из самой лучшей тройки начать искать решение - можно методом Ньютона, но можно и делением отрезка пополам.
После того, как x,y,z найдены, находите положение центра камеры - как точку пересечения трёх сфер. И дальше надо найти правильную ориентацию. Это довольно противно, но должно быть не очень сложно (по сравнению со всеми предыдущими шагами).
Ответ написан
@Urrus
Это задача Perspective-n-Point (PnP) - а она не такая простая, как кажется, и решается множеством разных способов (типа ePnP: cvlabwww.epfl.ch/~lepetit/papers/lepetit_ijcv08.pdf, с использованием RANSAC, и т.д). В общем, математики там полно, поэтому лучше найти уже готовую библиотеку, которая умеет делать такие вещи. Сам я пользовался только методами из OpenCV (типа solvePnP(...), solvePnPRansac(...)), она есть для питона, но кажется будет довольно жирновато тащить ее только ради плагина.
Ответ написан
engine9
@engine9
Разрабатываю интерфейсы и трехмерные презентации.
Может быть я не совсем корректно отвечу, но трекинг с видео штатными методами способен восстановить расстояние и путь камеры в пространстве. Но программе нужно указать некоторые подсказки, начиная от точек, заканчивая направлением "верха" сцены.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы