17

对于那些觉得它太长的人,只需阅读粗体线。

我的基于凝视估计的屏幕光标移动 HCI 项目现在依赖于最后一件事 - 凝视估计,为此我使用眼角作为参考稳定点,相对于它我将检测瞳孔的运动并计算凝视。

但是我无法从实时网络摄像头源中稳定地检测到眼角。我一直在使用 cv.CornerHarris() 和 GFTT - cv.GoodFeaturesToTrack() 函数进行角点检测。我直接在我的眼睛图像上尝试了 FAST 演示(他们网站上的可执行文件),但这并不好。

这些是我迄今为止对图像进行角点检测的一些结果。

使用 GFTT:

良好的照明,使用 GFTT

使用哈里斯:

使用 cv.CornerHarris

视频中发生了什么:

使用 GFTT 的视频角落 绿色圆圈是角落,其他(粉红色,较小的圆圈)是其他角落

我使用了某种启发式方法 - 如果垂直思考,角落将位于左侧或右侧极端,并且在中间附近。我这样做是因为在许多条件下拍摄了许多快照后,除了不到 5% 的图像,其余的都是这样的,对他们来说,上述启发式方法成立。

但是这些眼角检测是针对快照的——而不是来自网络摄像头的馈送。

当我使用网络摄像头提要的方法(harris 和 GFTT)时,我就是不明白。

我使用 cv.CornerHarris 进行眼角检测的代码

使用 GFTT 的眼角

现在我在这两种方法中使用的参数 - 它们显然没有显示不同照明条件的结果。但是在与拍摄这些快照的光照条件相同的情况下,我仍然没有得到我从网络摄像头视频中查询的帧的结果

GFTT 的这些参数适用于平均光照条件

cornerCount = 100
qualityLevel = 0.1
minDistance = 5

而这些:

    cornerCount = 500
    qualityLevel = 0.005
    minDistance = 30

适用于上面显示的静态图像

minDistance = 30 因为显然角落至少会有那么远的距离,这也是我从快照中看到的趋势。但我为 GFTT 的网络摄像头提要版本降低了它,因为那时我根本没有得到任何角落。

此外,对于 GFTT 的实时提要版本,我必须进行一些小改动:

cv.CreateImage((colorImage.width, colorImage.height), 8,1)

而对于静止图像版本(pastebin 上的代码),我使用:

cv.CreateImage(cv.GetSize(grayImage), cv.IPL_DEPTH_32F, 1)

注意深处。

这会改变任何检测质量吗?

我通过 GFTT 方法的眼睛图像没有 32F 的深度,所以我不得不更改它并根据其余的临时图像(eignenimg、tempimg 等)

底线:我必须完成注视估计,但如果没有稳定的眼角检测,我将无法进行。我必须继续进行眨眼检测和基于模板匹配的瞳孔跟踪(或者你知道更好吗?)。简而言之,我想知道我是否犯了任何新手错误或没有做阻止我在我的网络摄像头视频流中获得近乎完美的眼角检测的事情,这是我在这里发布的快照中获得的。

无论如何,感谢您给出这个观点。任何想法如何在各种照明条件下执行眼角检测都会非常有帮助

好的,如果你没有明白我在代码中所做的事情(我是如何得到左右角的),我会解释一下:

max_dist = 0
maxL = 20
maxR = 0

lc =0
rc =0

maxLP =(0,0)
maxRP =(0,0)

for point in cornerMem:
    center = int(point[0]), int(point[1])

    x = point[0]
    y = point[1]


    if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):
                      #cv.Circle(image,(x,y),2,cv.RGB(155, 0, 25))

                      if maxL > x:
                               maxL = x
                               maxLP = center


                      if maxR < x:
                               maxR = x
                               maxRP = center

                      dist = maxR-maxL

                      if max_dist<dist:
                           max_dist = maxR-maxL
                           lc = maxLP
                           rc = maxRP





    cv.Circle(colorImage, (center), 1, (200,100,255)) #for every corner

cv.Circle(colorImage,maxLP,3,cv.RGB(0, 255, 0)) # for left eye corner
cv.Circle(colorImage,maxRP,3,cv.RGB(0,255,0))   # for right eye corner

