Я не знаю точно, какая перестановка является вашей реализацией для получения eulerangles из матрицы, но она отличается от той, которую использует декомпозицияProjectionMatrix.это причина разных углов.
Как уже говорилось, углы Эйлера всегда зависят от порядка.Есть 12 различных перестановок.См. Углы Эйлера для получения дополнительной информации.
декомпозиция ProjectionMatrix из opencv использует порядок "XYZ" для своего представления угла Эйлера.
существуют различные библиотеки вращенияна пипи.Я использую для этого примера transforms3d.Я устанавливаю входные параметры вручную и матрицу вращения с помощью функции euler2mat пакета transforms3d.Я создаю матрицу вращения с XYZ-соглашением, например, угол крена (X): 90 °, шаг (Y): 45 °, рыскание (X): 180 °
from transforms3d import euler
from math import pi,radians
rotation_matrix = euler.euler2mat(radians(90), radians(45),
radians(180), 'sxyz')
tvec = np.zeros(3).reshape(1,3).T
camera_matrix = np.array([[1500,0,320],[0,1500,256],[0,0,1]])
projection_matrix = camera_matrix.dot(np.hstack((rotation_matrix, tvec)))
rot = cv2.decomposeProjectionMatrix(projection_matrix)
вращение_matrix (вход) и поворот[1] (выходные данные) одинаковы (но только с правильным порядком эйлера "sxyz"):
array([[-7.07106781e-01, -7.07106781e-01, 7.91668771e-17],
[ 8.65956056e-17, 2.53632657e-17, 1.00000000e+00],
[-7.07106781e-01, 7.07106781e-01, 4.32978028e-17]])
rot [-1]:
[[90. ]
[ 45. ]
[ 180. ]]
естьеще несколько подводных камней с 3d вращениями.Например,