到目前为止,我已经能够准确地检测出瞳孔和眼角。 您可以在我的回答中看到我上传的一些快照:
Performing stable eye corner detection
这是我到目前为止所做的。 我通过查看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
但问题是,即使几乎完美的瞳孔检测(几乎是因为在光线不足的情况下它会产生误报。但我打算将其置于限制之下,因为我无法使用它,我没有足够的时间) ,我的凝视宽度和凝视高度仍然很差。
这是一个测试运行日志:
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.比喻表示为如图所示。因此,基本上,我没有将任何凝视数据映射到屏幕点,我基本上跟踪凝视,并将其转换为“推”以应用于屏幕上的光标。 但我还没有实现它。因为它实际上没有将凝视映射到屏幕坐标,因此可能是错误的。这个理论的动机来源于eforkforam sourceforge项目 - 它们基本上跟踪你的脸部,并相应地移动鼠标。在校准中,它们只计算您的面部沿轴移动的程度。
底线:所以,如果您有任何关于如何从完美处理的眼睛图像中检测用户凝视的想法 - 具有检测到的瞳孔中心和眼角的那个,请告诉我!我已经有一天了,我知道它已经很晚了,但我只需要任何可以帮助我的神奇想法。
答案 0 :(得分:5)
这不是答案,但不可能发表评论。我会在你回答后删除它。
您确定您拥有所有必要的参数吗?
考虑下图:
如果您的相机在{K,J,Q}处检测到角落和瞳孔,您如何区分另一个三倍{F,E,O}?请注意,这些措施是相同的,但是由黑色箭头表示的注视方向完全不同。
注意:两条黑线和红线是从一个摄像机点绘制的,位于可见区域之外。