opencv - 右手摄像机到左手,OpenCV到Unity

标签 opencv matrix unity3d camera

在过去的几天里,我一直困扰着我。我有一个用Opencv拍摄的右手姿势(X右,Y向上,Z后),我想在Unity中进行可视化(X右,Y向上,Z前)。设法做到正确。

我尝试使用四元数或矩阵来完成此操作,它应该只是镜像Z轴,并将Unity中摄影机的变换旋转设置为计算出的变换,但是我无法获得正确的变换。

对于四元数,我尝试通过否定Z和W项来反射(reflect),并获得了一个坐标系(X右,Y向下,Z向前),这是有道理的,但这并不是我想要实现的。对于矩阵,我认为我应该将右手相机乘以一个单位为[2,2]的恒等矩阵,但是我没有得到想要的东西。

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

有人建议吗?

最佳答案

四元数可以认为是围绕轴a = (ax, ay, az)旋转 Angular 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坐标系。但是,将四元数应用于空间 vector 时,所得的变换将具有 vector 空间的惯用性。
  • 关于opencv - 右手摄像机到左手,OpenCV到Unity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816497/

    相关文章:

    python - numpy.genfromtxt 导入元组而不是数组

    r - 将一堆函数应用于 R 中矩阵的列

    c++ - 在opencv中访问多 channel 数组中的整个 channel

    R将矩阵中的所有列与循环中的每个列进行比较

    unity3d - SetTransform导致Unity LeapMotion对象旋转过快

    c# - 在 Unity 中检测重叠二维对象的输入碰撞

    c# - 按球体上的位置对 Vector3 进行排序

    c# - 人脸识别 OpenCV 2.2

    python - Haar_classifier 在对象识别中需要很长时间才能检测到

    python - 计算并绘制分割掩码像素