将视线(俯仰和偏航)转换为屏幕坐标(此人正在看什么?)

时间:2018-10-23 02:33:21

标签: python c++ opencv math computer-vision

我要问的问题是我以前的question的修整版。现在,我的脸在屏幕上看起来有些位置,并且凝视着两只眼睛的坐标(俯仰和偏航)。让我们说

左眼= [-0.06222888 -0.06577308]

Right_Eye = [-0.04176027 -0.44416167]

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

1 个答案:

答案 0 :(得分:1)

您需要的是:

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

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

  2. 投影平面的3D定义

    因此,您至少需要定义平面矩形的起始位置和2个基向量。更好的方法是使用4x4 homogenous transform matrix,因为这样可以非常轻松地在其本地坐标系之间进行转换...

所以我这样看:

line of sight

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

P(s) = R0 + s*R
P(t) = L0 + t*L
P(u,v) = P0 + u*U +v*V

解决该系统将导致获取u,v,这也是您正在查看的飞机内部的2D坐标。当然,由于不准确,这将不是可代数的。因此,最好将光线转换为平面局部坐标,并仅使用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垂直于它(方向只是表示法)。

当您使用使用透视投影的摄像机输入时,希望您对其位置和矢量进行校正。