Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从右侧摄影机到左侧,从OpenCV到Unity_Opencv_Matrix_Unity3d_Camera - Fatal编程技术网

从右侧摄影机到左侧,从OpenCV到Unity

从右侧摄影机到左侧,从OpenCV到Unity,opencv,matrix,unity3d,camera,Opencv,Matrix,Unity3d,Camera,我有一个问题,这几天一直困扰着我。我有一个用Opencv获得的右撇子(X-right,Y-up,Z-back)相机姿势,我想在Unity中进行可视化(X-right,Y-up,Z-forward),但我无法真正做到正确 我尝试使用四元数或矩阵进行转换,它应该只是镜像Z轴,并将摄影机变换的旋转设置为统一的计算变换,但我无法获得正确的转换 对于四元数,我尝试通过对Z和W项求反来镜像,我得到了一个坐标系(X-right,Y-down,Z-forward),这是有意义的,但这不是我想要实现的。对于矩阵,

我有一个问题,这几天一直困扰着我。我有一个用Opencv获得的右撇子(X-right,Y-up,Z-back)相机姿势,我想在Unity中进行可视化(X-right,Y-up,Z-forward),但我无法真正做到正确

我尝试使用四元数或矩阵进行转换,它应该只是镜像Z轴,并将摄影机变换的旋转设置为统一的计算变换,但我无法获得正确的转换

对于四元数,我尝试通过对Z和W项求反来镜像,我得到了一个坐标系(X-right,Y-down,Z-forward),这是有意义的,但这不是我想要实现的。对于矩阵,我想我应该用我的右手相机乘以一个单位矩阵,元素[2,2]设为-1,但是我没有得到我想要的

我肯定错过了一些东西,可能是我忘了的一些非常愚蠢的东西:)


有人有什么建议吗?

四元数可以被认为是绕一个轴旋转
a=(ax,ay,az)
一个角度
theta

qx = ax * sin(theta/2)
qy = ay * sin(theta/2)
qz = az * sin(theta/2)
qw = cos(theta/2)
在右手坐标系中,
theta
的旋转是逆时针方向的,而在左手坐标系中,
theta
的旋转是顺时针方向的(当然,这取决于你的视角)

因此,要将四元数从右手系统转换为Unity的左手系统,必须考虑两个因素:

  • Z轴为负
  • 旋转方向从CCW翻转到CW
  • 我们通过对四元数的
    qz
    分量求反来解释第一个因子。第二个因素通过翻转旋转轴来解释(围绕1,0,0旋转90度与围绕-1,0,0旋转90度相反)

    如果您原来的右手四元数是
    q
    ,而左手四元数是
    q'
    ,则表示您最终得到:

    q'=(-qx, -qy, qz, qw)
    
    附加说明
    • 四元数并没有天生的惯用手。四元数
      q
      同样适用于RH或LH坐标系。但是,将四元数应用于空间向量时,生成的变换将采用向量空间的惯用手

    四元数可以被认为是绕轴旋转
    A=(ax,ay,az)
    角度
    theta

    qx = ax * sin(theta/2)
    qy = ay * sin(theta/2)
    qz = az * sin(theta/2)
    qw = cos(theta/2)
    
    在右手坐标系中,
    theta
    的旋转是逆时针方向的,而在左手坐标系中,
    theta
    的旋转是顺时针方向的(当然,这取决于你的视角)

    因此,要将四元数从右手系统转换为Unity的左手系统,必须考虑两个因素:

  • Z轴为负
  • 旋转方向从CCW翻转到CW
  • 我们通过对四元数的
    qz
    分量求反来解释第一个因子。第二个因素通过翻转旋转轴来解释(围绕1,0,0旋转90度与围绕-1,0,0旋转90度相反)

    如果您原来的右手四元数是
    q
    ,而左手四元数是
    q'
    ,则表示您最终得到:

    q'=(-qx, -qy, qz, qw)
    
    附加说明
    • 四元数并没有天生的惯用手。四元数
      q
      同样适用于RH或LH坐标系。但是,将四元数应用于空间向量时,生成的变换将采用向量空间的惯用手

    可能重复的可能重复的可能重复的感谢exahustivre的解释,我今天尝试了转换,但得到的是一个具有X-右、Y-下和Z-回的坐标系。从这个坐标系中,我通过在X轴上旋转180度来实现我想要的,但是如果我在物体的Z轴上进行更多的旋转,我会得到反向旋转。当然,我可能出了什么问题。最终旋转180度的事实使我认为openCV相机的旋转可能是在一个坐标系中进行的,坐标系为X-Right、Y-Down和Z-Forward。(请参阅:)这将使开放式cv相机的观察方向与180度相反,并应将转换更改为
    q'=(-qx,qy,-qz,qw)
    。感谢exahustivre的解释,我今天尝试了转换,但我得到的是一个具有X-right、Y-down和Z-back的坐标系。从这个坐标系中,我通过在X轴上旋转180度来实现我想要的,但是如果我在物体的Z轴上进行更多的旋转,我会得到反向旋转。当然,我可能出了什么问题。最终旋转180度的事实使我认为openCV相机的旋转可能是在一个坐标系中进行的,坐标系为X-Right、Y-Down和Z-Forward。(请参阅:)这将使开放式cv相机的观察方向相对180度,并应将转换更改为
    q'=(-qx,qy,-qz,qw)