создание матриц вращения в системе координат opencv - PullRequest
0 голосов
/ 26 ноября 2018

Я смотрел на создание матриц вращения из вектора направления в координатном пространстве 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.

...