眼动追踪:找到瞳孔(x,y)

时间:2010-10-20 01:18:54

标签: algorithm matlab opencv computer-vision eye-tracking

我正在寻找有关如何解决以下计算机视觉问题的一些建议。 以下是我正在使用的4个眼动追踪数据集样本。我想写代码拍摄一个这样的图像并计算瞳孔中心的(x,y)位置。我目前正在使用MATLAB,但我也愿意使用其他软件。

有人可以推荐一种我可以用于此任务的方法吗?这里有一些我已经尝试过的东西但是效果不太好。

  • 我尝试使用圆形霍夫变换,但这需要我猜测瞳孔的半径,这有点问题。此外,由于扭曲,瞳孔并不总是一个圆圈,这可能会使这种方法更加困难。
  • 我尝试基于像素亮度对图像进行阈值处理,并使用regionprops MATLAB函数来寻找具有极低偏心率(即尽可能圆形)的粗略(例如)200像素区域的区域。然而,这对阈值非常敏感,并且基于照明条件,眼睛的一些图像比其他图像更亮。 (注意下面的4个样本已经进行了均值归一化,并且其中一个图像比其他图像更亮,可能是因为某处有一些非常暗的随机像素)

任何意见/建议都将不胜感激!

编辑:感谢Stargazer的评论。理想情况下,算法应该能够确定瞳孔不在图像中,就像最后一个样本的情况一样。如果我暂时忘记它,这不是什么大问题。如果它给我错误的答案,那就更糟了。

alt text

4 个答案:

答案 0 :(得分:5)

我不确定这是否可以帮助您,因为您正在使用数据集而我不知道您更改捕获设备的灵活性/需求。为了以防万一,我们走吧。

Morimoto et al.使用漂亮的相机技巧。他们用两组红外线LED 创建了一个相机。第一组放在相机镜头附近。第二个是远离镜头。使用不同的频率,两个LED组在不同的时刻打开。

视网膜将反射相机镜头附近的光线(与摄影中的红眼问题相同),产生明亮的瞳孔。另一组LED将产生暗瞳Compare the results。因此,两个图像之间的简单差异可以为您提供近乎完美的瞳孔。看一下Morimoto 等人探索闪烁的方式(很好地接近视线方向)。

答案 1 :(得分:4)

使用OpenCV集成Python。 。 。对于初学者来说,使用OpenCV非常容易。

程序:
*如果您使用普通网络摄像头
1.首先使用VideoCapture功能处理帧
2.将其转换为灰度图像。
3.使用cv2.Canny()函数查找Canny Edges
4.应用HoughCircles功能。它将在图像中找到圆圈以及图像的中心。
5.使用HoughCirlces的结果参数绘制瞳孔周围的圆。多数民众赞成。

答案 2 :(得分:1)

使用Python,C,C ++,Java等OpenCV将是一个很好的工具。这里有一个Python教程:http://docs.opencv.org/trunk/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html,但是其他支持的语言肯定还有其他教程。 OpenCv开箱即用了一些Haar Cascades,其中一个用于眼睛检测。如果你真的想用HoughCircleTransform实现一个解决方案,那么OpenCv也有相应的功能。

答案 3 :(得分:1)

import java.awt.Robot;%Add package or class to current import listimport java.awt.event.*;robot = Robot();objvideoinput('winvideo',2);%to set the device ID and supported format set(obj, 'FramesPerTrigger', Inf);% trigger infinite set(obj, 'ReturnedColorspace', 'rgb')%video in RGB format obj.FrameGrabInterval = 5;%the object acquires every %5th frame from the video stream start(obj)% to start the vedio time=0;NumberOfFrames=while(true)data=getsnapshot(obj);image(data);filas=size(data,1);columnas=size(data,2);% Centercentro_fila=round(filas/2);centro_columna=round(columnas/2);figure(1);if size(data,3)==3data=rgb2gray(data);% Extract edges.BW = edge(data,'canny')[H,T,R] = hough(BW,'RhoResolution',0.5,'Theta',-90:0.5:89.5);endsubplot(212)piel=~im2bw(data,0.19);piel=bwmorph(piel,'close');piel=bwmorph(piel,'open');piel=bwareaopen(piel,275);piel=imfill(piel,'holes');imagesc(piel);% Tagged objects in BW imageL=bwlabel(piel);% Get areas and tracking rectangleout_a=regionprops(L);% Count the number of objectsN=size(out_a,1);if N < 1 || isempty(out_a) % Returns if no object in the imagesolo_cara=[ ];continue end % Select larger area areas=[out_a.Area];[area_max pam]=max(areas);subplot(211)imagesc(data);colormap grayhold on rectangle('Position',out_a(pam).BoundingBox,'EdgeColor',[1 0 0],...'Curvature', [1,1],'LineWidth',2)centro=round(out_a(pam).Centroid);X=centro(1);Y=centro(2);robot.mouseMove(X,Y);text(X+10,Y,['(',num2str(X),',',num2str(Y),')'],'Color',[1 1 1])if X<centro_columna && Y<centro_fila 
title('Top left')elseif X>centro_columna && Y<centro_fila
title('Top right')elseif X<centro_columna && Y>centro_fila
title('Bottom left')else
title('Bottom right')