对于那些觉得它太长的人,只需阅读粗体线。
我的基于凝视估计的屏幕光标移动 HCI 项目现在依赖于最后一件事 - 凝视估计,为此我使用眼角作为参考稳定点,相对于它我将检测瞳孔的运动并计算凝视。
但是我无法从实时网络摄像头源中稳定地检测到眼角。我一直在使用 cv.CornerHarris() 和 GFTT - cv.GoodFeaturesToTrack() 函数进行角点检测。我直接在我的眼睛图像上尝试了 FAST 演示(他们网站上的可执行文件),但这并不好。
这些是我迄今为止对图像进行角点检测的一些结果。
使用 GFTT:
使用哈里斯:
视频中发生了什么:
绿色圆圈是角落,其他(粉红色,较小的圆圈)是其他角落
我使用了某种启发式方法 - 如果垂直思考,角落将位于左侧或右侧极端,并且在中间附近。我这样做是因为在许多条件下拍摄了许多快照后,除了不到 5% 的图像,其余的都是这样的,对他们来说,上述启发式方法成立。
但是这些眼角检测是针对快照的——而不是来自网络摄像头的馈送。
当我使用网络摄像头提要的方法(harris 和 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 之间,所以我也用它来最小化候选池