眼球中心定位跟踪算法—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图像,这个截取过程就是简单的根据先验知识,对于如下的一张人脸图像(注:该图片来源于互联网):

那么,左右眼的区域大小和位置大概是固定的,整幅图像的长宽分别为wIwIw_{I},hIhIh_{I}。眼部区域的长宽为wEwEw_{E},hEhEh_{E},则有:

wE=35100wIwE=35100wI

w_{E}=\frac{35}{100}w_{I}

hE=30100hIhE=30100hI

h_{E}=\frac{30}{100}h_{I} 对于左右眼ROI图像左上角像素点位置:

yL=yR=25100hIyL=yR=25100hI

y_{L}=y_{R}=\frac{25}{100}h_{I}

xL=13100wIxL=13100wI

x_{L}=\frac{13}{100}w_{I}

xR=wI−wE−13100wIxR=wI−wE−13100wI

x_{R}=w_{I}-w_{E}-\frac{13}{100}w_{I}


眼球中心定位

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

所以,中心位置的确定,就是在找梯度方向上的直线相交最多的那个点。


补充

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


性能评价

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


实验效果

人脸检测

眼球定位

源码下载

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券