Преобразование матрицы вращения в углы Эйлера в Python с помощью OpenCV (cv2)

Чтобы преобразовать матрицу вращения в углы Эйлера в Python с использованием библиотеки OpenCV (cv2), доступно несколько методов. Вот несколько примеров:

Метод 1: использование cv2.Rodrigues

import cv2
import numpy as np
def rotation_matrix_to_euler_angles(rotation_matrix):
    _, _, angles, _ = cv2.Rodrigues(rotation_matrix)
    return angles
# Example usage:
rotation_matrix = np.array([[0.707, -0.707, 0], [0.707, 0.707, 0], [0, 0, 1]])
euler_angles = rotation_matrix_to_euler_angles(rotation_matrix)
print(euler_angles)

Метод 2: использование cv2.decomposeProjectionMatrix

import cv2
import numpy as np
def rotation_matrix_to_euler_angles(rotation_matrix):
    _, _, _, _, _, _, euler_angles = cv2.decomposeProjectionMatrix(rotation_matrix)
    return euler_angles
# Example usage:
rotation_matrix = np.array([[0.707, -0.707, 0], [0.707, 0.707, 0], [0, 0, 1]])
euler_angles = rotation_matrix_to_euler_angles(rotation_matrix)
print(euler_angles)

Метод 3: использование numpy

import numpy as np
def rotation_matrix_to_euler_angles(rotation_matrix):
    sy = np.sqrt(rotation_matrix[0, 0] * rotation_matrix[0, 0] + rotation_matrix[1, 0] * rotation_matrix[1, 0])
    singular = sy < 1e-6
    if not singular:
        x = np.arctan2(rotation_matrix[2, 1], rotation_matrix[2, 2])
        y = np.arctan2(-rotation_matrix[2, 0], sy)
        z = np.arctan2(rotation_matrix[1, 0], rotation_matrix[0, 0])
    else:
        x = np.arctan2(-rotation_matrix[1, 2], rotation_matrix[1, 1])
        y = np.arctan2(-rotation_matrix[2, 0], sy)
        z = 0
    return np.array([x, y, z])
# Example usage:
rotation_matrix = np.array([[0.707, -0.707, 0], [0.707, 0.707, 0], [0, 0, 1]])
euler_angles = rotation_matrix_to_euler_angles(rotation_matrix)
print(euler_angles)