Применение оценки положения OpenCV к камере Blender

#opencv #matrix #blender #coordinate-transformation #rotational-matrices

#opencv #матрица #блендер #преобразование координат #вращательные матрицы

Вопрос:

Проблема

Я пытаюсь использовать Blender для создания синтетического изображения для использования с оценкой позы OpenCV (в частности, OpenCV findEssentialMat и recoverPose ). Однако я обнаружил, что матрица вращения R, которую возвращает OpenCV, корректирует повороты вдоль осей Y и Z камеры, но не ее оси X. Я подозреваю, что это связано с тем, что Blender и OpenCV имеют разные модели камер (см. Диаграмму), но я не могу понять, как это исправить. Как бы я взял матрицу вращения, созданную с использованием модели камеры OpenCV, и применил ее к модели камеры Blender?

Блендер против Камеры OpenCV

Дополнительные сведения

Чтобы проверить это, я отрисовал сцену из (0, 0, 30), используя поворот камеры идентификации, затем повернул камеру на 10 градусов вдоль X, Y и Z. Во-первых, вот матрица вращения идентификатора (без вращения): Исходная сцена (поворот идентичности).

Вот поворот на 10 градусов вокруг X: поворот на 10 градусов вокруг X

И вот поворот на 10 градусов вокруг Y: поворот на 10 градусов вокруг Y

Наконец, вот поворот на 10 градусов вокруг Z: поворот на 10 градусов вокруг Z

Применение матрицы поворота, возвращаемой OpenCV (для предполагаемого преобразования между повернутым изображением и оригиналом), корректирует все эти повороты, кроме вокруг X, который выглядит следующим образом: неправильная коррекция вокруг 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. Спасибо!