眼动跟踪:寻找瞳孔的坐标(x,y)

10

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

是否有人可以推荐一种方法来解决这个任务?以下是我已经尝试过但效果不太好的一些方法。

  • 我尝试使用圆形霍夫变换,但这需要我猜测瞳孔的半径,这有点棘手。此外,由于畸变,瞳孔不总是完全圆形的,这可能会使这种方法更加困难。
  • 我尝试根据像素亮度阈值化图像,并使用regionprops MATLAB函数查找大约200像素区域内非常低的偏心率(即尽可能圆形)。然而,这对阈值值非常敏感,并且基于光照条件,一些眼睛的图像比其他眼睛的图像亮。 (请注意,下面的4个样本已经进行了平均归一化,但仍有一个图像比其他图像亮,可能是因为某个非常黑暗的随机像素)

欢迎任何评论/建议!

编辑:感谢Stargazer的评论。理想情况下,算法应该能够确定瞳孔不在图像中,就像最后一个样本一样。如果我暂时跟丢它,这并不是什么大问题。但是如果它给我错误的答案,则情况要严重得多。

alt文本


3
至少,如果你发现一个算法只适用于前三个,也不要失望。就连我也无法在第四个中找到瞳孔。 - riwalk
2
我当然理解。在这种情况下,算法应该最好确定。 - karpathy
1
你考虑过使用Haarcascades(http://en.wikipedia.org/wiki/Viola-Jones_object_detection_framework)或者局部二值模式吗?(http://en.wikipedia.org/wiki/Local_binary_patterns)。OpenCV提供了非常简单的方法来训练这些分类器。 - max
1
在opencv中,已经训练好了用于检测眼睛的haar级联。在Unix系统上,当你安装opencv时,它们保存在/usr/local/share/opencv/haarcascades目录下。然后你可以使用这些级联器与opencv中的find objects函数结合起来使用。 - Alex
1
这对你来说应该有用!https://dev59.com/SmPVa4cB1Zd3GeqP8Lfa#11316882 - Anirudh
4个回答

6

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

Morimoto et al. 使用了一个巧妙的相机技巧。他们创建了一个带有两组红外线LED的相机。第一组放置在相机镜头附近。第二组放置在镜头远处。使用不同的频率,两组LED在不同的时间被打开。

视网膜会反射来自靠近相机镜头的LED组的光(这与摄影中的红眼问题是相同的),产生一个明亮的瞳孔。另一组LED将产生一个黑暗的瞳孔比较结果。因此,两个图像之间的简单差异可以给出一个几乎完美的瞳孔。看看Morimoto et al.如何探索闪光(接近视线方向)的方法。


1
谢谢,但不幸的是我没有物理设置的访问权限,我只有数据并需要运行一些分析。数据确实带有跟踪结果,但我认为我可以想出更好/更顺畅的方法。结果问题比我最初预期的要困难 :) - karpathy

5

使用集成了Python的OpenCV...对于初学者来说,使用OpenCV将变得非常简单。

流程:
* 如果你使用普通的网络摄像头
1. 使用VideoCapture函数处理帧
2. 将其转换为灰度图像。
3. 使用cv2.Canny()函数找到Canny边缘
4. 应用HoughCircles函数。它将在图像中找到圆形以及图像中心。
5. 使用HoughCirlces的结果参数在瞳孔周围绘制圆圈。就这样。


1
我已经将Canny算法应用到我的软件中,它产生了非常好的结果!谢谢。 - Arsen

1

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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接