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

pav*_*ash 1 c++ python math opencv computer-vision

我问这个问题是我之前问题的精简版本。现在我有一张脸看着屏幕上的某个位置,并且还有两只眼睛的注视坐标(俯仰和偏航)。让我们说

左眼 = [-0.06222888 -0.06577308]

右眼 = [-0.04176027 -0.44416167]

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

Spe*_*tre 5

你需要的是:

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

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

  2. 投影平面的 3D 定义

    所以你至少需要起始位置和 2 个定义平面矩形的基本向量。更好的方法是使用4x4 齐次变换矩阵,因为这样可以非常容易地在局部坐标系之间进行变换...

所以我是这样看的:

视线

所以现在只需找到射线和平面之间的交点

P(s) = R0 + s*R
P(t) = L0 + t*L
P(u,v) = P0 + u*U +v*V
Run Code Online (Sandbox Code Playgroud)

解决这个系统将导致获取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)
Run Code Online (Sandbox Code Playgroud)

P你在 UVW 坐标中看到的点在哪里?

根据您的符号,可以轻松完成转换,您可以将表示平面的逆矩阵或直接矩阵乘以(R,1),(L,1),(R0,0)(L0,0)。第四个坐标 ( 0,1) 仅表明您正在变换矢量还是点。

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

如果你的平面是相机投影平面,那么U,V从相机拍摄的图像的 x 和 y 轴就是,W 垂直于它(方向只是符号问题)。

当您使用使用透视投影的相机输入时,我希望您的位置和矢量能够得到纠正。