В OpenCV можно оценить относительное вращение и перемещение камеры от отслеживаемых точек, используя функцию recoverPose
, но я пытаюсь выяснить, можно ли сделать что-то подобное, используя положение и ориентацию камеры в двух последовательных точках во времени например, для наземных данных в наборе данных TUM RGB-D (https://vision.in.tum.de/data/datasets/rgbd-dataset/file_formats), где на каждой отметке времени они обеспечивают перемещение и ориентацию камеры относительно глобальной системы координат.
Очевидно, что можно просто вычесть значения перевода, чтобы получить глобальный относительный перевод, но я хочу вычислить относительное вращение и перемещение камеры от одного кадра к другому, чтобы получить сопоставимые результаты с recoverPose
.
Насколько я понимаю (из https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html#ga40919d0c7eaf77b0df67dd76d5d24fa1), можно сформировать матрицу для преобразования из мира в координаты камеры через матрицу 4x4, верхняя 3x3 которой представляет глобальное вращение камеры и 4-й столбец это перевод из глобального происхождения в. Будет ли уместно решить мою проблему просто с помощью умножения матриц, другими словами, вычислите C = AB ', где C - матрица «относительного изменения», A - матрица второго кадра, а B - матрица первый кадр?
Код, который у меня сейчас есть для этого:
from pyquaternion import Quaternion
import numpy as np
quatA = Quaternion(x=x2, y=y2, z=z2, w=w2)
quatB = Quaternion(x=x1, y=y1, z=z1, w=w1)
matA = quatA.transformation_matrix
matA[0,3] = tx2
matA[1,3] = ty2
matA[2,3] = tz2
matB = quatB.transformation_matrix
matB[0,3] = tx1
matB[1,3] = ty1
matB[2,3] = tz1
matC = matA * np.linalg.inv(matB)
Этот код выполняется, но я понятия не имею, вычисляет ли что-нибудь полезное.
Если это совершенно неправильно Какой лучший способ добиться этого с OpenCV и Python?