【问题标题】:Convert Eye Gaze (Pitch and yaw) into screen coordinates (Where the person is looking at?)将 Eye Gaze(俯仰和偏航)转换为屏幕坐标(人在看哪里?)
【发布时间】:2019-03-27 04:16:18
【问题描述】:

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

Left_Eye = [-0.06222888 -0.06577308]

右眼 = [-0.04176027 -0.44416167]

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

【问题讨论】:

  • 您是否根据屏幕上的固定位置进行校准?这可能是一个非常困难的问题,并且可能过于宽泛,除非您能准确地说明您有哪些信息可用于计算坐标。
  • @Marius 你能详细说明校准部分吗?我假设您正在谈论特定屏幕上的凝视校准。如果是,不,我没有那样做。请找到我的以下信息,1.相机和屏幕始终在同一平面上,2.人到相机的距离会有所不同 3.相机在屏幕顶部。
  • 您需要位置和至少 2 个向量(向上和向前)来描述您的相机视图仅位置是不够的 ...对于立体视觉,它的 2x 位置和 2 个向量.相机通常用 4x4 变换矩阵(1x 位置 3 向量和投影)来描述
  • @Spektre 你能帮我理解如何获取这些向量以及一些关于相机视图是什么意思的信息
  • 就您的链接问题而言,仅眼睛的位置并不多,您还需要瞳孔的位置,并从偏斜和相对差异决定它们的方向......

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


【解决方案1】:

你需要的是:

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

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

  2. 投影平面的 3D 定义

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

所以我是这样看的:

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

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 与其垂直(方向只是符号问题)。

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

【讨论】:

  • 我根据您的回答尝试了几件事,但我无法继续进行:(1)。我计算了相机的内在和外在矩阵(但是,焦距似乎在每条轨迹中都在变化,不知道为什么会这样?)(2)。将俯仰和偏航转换为 X、Y、Z (3)。使用相机矩阵将 2D 虹膜中心从凝视起源的位置转换为 3D 点(相机坐标)。现在我无法继续假设相机位于(0,0,0)处如何定义平面。我的屏幕是 42 英寸 x 40 英寸。相机正好在顶部边缘的中心。请建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多