Translate/Rotate 二维点改变视角

Translate/Rotate 2D points to change perspective

我正在录制用户眼睛的视频,然后使用计算机视觉来跟踪他们的眼睛以试图估计他们的注视,但是我能够记录用户的角度不是正对的并且表示的数据需要显示,就像用户直视一样。

为了进一步解释我自己,请考虑以下描述我目前所拥有的以及我正在努力实现的图像:

我认为实现这一点的最好方法可能是转换透视图,但我对此不是很精通,不知道从哪里开始。

我愿意接受任何关于实现预期结果的最佳方法的建议,但请记住我的矩阵数学相当生疏,所以如果你使用任何众所周知的方法,请迎合我的无知和尽你所能解释一切。

数据当前存储为 X/Y 个点

的 NumPy 数组

我的矩阵数学比 "fairly rusty," 差,但我有一些可能有用的想法。

总的来说,关于变换图像的信息比变换离散点的信息多得多。您可能想要考虑变换图像的眼睛部分而不是变换瞳孔点。

无论如何,这是我的想法:

方法一:简单透视变换

This answer描述了如何在Python成像库中执行透视变换,使用numpy计算变换系数。

将其调整为对点而不是图像进行操作可能很容易(google 建议 scipy 具有一些类似于 PIL.Image.transform` 的功能,这可能更适用)。如果做不到这一点,您可以将您的点渲染到二进制图像上,作为黑色背景上的白色像素,然后转换该图像并读回这些点。

但是,对于透视变换,您仍然需要一种方法来确定 pa 的坐标,即您要变换的平面。只需在眼睛周围放置一个矩形,您就可能获得合理的结果。为此,我可能会旋转你的图形,使其与 X 轴平行,方法是在眼睛的末端之间构建一条线,然后从 0° 旋转该线的角度。然后我会记录边界框,然后将它们都旋转回来。你的飞机看起来像这样:

此时,您或许可以提取眼睛主要轮廓的角度,并相应地捏合和挤压边界矩形。不过,简单的透视变换可能会被证明是不可靠的。

方法二:更好的透视变换

给定一组起点和一组终点,几乎可以肯定有一种方法可以从中计算透视变换系数,即使数字大于 4。您可以跳过边界框并假设平移每个指向它在理想形状上的对应物,然后据此计算系数。不要问我怎么做,不过,我不知道:P

方法 3:基本拉伸

如果您的 "destination shape" 具有与要转换的形状相同的点数,则您可以模拟许多图像编辑程序的拉伸功能。 Photoshop 有一些工具可以让你在形状上拉点来移动它们,拉伸里面的内容。如果您可以重现此行为,则只需将起始形状上的每个点移动到目标形状上的对应点,拉伸图像。这可能是最可靠的方法,只需拉伸图像以适应目标形状,然后从新图像中拉出瞳孔。


所有这些方法的问题在于,正常的透视变换永远不会非常准确,因为眼睛是弯曲的,而不是平坦的。您不能真正用平面近似眼睛的表面并期望完全准确。即使拉伸(方法 3)也会受到照片角度的影响;它将有利于眼睛的可见侧,并使它看起来好像眼睛向左(他们的右)看得比实际多得多。 如果照片的角度是固定的并且已知,您也许可以自行校正。否则,我看不到解决这个障碍的简单方法。


我对高等数学知之甚少,但希望我的想法对您有所帮助。

FWIW,眼动追踪得到了很好的研究,并且有几篇详尽的论文,例如 this one