Матрица вращения и перевода из гомографии opencv

Я работаю над приложением для Android в Java, я рассчитал гомографию с opencv, используя findHomography(), как я могу найти матрицу позы камеры, содержащую поворот и перевод через гомографию

 Mat homography = Calib3d.findHomography(ReferencePoints2, ReferencePoints1,0,Calib3d.RANSAC);

2 ответа

Решение

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

Рассматривает плоскость z=0. Точка

 X=(x,y,0,1)'

проецируется на изображение как

p=P*X.

Теперь используйте разложение

P=K[R t],

где K - калибровочная матрица, а [R t] - внешние параметры. Поскольку z=0, вектор третьего столбца R умножается на ноль. Теперь мы можем опустить 3-й столбец, чтобы получить

p=K*[r1 r2 t]*(x,y,1)=H*(x,y,1),

где H - плоская гомография.

Вы уже вычислили H, например, из известных точек. Первый и второй столбец R и вектор t теперь можно восстановить

[r1 r2 t]=inv(K)*H.

Убедитесь, что r1 и r2 - единичная длина, тогда t - правильный вектор трансляции. Вектор третьего столбца R может быть восстановлен, потому что R является ортогональным, например, используя перекрестное произведение.

r3=cross(r1,r2).

Поскольку H является измерением, вычисленные вами r1 и r2 не являются точными. Вы можете использовать SVD для получения ближайшей матрицы вращения к измерению. Затем вы можете составить матрицу проекции

P=K[r1 r2 r3 t]

которая проецирует любую 3D-точку в системе координат на основе вашей 2D-системы координат гомографии.

Вот некоторый материал курса, который описывает эту ситуацию.

https://www.dropbox.com/s/qkulg4j64lyn0qa/2018_proj_geo_for_cv_projcv_assignment.pdf?dl=0

Вот связанный вопрос. Вычисление позы камеры с матрицей гомографии на основе 4 копланарных точек

Как отметил @nbsrujan (спасибо), для тех, кто использует OpenCV, есть функция, которая может разложить гомографию на матрицы перемещения и вращения с учетом встроенных функций.

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

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

Другие вопросы по тегам