maxLP 和 maxRP 将分别存储左眼角和右眼角的 (x,y)。我在这里所做的是,分别为左右角检测取一个变量 maxL 和 maxR,将其与检测到的角的 x 值进行比较。现在简单地说,对于 maxL,它必须大于 0;我将其分配为 20,因为如果左角在 (x,y) 处 x<20,则 maxL 将 = x,或者说,即,以这种方式找到最左角的 X 坐标。同样对于最右边的角。

我也尝试了 maxL = 50 (但这意味着左眼角几乎位于眼睛区域的中间)以获得更多网络摄像头供稿的候选者 - 我根本没有得到任何角落

此外,max_dist 存储迄今为止看到的 X 坐标之间的最大距离,因此可以衡量哪对角将是左眼角和右眼角 - 最大距离 = max_dist

另外,我从我的快照中看到眼角的 Y 坐标在 40-70 之间,所以我也用它来最小化候选池

4

3 回答 3

6

我认为有一个简单的方法可以帮助!

看起来好像您正在孤立地考虑每只眼睛。我建议你做的是结合双眼的数据,并使用面部几何。我将用一些人可能认识的图片来说明我的建议(这并不是最好的例子,因为它是一幅画,而且她的脸有点偏离中心,但它肯定是最有趣的......)

在此处输入图像描述

看来您对双眼的瞳孔位置有可靠的估计,并且假设脸部在相机上看起来相当直(使用此方法可以垂直于屏幕旋转脸部),我们知道眼角(从现在开始,只有“角”)将位于(或靠近)穿过双眼瞳孔的线(红色虚线)上。

我们知道瞳孔之间的距离a,并且我们知道这个距离与一只眼睛的距离(角到角)之间的比率,b对于个体来说是固定的,并且在成年人群中不会有太大变化(可能会有所不同两性之间)。

ie. a / b = constant.

因此,我们可以推断出 b,与被摄体与相机的距离无关,只知道a

使用这些信息,我们可以为每个眼角构建阈值框(虚线框,详细标记为1, 2, 3, 4)。每个框b都由c(眼睛高度,同样可以通过相同的固定比率原理确定)并平行于瞳孔轴。每个盒子的中心边缘固定在瞳孔的中心,并随之移动。我们知道每个角落都将永远存在于自己的阈值框中!

现在,问题当然是学生四处移动,我们的阈值框也是如此……但是我们已经通过这种方式大大缩小了范围,因为我们可以自信地丢弃所有估计的眼睛位置(来自 Harris 或 GFTT 或任何东西)落在这些框之外(前提是我们对瞳孔检测有信心)。

  • 如果我们对一个角位置有很高的信心,我们可以仅从几何推断和推导出所有其他角位置!(两只眼睛!)。

  • 如果在多个角位置之间存在疑问,我们可以使用其他角的知识(来自任何一只眼睛)来解决它,概率性地将它们的位置联系起来,做出最好的猜测。IE。做任何一对估计(当然在他们的盒子里)b分开并平行于瞳孔轴。

  • 如果您可以获得在瞳孔四处移动时不会移动的一般“眼睛”位置(或者实际上是同一平面上的任何面部特征),这将非常有用,并允许您以几何方式确定角位置。

我希望这可以帮助您找到难以捉摸的d(瞳孔从眼睛中心位移)。

于 2012-03-15T16:35:06.860 回答
5

我改变了这个

if ( x<colorImage.width/5 or x>((colorImage.width/4)*3) ) and (y>40 and y<70):

对此:

if ( x<(w/5) or x>((w/4)*3) ) and (y>int(h*0.45) and y<int(h*0.65)):

因为早些时候我只是手动查看像素值,超出了我的窗口,可以以最高的概率找到角落。但后来我意识到,让它通用,所以我做了一个 45 到 65 个 Y 范围的水平窗口,1/5 到 3/4 的 X 范围,因为这是角落的通常区域。

我很抱歉大家回复晚了,我正忙于项目的后期 - 凝视估计。我要发布一个关于它的问题,我被困在里面了。

顺便说一下,这里有几张我眼睛中检测到的眼角和瞳孔的照片:(放大到 100x100)

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述 希望这对从该领域开始的其他人有用。

于 2012-04-08T10:34:32.150 回答
1

你试过巩膜分割吗?

您也可以处理巩膜的两个角,这可能会更容易,因为您已经有一个不错的瞳孔检测工作,巩膜是瞳孔周围较亮的区域。

于 2013-07-07T05:08:52.027 回答