Матрица вращения и перевода из гомографии 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 имеет функцию, которая может разложить гомографию на матрицы перевода и вращения. Но мы должны выбрать правильную пару матриц перевода и вращения из массива возможных матриц, возвращаемых этой функцией.
вектор нормали - это нормаль поверхности в кадре первой камеры. Если вы знаете поворот камеры в мире для начального кадра, его можно использовать для отфильтровывания правильного перевода и пары поворотов из списка возможностей.