Отслеживание глаз: поиск зрачка (x, y) - PullRequest
9 голосов
/ 20 октября 2010

Я ищу несколько предложений о том, как подойти к следующей проблеме компьютерного зрения.Ниже приведены 4 образца набора данных для отслеживания глаз, с которым я работаю.Я хотел бы написать код берет одно такое изображение и вычисляет (х, у) положение центра зрачка.В настоящее время я использую MATLAB, но я открыт и для использования другого программного обеспечения.

Может кто-нибудь порекомендовать подход, который я мог бы использовать для этой задачи?Вот некоторые вещи, которые я уже пробовал, но они работали ОЧЕНЬ плохо.

  • Я пытался использовать преобразование по кругу, но мне нужно угадать радиус зрачка, что немного проблематично.Кроме того, из-за искажений зрачок не всегда является ровным кругом, что может еще больше усложнить этот подход.
  • Я попытался установить пороговое значение изображения на основе яркости пикселей и использовать функцию regionprops MATLAB для поиска области примерноскажем, область 200 пикселей с очень низким эксцентриситетом (то есть как можно более круглым).Однако это очень чувствительно к пороговому значению, и некоторые изображения глаза являются более яркими, чем другие, в зависимости от условий освещения.(Обратите внимание, что 4 приведенных ниже примера уже нормализованы по среднему значению, и, тем не менее, одно из изображений в целом ярче, чем другие, возможно, из-за какого-то очень темного случайного пикселя где-то)

    РЕДАКТИРОВАТЬ: спасибо за комментарий Stargazer.Алгоритм в идеале должен быть в состоянии определить, что ученика нет на изображении, как в случае с последним образцом.Это не имеет большого значения, если я теряю это на некоторое время.Однако гораздо хуже, если он даст мне неправильный ответ.

    alt text

Ответы [ 4 ]

5 голосов
/ 22 октября 2010

Я не уверен, может ли это помочь вам, потому что вы используете набор данных, и я не знаю вашей гибкости / необходимости менять устройство захвата.На всякий случай, пойдем.

Моримото и др. используйте хороший трюк с камерой.Они создали камеру с двумя комплектами инфракрасных светодиодов .Первый набор ставится рядом с объективами камеры.Второй находится далеко от линз.Используя разные частоты, два набора светодиодов включаются в разные моменты.

Retina будет отражать свет от телевизора рядом с объективами камеры (это то же самое, что и проблема красных глаз в фотографии), создавая яркий зрачок .Другой набор светодиодов даст темный зрачок . Сравнить результаты .Таким образом, простая разница между двумя изображениями дает вам почти идеальный ученик.Взгляните, как Моримото и др. исследуют блик (приятно приближаться к направлению взгляда).

4 голосов
/ 03 марта 2015

Используйте OpenCV интегрированный Python. , , Новичкам будет очень легко работать над OpenCV.

Процедура:
* Если вы используете обычную веб-камеру
1. Сначала обработайте кадр с помощью функции VideoCapture.
2. Преобразуйте его в серое изображение.
3. Найдите Canny Edges с помощью функции cv2.Canny ()
4. Применение функции HoughCircles. Он найдет круги на изображении, а также центр изображения.
5. Используйте полученные параметры HoughCirlces, чтобы нарисовать круг вокруг зрачка. Вот и все.

1 голос
/ 02 сентября 2015
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')
1 голос
/ 04 марта 2015

OpenCV с Python, C, C ++, Java и другими будет хорошим инструментом для этого. Здесь есть учебник по Python: http://docs.opencv.org/trunk/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html,, но, безусловно, есть и другие учебники для других поддерживаемых языков. OpenCv имеет несколько каскадов Хаара прямо из коробки, в том числе для обнаружения глаз. Если вы действительно хотели реализовать решение с использованием HoughCircleTransform, OpenCv также имеет соответствующую функцию для этого.

...