Я запускаю простой тест для оценки позы камеры OpenCV. Имея фотографию и ту же фотографию, увеличенную (увеличенную), я использую их для определения функций, вычисления необходимой матрицы и восстановления поз камеры.
Mat inliers;
Mat E = findEssentialMat(queryPoints, trainPoints, cameraMatrix1, cameraMatrix2,
FM_RANSAC, 0.9, MAX_PIXEL_OFFSET, inliers);
size_t inliersCount =
recoverPose(E, queryGoodPoints, trainGoodPoints, cameraMatrix1, cameraMatrix2, R, T, inliers);
Поэтому, когда я указываю исходное изображение в качестве первого, а увеличенное изображение — в качестве второго, я получаю перевод T близкий к [0; 0; -1]. Однако вторая камера (увеличенная) находится практически ближе к объекту, чем первая. Таким образом, если ось Z перемещается из плоскости изображения в сцену, вторая камера должна иметь положительное смещение вдоль оси Z. Для результата, который я получаю, ось Z перемещается от плоскости изображения к камере, которая наряду с другими осями (X идет вправо, Y идет вниз) образует левую систему координат. Это правда? Почему этот результат отличается от показанной системы координат Вот?
По данным OpenCV документ, алгоритм в функции recoveryPose основан на статье «Нистер Д. Эффективное решение пятиточечной задачи относительной позы, CVPR 2003». Из уравнений, приведенных в разделе 2 данной статьи, мы знаем, что в нем используются основные соотношения треугольника (см. Рисунок Вот):
х2 = р * х1 + т
Следовательно, трансляция t является вектором от cam2 к cam1 в кадре cam2. Это объясняет, почему вы получаете ответ t близкий к [0; 0; -1].
Кажется, что функция recoveryPose () возвращает первое преобразование камеры относительно второго (что было не интуитивно для меня и не ясно указано в документации). С этим предположением тест работает правильно.