Разбираемся в decomposeProjectionMatrix

#opencv

#opencv

Вопрос:

Функция decomposeProjectionMatrix() выводит rotMatrix, а также rotMatrX, rotMatrY и rotMatrz (а также другие величины).

Насколько я понимаю, rotMatrix = rotMatrX * rotMatrY * rotMatrZ (где * является оператором умножения матрицы). Однако результаты не соответствуют действительности.

Вот пример декомпозиции.

 # Decompose rotation vector using Rodridgues decomposition.
self.rotation_matrix, _ = cv2.Rodrigues(self.rotation_vector)

print("Rotation matrix returned from Rodrigues:n", self.rotation_matrix)

# Combine the rotation matrix and translation vector to create pose matrix.
self.pose_matrix = cv2.hconcat((self.rotation_matrix, self.translation_vector))

# Decompose pose matrix in various properties.
properties = cv2.decomposeProjectionMatrix(self.pose_matrix)
self.projection_matrix = properties[0]
self.rot_matrix = properties[1]
self.trans_vect = properties[2]
self.rot_matrix_x = properties[3]
self.rot_matrix_y = properties[4]
self.rot_matrix_z = properties[5]
self.euler_angles = properties[6]

print("xyzn",np.matmul(self.rot_matrix_x, np.matmul(self.rot_matrix_y, self.rot_matrix_z)))
print()
print("zyxn",np.matmul(self.rot_matrix_z, np.matmul(self.rot_matrix_y, self.rot_matrix_x)))
print()
print("yxzn",np.matmul(self.rot_matrix_y, np.matmul(self.rot_matrix_x, self.rot_matrix_z)))
print()
print(self.rot_matrix)
  

Вот пример фактического вывода:

 Rotation matrix returned from Rodrigues:
 [[-0.00353424  0.99998718  0.00362615]
 [-0.145003   -0.00410033  0.98942272]
 [ 0.9894249   0.00297105  0.14501563]]
xyz
 [[-0.00353424 -0.145003    0.9894249 ]
 [ 0.99998718 -0.00410033  0.00297105]
[ 0.00362615  0.98942272  0.14501563]]

zyx
 [[-0.00353424 -0.99899952 -0.04458098]
 [ 0.145003   -0.04462205  0.98842451]
 [-0.9894249  -0.00297105  0.14501563]]

yxz
 [[-0.0237951  -0.14450917  0.98921731]
 [ 0.99949335 -0.02436119  0.02048349]
 [ 0.02113845  0.98920353  0.14501563]]

 [[-0.00353424  0.99998718  0.00362615]
 [-0.145003   -0.00410033  0.98942272]
 [ 0.9894249   0.00297105  0.14501563]]
  

Мы видим, что xyz или zyx не возвращают нам матрицу вращения! zyx почти дает нам правильный результат, но есть ошибка с отрицательным знаком! В чем проблема!?!? Спасибо!

Комментарии:

1. Я бы сказал Rz@Rx@Ry или Rz@Ry@Rx , потому что они являются вполне признанными стандартами, но я получил для обоих нормальную ошибку 0,5, что довольно сбивает с толку…

2. Увы, проблема с углами Эйлера заключается в том, что на самом деле стандарта не существует …