我一直在考虑从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坐标中翻转。