#opencv #matrix #blender #coordinate-transformation #rotational-matrices
#opencv #матрица #блендер #преобразование координат #вращательные матрицы
Вопрос:
Проблема
Я пытаюсь использовать Blender для создания синтетического изображения для использования с оценкой позы OpenCV (в частности, OpenCV findEssentialMat
и recoverPose
). Однако я обнаружил, что матрица вращения R, которую возвращает OpenCV, корректирует повороты вдоль осей Y и Z камеры, но не ее оси X. Я подозреваю, что это связано с тем, что Blender и OpenCV имеют разные модели камер (см. Диаграмму), но я не могу понять, как это исправить. Как бы я взял матрицу вращения, созданную с использованием модели камеры OpenCV, и применил ее к модели камеры Blender?
Дополнительные сведения
Чтобы проверить это, я отрисовал сцену из (0, 0, 30), используя поворот камеры идентификации, затем повернул камеру на 10 градусов вдоль X, Y и Z. Во-первых, вот матрица вращения идентификатора (без вращения):
Вот поворот на 10 градусов вокруг X:
И вот поворот на 10 градусов вокруг Y:
Наконец, вот поворот на 10 градусов вокруг Z:
Применение матрицы поворота, возвращаемой OpenCV (для предполагаемого преобразования между повернутым изображением и оригиналом), корректирует все эти повороты, кроме вокруг X, который выглядит следующим образом:
Кажется, что вместо правильного поворота на -10 градусов вокруг X матрица вращения поворачивается еще на 10 градусов вокруг X.
Ответ №1:
Переход от матрицы OpenCV к Blender может быть выполнен путем умножения на другую матрицу вращения, чтобы компенсировать изменение систем координат.
mat = [[1, 0, 0],
[0, -1, 0],
[0, 0, -1]]
Вы сказали, что компоненты Y и Z уже компенсируются, поэтому, возможно, отрицание матрицы — это то, что вам нужно?
Комментарии:
1. Ответ оказался таким же простым, как выполнение
R @ mat
, гдеR
находится матрица вращения OpenCV. Спасибо!