Чтобы преобразовать матрицу вращения в углы Эйлера в 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)