Предположим, у меня есть хорошее соответствие между двумя изображениями, и я попытаюсь восстановить движение камеры между ними. Я могу использовать для этого новые возможности OpenCV 3, например:
Mat E = findEssentialMat(imgpts1, imgpts2, focal, principalPoint, RANSAC, 0.999, 1, mask);
int inliers = recoverPose(E, imgpts1, imgpts2, R, t, focal, principalPoint, mask);
Mat mtxR, mtxQ;
Mat Qx, Qy, Qz;
Vec3d angles = RQDecomp3x3(R, mtxR, mtxQ, Qx, Qy, Qz);
cout << "Translation: " << t.t() << endl;
cout << "Euler angles [x y z] in degrees: " << angles.t() << endl;
Теперь мне трудно понять, что на самом деле означают R
и t
. Являются ли они преобразованием, необходимым для отображения координат из пространства камеры 1 в пространство камеры два, как в p_2 = R * p_1 + t
?
Рассмотрим этот пример с достоверными соответствиями, помеченными вручную.
Результат, который я получаю, таков:
Translation: [-0.9661243151855488, -0.04921320381132761, 0.253341406362796]
Euler angles [x y z] in degrees: [9.780449804801876, 46.49315494782735, 15.66510133665445]
Я пытаюсь сопоставить это с тем, что я вижу на изображении, и придумываю интерпретацию, которая [-0.96,-0.04,0.25]
говорит мне, что я переместился вправо, поскольку координаты переместились вдоль отрицательной оси x, но это также скажет мне, Я отошел еще дальше, так как координаты сместились по положительной оси z.
Я также повернул камеру вокруг оси Y (влево, что, я думаю, было бы вращением против часовой стрелки вокруг отрицательной оси Y, потому что в OpenCV ось Y указывает вниз, не так ли?)
Вопрос: Я правильно понимаю, и если нет, то какое?