Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何执行稳定的眼角检测?_Python_Image Processing_Opencv_Computer Vision_Eye Detection - Fatal编程技术网

Python 如何执行稳定的眼角检测?

Python 如何执行稳定的眼角检测?,python,image-processing,opencv,computer-vision,eye-detection,Python,Image Processing,Opencv,Computer Vision,Eye Detection,对于那些觉得它太长的人,只需阅读粗体的线条即可。 我的基于凝视估计的屏幕光标移动HCI项目现在依赖于最后一件事——凝视估计,我使用眼角作为参考稳定点,相对于它,我将检测瞳孔的运动并计算凝视 但是我还不能稳定地从实时网络摄像头中检测眼角。我一直在使用cv.CornerHarris()和GFTT-cv.GoodFeaturesToTrack()函数进行角点检测。我直接在我的眼睛图像上尝试了FAST demo(他们网站上的可执行文件),但效果不好 这些是我迄今为止对图像进行的角点检测的一些结果 使用G

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

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

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

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

使用GFTT:

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

使用哈里斯:

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

视频中发生了什么:

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
绿色圆环是角,其他(粉红色,小圆圈)是其他角

cornerCount = 100
qualityLevel = 0.1
minDistance = 5
我使用了某种启发式方法——如果垂直思考的话,角点将位于左端或右端,并位于中间。 我这样做是因为在许多情况下拍摄了许多快照,除了不到5%的图像外,其余的都是这样的,对于他们来说,上面的启发式方法是有效的

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

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

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

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

cornerCount = 100
qualityLevel = 0.1
minDistance = 5
鉴于:

    cornerCount = 500
    qualityLevel = 0.005
    minDistance = 30
对上面显示的静态图像效果良好

MindDistance=30,因为很明显,拐角处至少有这么远的距离,这也是我从快照中看到的趋势。但我降低了GFTT的网络摄像头订阅版本,因为那时我根本就没有得到任何角落

另外,对于GFTT的直播版本,我不得不适应一个小变化:

cv.CreateImage((colorImage.width, colorImage.height), 8,1)
而对于静态图像版本(pastebin上的代码),我使用了:

注意深度

这会改变检测质量吗

我正在通过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
max_dist=0
最大值=20
maxR=0
lc=0
rc=0
maxLP=(0,0)
maxRP=(0,0)
对于角点Mem:
中心=int(点[0]),int(点[1])
x=点[0]
y=点[1]
如果(x((彩色图像宽度/4)*3))和(y>40和y x:
maxL=x
maxLP=中心
如果maxR如果max_dist我认为有一个简单的方法可以帮助你

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

您似乎对双眼瞳孔位置有可靠的估计,如果面部在相机上看得相当直(使用这种方法,垂直于屏幕的面部旋转是可以的),我们知道眼角(从现在起,仅为“角”)将位于(或接近)上穿过双眼瞳孔的线(红色虚线)

我们知道瞳孔之间的距离,
a
,并且我们知道这个距离和一只眼睛(角到角)之间的距离,
b
,对于一个人来说是固定的,并且在成年人群中不会有太大变化(可能因性别而异)

即a/b=常数。

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

利用这些信息,我们可以为每个眼角构造阈值框(详细的点框,标记为
1,2,3,4
)。每个框都是
b
,由
c
(眼睛高度,同样可以通过相同的固定比率原则确定)与瞳孔轴平行。每个框的中心边缘固定在瞳孔中心,并随瞳孔移动。我们知道每个角始终位于其自身的阈值框中

现在,问题当然是瞳孔在移动,我们的阈值框也在移动……但我们已经通过这种方式大大缩小了范围,因为我们可以自信地放弃掉掉在这些框之外的所有估计眼睛位置(来自Harris或GFTT或其他任何东西)(前提是我们是正确的)