【问题标题】:Eye tracking: finding the pupil (x,y)眼动追踪:寻找瞳孔 (x,y)
【发布时间】:2011-04-27 19:23:46
【问题描述】:

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

有人可以推荐一种我可以用于此任务的方法吗?以下是我已经尝试过但效果不佳的一些方法。

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

任何 cmets/建议将不胜感激!

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

【问题讨论】:

  • 好吧,至少,如果您找到只适用于前三个的算法,请不要失望。连第四期的学生都找不到了。
  • 我当然明白这一点。理想情况下,算法应该在这种情况下确定这一点。
  • 您是否考虑过使用 haarcascades (en.wikipedia.org/wiki/Viola-Jones_object_detection_framework) 或本地二进制模式? (en.wikipedia.org/wiki/Local_binary_patterns)。 OpenCV 提供了非常简单的方法来训练这类分类器。
  • 在 opencv 中已经有经过训练可以检测眼睛的 haar 级联。在 Unix 系统上,当您安装 opencv 时,它们会保存到:/usr/local/share/opencv/haarcascades 然后您将这些级联与 opencv Alex 中的查找对象功能一起使用
  • 这应该可以为您解决问题! stackoverflow.com/a/11316882/1458387

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


【解决方案1】:

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

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

Retina 会反射来自相机镜头附近装置的光线(这与摄影中的红眼问题相同),产生明亮的瞳孔。另一组 LED 将产生一个暗瞳Compare the results。因此,这两个图像之间的简单差异为您提供了一个近乎完美的瞳孔。看看森本等人的方式。探索闪烁(很高兴接近视线方向)。

【讨论】:

  • 谢谢,但不幸的是我无法访问物理设置,我只得到数据并且需要运行一些分析。数据确实带有跟踪结果,但我想我可以想出更好/更流畅的东西。事实证明这个问题比我最初预期的要困难:)
【解决方案2】:

使用 OpenCV 集成的 Python 。 . .初学者在 OpenCV 上工作将非常容易。

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

【讨论】:

  • 我已经将 Canny 应用到我的软件中,它产生了非常好的效果!谢谢。
【解决方案3】:

带有 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 Cascade,其中一个用于眼睛检测。如果您真的想使用 HoughCircleTransform 实现解决方案,OpenCv 也有相应的功能。

【讨论】:

    【解决方案4】:
    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')
    

    【讨论】:

      猜你喜欢
      • 2017-06-05
      • 2019-01-08
      • 1970-01-01
      • 2013-01-09
      • 2018-10-04
      • 2021-07-18
      • 2017-04-15
      • 2012-11-30
      • 2018-07-09
      相关资源
      最近更新 更多