机器学习实践系列之8 - 人眼定位

一. 人眼检测

       OpenCV自带的人眼检测,代码及教程都已比较普及,这里不再啰嗦,训练模板直接 load已经训练好的文件:

       haarcascade_eye_tree_eyeglasses.xml,直接看代码:

/* linolzhang 2014.10
   基于OpenCV的人眼检测 - Cascade
*/
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/objdetect/objdetect.hpp"

#pragma comment(lib,"opencv_core2410.lib")
#pragma comment(lib,"opencv_objdetect2410.lib")
#pragma comment(lib,"opencv_highgui2410.lib")

using namespace cv;

int main(int argc, char** argv)
{
	Mat src;
	if(argc != 2)  
		src = imread("1.png");
	else  
		src =  imread(argv[1]);

	CascadeClassifier eye_cascade;  
	eye_cascade.load("haarcascade_eye_tree_eyeglasses.xml"); 

	std::vector eyes;
	eye_cascade.detectMultiScale( src, eyes, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); 

	for(int i=0; i

       检测效果(基本能够满足需求):

        机器学习实践系列之8 - 人眼定位_第1张图片


二. 中心点定位

       在确定人眼区域后,第二个目标就是眼球定位,眼球定位能够确定眼睛的中心位置,这在眼睛跟踪上非常有意义,一般来说,VR中基于眼动跟踪的控制,ADAS上用于疲劳检测都需要用到眼睛的中心点信息。

       能够直观想到的方法就是 Hough变换,这里有一个假设,眼睛的正中心是多个同心圆的圆心。

       正常情况下,该方案是work的,但实际上,由于眼球的部分遮挡(小眼睛)、光线反射、噪点 等问题会导致识别率下降。

       作者提出的方法主要基于下面两个假设:

       1. 梯度方向

           眼睛正中心 为梯度方向的汇聚交点;

        2. 对称性

        当然,也可以采用局部二值特征等纹理描述方式,这在一定情况下有效,对于反射比较重的情况下差异其实不大,因此,灰度特征一般都能够衡量。

        由于版权问题,算法细节及代码部分不便公开,大家可以就该问题的算法改进方向进行讨论!


三. 眨眼检测

       通常的眨眼检测方法有以下几种:

1. 基于阈值判断

     该阈值通常是时间,一段时间内无法检测到眼球,认为眼睛处于闭的状态;

     也有算法基于眼睛特征点的 宽高比,当低于一个阈值时,认为眼睛为闭,当然也有人说这种方法不准确,有很多人“眯缝眼”。

2. 根据特征点运动

     由于眼睛状态的闭合瞬间很难被捕捉到,因此大部分的眨眼过程都表现为特征点的瞬间运动,我们称为眼皮跳,这种情况下的运动通常是有规律的,根据研究人员观察,上眼皮下移、下眼皮上移,都是有规律可循。

3. 疲劳特征

     疲劳在眨眼情况下的表现是,上眼皮的缓慢下移以及眼睛中心的下移(可能伴随低头),当然眨眼检测只是疲劳的一个方面的特征。


你可能感兴趣的:(机器学习,计算机视觉)