gpt4 book ai didi

python - 如何进行稳定的眼角检测?

转载 作者:IT老高 更新时间:2023-10-28 21:13:50 27 4
gpt4 key购买 nike

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

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

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

这些是到目前为止我对图像进行角检测的一些结果。

使用GFTT:

使用Harris:

视频中会发生什么:

绿色cirlces是角,其他(粉红色,较小的圆圈)是其他角

我使用了某种启发式方法-如果垂直思考,这些角将在左右两个极端中,并且在中间附近。
我这样做是因为在许多情况下拍摄了很多快照后,除了不到5%的图像外,其余部分都是这样的,并且对于它们来说,上述启发式方法也适用。

但是这些眼角检测用于快照-而不是来自网络摄像头。

当我将方法(harris和GFTT)用于网络摄像头时,我只是不明白。

My code for eye corner detection using cv.CornerHarris

Eye corners using 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之间,所以我也使用了该方法来最大程度地减少
候选人池

最佳答案

我认为有一种简单的帮助方法!

似乎您正在孤立地考虑每只眼睛。我建议您做的是合并两只眼睛的数据,并使用面部几何形状。我将用一些人可能会认出的图片来说明我的建议(这并不是最好的例子,因为它是一幅画,她的脸有点偏心,但这当然是最有趣的。)

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

我们知道瞳孔之间的距离a,并且我们知道该距离与一只眼睛的距离(角到角)之间的比率b对一个人是固定的,并且在成年人口中不会有太大变化(性别可能有所不同)。
ie. a / b = constant.
因此,仅知道a,就可以推论b,而与被摄对象到相机的距离无关。

使用此信息,我们可以为每个眼角构造阈值框(虚线框,详细标记为1, 2, 3, 4)。每个框都是bc(眼睛的高度,也可以通过相同的固定比率原理确定),并且与瞳孔轴平行。每个盒子的中心边缘固定在瞳孔的中心,并随之移动。我们知道每个角落将始终位于其自己的阈值框中!

现在,麻烦当然是学生们四处走动,我们的阈值框也是如此...但是我们已经以这种方式大大缩小了视野,因为我们可以放心地丢弃所有估计的眼睛位置(来自Harris或GFTT或其他任何东西)落在这些盒子之外(前提是我们对瞳孔检测有信心)。

  • 如果我们仅对一个角位置有较高的信心,我们可以仅从几何图形中推断和推导出所有其他角位置! (两只眼睛!)。
  • 如果在多个角位置之间存在疑问,我们可以使用其他角的知识(从任一只眼睛来解决),以概率方式将它们的位置联系起来,从而做出最佳猜测。即。 (当然,在它们的方框内)做任何一对估计是b分开并平行于瞳孔轴。
  • 如果您可以得到在瞳孔四处移动(或实际上在同一平面上的任何面部特征)时不会移动的常规“眼睛”位置,则此功能非常有用,可让您以几何方式确定角位置。

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

    关于python - 如何进行稳定的眼角检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9645871/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com