我一直在寻找从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坐标上翻转。