Python 将眼睛注视(俯仰和偏航)转换为屏幕坐标(人在看什么?)

Python 将眼睛注视(俯仰和偏航)转换为屏幕坐标(人在看什么?),python,c++,opencv,math,computer-vision,Python,C++,Opencv,Math,Computer Vision,我问这个问题是对我以前的问题的修正。现在,我有一张脸在屏幕上看一些位置,还有眼睛的注视坐标(俯仰和偏航)。让我们说 左眼=[-0.06222888-0.06577308] 右眼=[-0.04176027-0.44416167] 我想确定这个人可能正在看的屏幕坐标?这可能吗?请帮忙 您需要的是: 每只眼睛的3D位置和方向 你们声称你们得到了它,但俯仰和偏航只是欧拉角,你们还需要一些参考框架和变换顺序来将它们转换回3D矢量。最好将方向保留为向量形式(我怀疑您首先得到了向量形式)。在同一坐标系中,沿所

我问这个问题是对我以前的问题的修正。现在,我有一张脸在屏幕上看一些位置,还有眼睛的注视坐标(俯仰和偏航)。让我们说

左眼=[-0.06222888-0.06577308]

右眼=[-0.04176027-0.44416167]

我想确定这个人可能正在看的屏幕坐标?这可能吗?请帮忙

您需要的是:

  • 每只眼睛的3D位置和方向

    你们声称你们得到了它,但俯仰和偏航只是欧拉角,你们还需要一些参考框架和变换顺序来将它们转换回3D矢量。最好将方向保留为向量形式(我怀疑您首先得到了向量形式)。在同一坐标系中,沿所需的方向在3D中的位置也

  • 投影平面的三维定义

    所以,至少需要起始位置和2个基向量来定义平面矩形。更好的方法是使用它,因为它允许非常容易地从它的局部坐标系转换到它的局部坐标系

  • 所以我是这样看的:

    现在只需要找到光线和平面的交点

    P(s) = R0 + s*R
    P(t) = L0 + t*L
    P(u,v) = P0 + u*U +v*V
    
    求解该系统将获得
    u,v
    ,这也是您所看到的平面内的二维坐标。当然,由于不精确性,这不是代数上可解的。因此,最好将光线转换为平面局部坐标,只需计算每条光线上的点(w=0.0)(使其成为一个简单的线性方程,且单个未知),然后计算左眼和右眼的平均位置(以防它们不能完全对齐)

    因此,如果
    R0',R',L0',L'
    是UVW局部坐标中的转换值,则:

    R0z' + s*Rz' = 0.0
    s = -R0z'/Rz'
    // so...
    R1 = R0' - R'*R0z'/Rz'
    L1 = L0' - L'*L0z'/Lz'
    P = 0.5 * (R1 + L1)
    
    其中
    p
    是您在UVW坐标中看到的点

    根据您的符号,转换很容易完成,您可以将表示平面的逆矩阵或正矩阵乘以
    (R,1)、(L,1)、(R0,0)(L0,0)
    。第四个坐标(
    0,1
    )只是告诉您是在变换向量还是点

    如果不了解更多有关坐标系、数据准确性以及已知和未知的信息,就很难比这更具体

    如果您的平面是摄影机投影平面,而不是
    U,则V
    是从摄影机拍摄的图像的x轴和y轴,W与之垂直(方向只是符号问题)

    由于您使用的是使用透视投影的相机输入,我希望您的位置和矢量能够得到校正。

    您需要的是:

  • 每只眼睛的3D位置和方向

    你们声称你们得到了它,但俯仰和偏航只是欧拉角,你们还需要一些参考框架和变换顺序来将它们转换回3D矢量。最好将方向保留为向量形式(我怀疑您首先得到了向量形式)。在同一坐标系中,沿所需的方向在3D中的位置也

  • 投影平面的三维定义

    所以,至少需要起始位置和2个基向量来定义平面矩形。更好的方法是使用它,因为它允许非常容易地从它的局部坐标系转换到它的局部坐标系

  • 所以我是这样看的:

    现在只需要找到光线和平面的交点

    P(s) = R0 + s*R
    P(t) = L0 + t*L
    P(u,v) = P0 + u*U +v*V
    
    求解该系统将获得
    u,v
    ,这也是您所看到的平面内的二维坐标。当然,由于不精确性,这不是代数上可解的。因此,最好将光线转换为平面局部坐标,只需计算每条光线上的点(w=0.0)(使其成为一个简单的线性方程,且单个未知),然后计算左眼和右眼的平均位置(以防它们不能完全对齐)

    因此,如果
    R0',R',L0',L'
    是UVW局部坐标中的转换值,则:

    R0z' + s*Rz' = 0.0
    s = -R0z'/Rz'
    // so...
    R1 = R0' - R'*R0z'/Rz'
    L1 = L0' - L'*L0z'/Lz'
    P = 0.5 * (R1 + L1)
    
    其中
    p
    是您在UVW坐标中看到的点

    根据您的符号,转换很容易完成,您可以将表示平面的逆矩阵或正矩阵乘以
    (R,1)、(L,1)、(R0,0)(L0,0)
    。第四个坐标(
    0,1
    )只是告诉您是在变换向量还是点

    如果不了解更多有关坐标系、数据准确性以及已知和未知的信息,就很难比这更具体

    如果您的平面是摄影机投影平面,而不是
    U,则V
    是从摄影机拍摄的图像的x轴和y轴,W与之垂直(方向只是符号问题)


    由于您使用的是使用透视投影的摄像头输入,我希望您的位置和矢量能够得到校正。

    您是否根据屏幕上的固定位置进行校准?这可能是一个非常困难的问题,除非你能准确地说出你有哪些信息可以用来计算坐标,否则这可能太广泛了。@Marius你能详细说明一下校准部分吗?我假设你们谈论的是特定屏幕上的凝视校准。如果是,我没有那样做。请找到以下信息,我已经,1。摄像机和屏幕总是在同一平面上,2。人与摄像机之间的距离将变化3。摄像机位于屏幕顶部。你需要位置和至少2个矢量(向上和向前)来描述你的摄像机视图,只是位置不够。。。对于立体视觉,其2倍位置和2个向量。摄像机通常用4x4变换矩阵(1x位置3矢量和投影)来描述@Spektre你能帮我理解如何获得这些矢量和一些信息吗