到目前为止,我已经能够准确地检测到瞳孔和眼角。您可以在这里看到我在回答我自己的问题时上传的一些快照:
这是我到目前为止所做的。我通过查看 TLCP、TRCP 和 BLCP 来校准用户的视线,其中
CP = calibration point; a screen point used for calibration
B = bottom
T = top
L= left
R = right
gaze_width = TRCP.x - TLCP.x
gaze_height = BLCP.y- TLCP.y
而我通过看那些CP得到的对应凝视点被称为GP
凝视点GP的计算:
我从当前瞳孔中心的位置减去 TLGP 的纵坐标值,因为注视点必须落在我希望你理解的假设矩形中,它真的很简单。
我使用基本缩放系统将从瞳孔中心位置计算的凝视点线性映射到屏幕点,其中比例计算如下:
scaleX = screen_width/gaze_width
scaleY = screen_height/gaze_height
对于任何注视点 P(x,y),我将相应的屏幕点 Q(m,n) 计算为:
m = scaleX*x
n = scaleY*y
但问题是,即使在几乎完美的瞳孔检测之后(几乎是因为在光线不足的情况下它会产生误报。但我打算将其置于限制之下,因为我无法处理它,我没有足够的时间),我' m 的视线宽度和视线高度仍然很差。
这是一个测试运行日志:
DO_CAL= True
Gaze Parameters:
TLGP = (38, 26) | TRGP = (20, 22) | BLGP = (39, 33)
screen height = 768 screen width = 1366
gaze height = 7 gaze width = 18
scales: X = 75.8888888889 | Y = 109.714285714
Thing on = True
Gaze point = (5, 3)
Screen point: (987, 329)
Gaze point = (5, 3)
Screen point: (987, 329)
Gaze point = (7, 5)
Screen point: (835, 549)
Thing on = False
TLGP = (37, 24) | TRGP = (22, 22) | BLGP = (35, 29)
screen height = 768 screen width = 1366
gaze height = 5 gaze width = 15
scales: X = 91.0666666667 | Y = 153.6
Thing on = True
Gaze point = (12, 3)
Screen point: (1093, 461)
Gaze point = (12, 3)
Screen point: (1093, 461)
ESC pressed
只需查看注视点及其对应的注视检测屏幕点(在它们下方)。x,y 坐标值的巨大差异让我抓狂。星期一是最后的演讲。
在这种方法之后,我理论化了另一种方法:
校准与第一种方法相同。我会检测凝视的运动及其方向。假设给定瞳孔中心位置的任意两个点 P 和 Q,其中 P 是第一个注视点,Q 是第二个注视点,然后我们计算线 PQ 的方向和长度。
假设这条线段的长度是 L。然后我们将 L 缩放到屏幕比例,假设 L 是屏幕比例中的 D,并且给定注视移动的方向,我们将屏幕上的光标从其最后一个静止点移动,说R,D距离,到一个新的点S,该点将被计算为长度为D的线段的终点,和起点S。形象化的表示如图所示。因此,基本上,我不会将任何凝视数据映射到屏幕点,我基本上是跟踪凝视,并将其转换为“推送”以应用于屏幕上的光标。但我还没有实现它。因为它实际上并没有将视线映射到屏幕坐标,因此可能是错误的。这个理论的动机来自于 sourceforge 上的 eViacam 项目——它们基本上跟踪你的脸,并相应地移动鼠标。在校准中,他们只是计算你的脸沿着轴移动了多少。
底线:因此,如果你们中的任何人对如何从完美处理的眼睛图像中检测用户的注视有任何想法 -一个检测到瞳孔中心和眼角的图像,请告诉!我只有大约一天的时间,我知道已经很晚了,但我只需要任何可以帮助我的神奇想法。