我正在录制用户眼睛的视频,然后使用计算机视觉跟踪他们的眼睛以试图估计他们的目光,但是我能够记录用户的角度不是直接的并且表示需要显示数据,就好像用户正在直视。
为了进一步解释自己,请考虑下面的图像,描述我到目前为止所做的事情以及我想要实现的目标:
我想也许最好的方法就是翻译视角,但不是很精通,我不知道从哪里开始。
我愿意接受有关达到预期效果的最佳方法的任何建议,但请记住,我的矩阵数学是相当生疏的,所以如果你使用任何众所周知的方法,请迎合我的无知并解释一切你也可以。
数据当前存储为X / Y点的NumPy数组
答案 0 :(得分:4)
我的矩阵数学比“相当生疏”更糟糕,但我有一些可能有用的想法。
总的来说,有关转换图像的信息比转换离散点要多得多。您可能希望研究转换图像的眼部而不是转换瞳孔点。
无论如何,这是我的想法:
This answer描述了如何在Python Imaging Library中执行透视转换,使用numpy
计算转换系数。
这可能很容易使其适应点而不是图像(谷歌建议scipy
有一些类似于PIL.Image.transform`的功能可能更适用)。如果做不到这一点,您可以将您的点渲染到二进制图像上,如黑色背景上的白色像素,然后转换该图像并将点读回。
但是,对于透视变换,您仍需要一种方法来确定pa
的坐标,即您正在变换的平面。只需在眼睛周围设置一个矩形,就可以获得合理的结果。要做到这一点,我可能会旋转你的数字,使它与X轴平行,在眼睛的两端之间构建一条直线,然后从0°线的角度旋转。然后我会记录边界框,并向后旋转。你的飞机看起来像这样:
此时,您可能能够提取眼睛主要轮廓的角度,并相应地捏合和挤压您的边界矩形。但是,简单的透视转换可能会证明是不可靠的。
给定一组起点和一组终点,几乎可以肯定有一种计算透视变换系数的方法,即使数字大于4.您可以跳过边界框并假设将每个点转换为它是理想形状的对应物,然后根据它计算系数。不要问我怎么样,我不知道:P
如果您的“目标形状”与您要变换的形状具有相同的点数,则可以模拟许多图像编辑程序的拉伸功能。 Photoshop有一些工具可以让你在形状上拉点来移动它们,拉伸内部的内容。如果您可以重现此行为,则只需将起始形状上的每个点移动到目标形状上的相应点,即可拉伸图像。这可能是最可靠的方法,只需将图像拉伸以适合目标形状,然后从新图像中拉出瞳孔。
所有这些方法的问题在于,正常的透视变换永远不会非常准确,因为眼睛是弯曲的,而不是平坦的。你不能用平面逼近眼睛的表面,并期望完全准确。即使拉伸(接近3)也会受到照片角度的影响;它会有利于眼睛的可见侧面,使它看起来好像眼睛看起来远远超过它(它们的右侧)。 如果照片的角度是恒定且已知的,您可以自己更正。否则,我看不到解决这个障碍的简单方法。
我对高级数学知之甚少,但希望你发现我的想法很有帮助。
FWIW,眼动追踪得到了很好的研究,有几篇全面的论文,如this one