代码之家  ›  专栏  ›  技术社区  ›  Luca

在opencv坐标系中创建旋转矩阵

  •  1
  • Luca  · 技术社区  · 6 年前

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

    0 回复  |  直到 6 年前