2010-10-20 2 views
8

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

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

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

Любые комментарии/предложения будут оценены!

EDIT: спасибо за комментарий Stargazer. Алгоритм в идеале должен быть в состоянии определить, что зрачок отсутствует в изображении, как это имеет место для последнего образца. Это неважно, если я немного потеряю его. Это намного хуже, если это дает мне неправильный ответ.

alt text

+2

Ну, по крайней мере, не разочаровывайтесь, если найдете алгоритм, который работает только для первых трех. Даже я не могу найти ученика в 4-м. – riwalk

+1

Я это понимаю, конечно. В этом случае алгоритм должен в идеале определить это. – karpathy

+0

Это должно сделать трюк для вас! http://stackoverflow.com/a/11316882/1458387 – Anirudh

ответ

4

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

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

Retina будет отражать свет от набора вблизи объективов камеры (что то же самое касается проблемы красных глаз в фотографии), производя яркий зрачок . В другом наборе светодиодов будет сформирован темный ученик. Compare the results. Таким образом, простая разница между двумя изображениями дает вам почти идеальный ученик. Взгляните так, как Morimoto et al. изучить блеск (приятно подходить к направлению взгляда).

+0

Спасибо, но, к сожалению, у меня нет доступа к физической настройке , Я получил данные и должен выполнить некоторый анализ. Данные поступают с результатами отслеживания, но я думал, что смогу придумать что-то лучшее/более плавное. Оказывается, проблема сложнее, чем я изначально ожидал :) – karpathy

3

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

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

+0

Я применил Canny в свою мягкую и дает очень хорошие результаты! Благодарю. – Arsen

+0

@Arsen Спасибо ... Я проверю это ... –

0

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

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

выставить и реализовать выше код..in matlab –

Смежные вопросы