我的矩阵数学很生疏,但我有一些想法可能会有所帮助。总的来说,关于转换图像和转换离散点,前者有更多的信息。您可能想考虑转换图像中的眼部区域而不是转换瞳孔点。无论如何,以下是我的想法:方法1:简单透视变换。
此答案描述了如何使用Python Imaging Library执行透视变换,使用numpy计算变换系数。这可能很容易调整以处理点而不是图像(谷歌建议scipy具有类似于PIL.Image.transform的一些功能,可能更适用)。如果失败,您可以将点渲染到二进制图像上,作为黑色背景上的白色像素,然后转换该图像并重新读取点。
然而,对于透视变换,您仍需要一种确定要转换的平面pa
坐标的方法。您可以通过围绕眼睛拟合一个矩形来实现合理的结果。为此,我可能会将图形旋转成与X轴平行,方法是构造一条线以连接眼睛的两端,然后按照该线与0°的角度旋转。然后,我会记录边框并将其旋转回来。您的平面将如下所示:
![Example](https://istack.dev59.com/3LYPY.webp)
在这一点上,您可能能够提取眼睛主要轮廓的角度,并相应地收缩和挤压边界矩形。简单的透视变换可能会证明不可靠。
方法2:更好的透视变换
给定一组起始点和一组结束点,几乎肯定有一种方法可以从中计算透视变换系数,即使数字大于4。您可以跳过边界框并假设将每个点平移到理想形状上的对应点,然后根据此计算系数。不过,别问我怎么做,我也不知道:P
方法3:基本拉伸
如果您的“目标形状”具有与进行转换的形状相同的点数,则可以模拟许多图像编辑程序的拉伸功能。 Photoshop具有工具,允许您拉动形状上的点以移动它们,从而拉伸内容。如果您能够重现此行为,则可以将起始形状上的每个点移动到目标形状上的相应点,从而拉伸图像。这可能是最可靠的方法,只需将图像拉伸以适合目标形状,然后从该新图像中提取瞳孔即可。
所有这些方法的问题在于,正常的透视变换永远不会完全准确,因为眼睛是弯曲的,而不是平面的。你不能真正用平面来近似眼睛的表面并期望完全准确。即使是拉伸(第三种方法),也会受到你照片的角度的影响;它会偏向眼睛的可见侧,并使其看起来好像眼睛向左(他们的右边)看得更远。如果照片的角度是恒定和已知的,那么您可能可以自己纠正这个问题。否则,我看不到解决这个障碍的简单方法。
我对高级数学知之甚少,但希望我的想法能对您有所帮助。
顺便说一句,眼动追踪已经得到了广泛研究,有几篇深入的论文,比如
this one。