Я смотрел на создание матриц вращения из вектора направления в координатном пространстве OpenCV, и есть одна вещь, которая меня слегка смущает.Вот матрица вращения OpenCV, которую я получил от функции opencv (назовем эту матрицу r
):
array([[-0.4136457 , -0.19724711, 0.88881427],
[-0.57926765, 0.810177 , -0.08978985],
[-0.70238609, -0.55200255, -0.44938511]])
Теперь, начиная с вектора единицы z-оси, я пытаюсь воссоздатьэтот вектор.Итак, у меня есть следующий код:
def basis(v):
v = v / np.linalg.norm(v)
if v[0] > 0.9:
b1 = np.asarray([0.0, 1.0, 0.0])
else:
b1 = np.asarray([1.0, 0.0, 0.0])
b1 -= v * np.dot(b1, v)
b1 *= np.reciprocal(np.linalg.norm(b1))
b2 = np.cross(v, b1)
return b1, b2, v
Я могу вызвать эту функцию как:
x, y, z = basis(r[:, 2])
Затем я вычисляю матрицу вращения как:
avg = np.asarray([[x[0], y[0], z[0]],
[x[1], y[1], z[1]],
[x[2], y[2], z[2]]])
Теперь выполнение этого кода возвращает:
array([[ 0.4582676 , 0. , 0.88881427],
[ 0.17414826, -0.98061724, -0.08978985],
[ 0.8715866 , 0.19593324, -0.44938511]])
Итак, знаки вдоль осей x и y перевернуты.
Теперь, в моей базисной функции, если я изменю строку b1 = np.asarray([1.0, 0.0, 0.0])
до b1 = np.asarray([-1.0, 0.0, 0.0])
.Он возвращается с правильным знаком, таким как:
array([[-0.4582676 , 0. , 0.88881427],
[-0.17414826, 0.98061724, -0.08978985],
[-0.8715866 , -0.19593324, -0.44938511]])
Я предполагаю, что это как-то связано с ручностью, поскольку начало opencv находится в верхнем левом углу, а оси y увеличиваются в направлении вниз, а невверх, но то, что меня смущает, так это то, почему изменение знака координаты x единичного вектора имеет значение?Я ожидал изменить другое условие, например, b1 = np.asarray([0.0, 1.0, 0.0])
, чтобы знак перевернулся в координате y.