眼球中心定位跟踪算法—eyelike

项目介绍

人眼中心定位是一个用于眼部追踪的算法,它来源于github中eyelike项目,C++语言实现,依赖OpenCV库。
关于代码的编译,作者提供了CMakeLists.txt文件,同时支持Windows,Linux和Mac OS X。
该项目只实现了简单的2维眼球跟踪功能,没有3维信息,也没有视线跟踪和估计功能。
作者提供了另一个博客链接Simple, accurate eye center tracking in OpenCV,其中有一段演示视频,可以看到跟踪效果。
项目主要的算法来源于剑桥大学的一篇文章:《Accurate eye centre localisation by means of gradients》


算法介绍

该项目从网络摄像头读取视频,进行人脸检测,再根据检测到的人脸图像截取左眼和右眼的ROI区域,最后根据截取到的ROI进行眼球中心检测与跟踪。所以算法的主要包含三个部分:人脸检测,ROI截取,眼球中心定位。

人脸检测

这里面用的人脸检测方法就是OpenCV中集成好的级联分类器,这是一种非常古老的人脸检测方法,利用Haar特征或LBP特征训练多个弱分类模型,组成最终的分类器,进行人脸检测。
OpenCV中提供了多个已经训练好的模型,考虑到侧脸的情况下左右眼将出现遮挡,所以在项目中目前只用到了正面脸检测。


眼部ROI截取

得到整个人脸图像后,截取出左右眼部区域的ROI图像,这个截取过程就是简单的根据先验知识,对于如下的一张人脸图像(注:该图片来源于互联网):
这里写图片描述
这里写图片描述
那么,左右眼的区域大小和位置大概是固定的,整幅图像的长宽分别为 w I h I 。眼部区域的长宽为 w E h E ,则有:

w E = 35 100 w I

h E = 30 100 h I

对于左右眼ROI图像左上角像素点位置:

y L = y R = 25 100 h I

x L = 13 100 w I

x R = w I w E 13 100 w I


眼球中心定位

现在截取出了眼部ROI图像,就到了之前提到的那个论文的方法了,《Accurate eye centre localisation by means of gradients》。其实它用到的方法很好理解,一副图像,每个像素点都可以计算出梯度,而梯度包含了幅值和方向。对于眼部图像而言,越是靠近眼球中心的位置,灰度值就越低,就会有更多的梯度方向的连线交于那个点。
这里写图片描述
所以,中心位置的确定,就是在找梯度方向上的直线相交最多的那个点。


补充

除了眼球定位,这个项目还做了眼睑的定位,是在眼球中心位置与眼部ROI区域确定后,增加了简单的后处理,我没有把这个作为重点。


性能评价

最后,根据梯度方向的眼球定位算法在某些方面还是有可取之处的。它很简单,非常容易理解,然后没有使用边缘之类的纹理特征,这使得在较低分辨率的图像和视频下也能做到定位,因为即便是分辨率很低,起码梯度的特征相比边缘的特征,受到的影响更小,算法在这方面的鲁棒性很好。但是它毕竟是一种基于纹理特征的定位算法,这意味着,当眼部图像的纹理受到外部影响而改变时,算法的定位效果会变得很差。比如我测试的图像是一款头戴式设备采集到的,里面为了照明增加了光源,光源反射到眼球位置后出现了亮点,而这个亮点的存在改变了眼部原来的纹理特征。


实验效果

人脸检测

这里写图片描述

眼球定位

这里写图片描述

源码下载

当然可以直接到github地址下载eyelike啦。
同时,我调通了Windows在VS2010版本,依赖OpenCV2.4.11,点击下载。