python - 将 Eye Gaze(俯仰和偏航)转换为屏幕坐标(人在看哪里?)

标签 python c++ opencv math computer-vision

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

左眼 = [-0.06222888 -0.06577308]

右眼 = [-0.04176027 -0.44416167]

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

最佳答案

你需要的是:

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

    你声称你明白了,但俯仰和偏航只是欧拉角,你还需要一些引用系和变换顺序才能将它们转换回 3D vector 。最好以 vector 形式留下方向(我怀疑你首先得到了)。除了方向,您还需要在同一坐标系中的 3D 位置...

  2. 投影平面的 3D 定义

    因此您至少需要起始位置和 2 个定义平面矩形的基 vector 。更好的是使用 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) 只是告诉您是在变换 vector 还是点。

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

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

当您使用使用透视投影的相机输入时,我希望您的位置和 vector 已针对它进行了校正。

关于python - 将 Eye Gaze(俯仰和偏航)转换为屏幕坐标(人在看哪里?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52940347/

相关文章:

c++ - 在使用高达 SSSE3 的内在函数后如何从我的 16 字节寄存器中存储 4 个字节

ios - OpenCV 的 Iphone 6 相机校准

image - 自动检测图像拼贴

字节不在文件中的 Python Unicode 解码错误

python - 在 Python 中,如何转义将用作 SQL 语句的字符串中的单引号?

python - python 3.5 中的 dict.popitem()

python - 如何获取图像的二维直方图?

python - 如何分析 Google App Engine python27 运行时(不是 python)

c++ - 具有静态函数的类在 C++ 中成为抽象基类

java - 快速计算多类别组合数