将2D点进行平移/旋转以改变视角

6
我正在录制用户眼睛的视频,并使用计算机视觉来跟踪他们的眼睛,以估计他们的注视点,但我能够记录用户的角度不是正面,因此需要显示数据表示用户正在正视前方。
为了更好地解释,请考虑以下图像,它们展示了我目前所拥有的和我正在努力实现的内容:

enter image description here

enter image description here

我认为实现这个目标的最好方法可能是翻译视角,但由于我的了解不够深入,我不知道该从哪里开始。
我愿意听取任何关于实现所需结果的最佳方法的建议,但请记住,我的矩阵数学知识相当生疏,因此如果您使用任何众所周知的方法,请迎合我的无知,并尽可能详细地解释一切。
数据当前存储为X/Y点的NumPy数组。
1个回答

4
我的矩阵数学很生疏,但我有一些想法可能会有所帮助。总的来说,关于转换图像和转换离散点,前者有更多的信息。您可能想考虑转换图像中的眼部区域而不是转换瞳孔点。无论如何,以下是我的想法:方法1:简单透视变换。此答案描述了如何使用Python Imaging Library执行透视变换,使用numpy计算变换系数。这可能很容易调整以处理点而不是图像(谷歌建议scipy具有类似于PIL.Image.transform的一些功能,可能更适用)。如果失败,您可以将点渲染到二进制图像上,作为黑色背景上的白色像素,然后转换该图像并重新读取点。

然而,对于透视变换,您仍需要一种确定要转换的平面pa坐标的方法。您可以通过围绕眼睛拟合一个矩形来实现合理的结果。为此,我可能会将图形旋转成与X轴平行,方法是构造一条线以连接眼睛的两端,然后按照该线与0°的角度旋转。然后,我会记录边框并将其旋转回来。您的平面将如下所示:

Example

在这一点上,您可能能够提取眼睛主要轮廓的角度,并相应地收缩和挤压边界矩形。简单的透视变换可能会证明不可靠。
方法2:更好的透视变换
给定一组起始点和一组结束点,几乎肯定有一种方法可以从中计算透视变换系数,即使数字大于4。您可以跳过边界框并假设将每个点平移到理想形状上的对应点,然后根据此计算系数。不过,别问我怎么做,我也不知道:P
方法3:基本拉伸
如果您的“目标形状”具有与进行转换的形状相同的点数,则可以模拟许多图像编辑程序的拉伸功能。 Photoshop具有工具,允许您拉动形状上的点以移动它们,从而拉伸内容。如果您能够重现此行为,则可以将起始形状上的每个点移动到目标形状上的相应点,从而拉伸图像。这可能是最可靠的方法,只需将图像拉伸以适合目标形状,然后从该新图像中提取瞳孔即可。
所有这些方法的问题在于,正常的透视变换永远不会完全准确,因为眼睛是弯曲的,而不是平面的。你不能真正用平面来近似眼睛的表面并期望完全准确。即使是拉伸(第三种方法),也会受到你照片的角度的影响;它会偏向眼睛的可见侧,并使其看起来好像眼睛向左(他们的右边)看得更远。如果照片的角度是恒定和已知的,那么您可能可以自己纠正这个问题。否则,我看不到解决这个障碍的简单方法。
我对高级数学知之甚少,但希望我的想法能对您有所帮助。
顺便说一句,眼动追踪已经得到了广泛研究,有几篇深入的论文,比如this one

1
非常好的答案,我会研究这些方法。如果没有人提供更好的解决方案,我很乐意授予您奖励。 - Aphire
谢谢!我并没有给出一个确定的答案,所以如果有更好的答案出现,他们肯定值得得到奖励,但除此之外,听起来很不错。:D - Luke Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接