10

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

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

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

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

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

替代文字

4

4 回答 4

6

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

森本等。使用一个不错的相机技巧。他们创造了一个带有两组红外线 LED的相机。第一组放在相机镜头附近。第二个远离镜头。使用不同的频率,两个 LED 组在不同的时刻被打开。

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

于 2010-10-22T11:32:35.920 回答
5

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

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

于 2015-03-03T20:22:41.240 回答
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 也有相应的功能。

于 2015-03-04T03:00:35.527 回答
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')
于 2015-09-02T07:46:47.297 回答