отслеживать зрачок глаза в видео

Я работаю над проектом, направленным на отслеживание зрачка глаза. Для этого я сделал головную систему, которая захватывает изображения глаза. Завершив аппаратную часть, я поразился программной части. Я использую opencv. Пожалуйста, дайте мне знать, что было бы наиболее эффективным способом отслеживания ученика. Houghcircles показал себя не очень хорошо.

После этого я также попробовал использовать фильтр HSV, и вот код и ссылка на скриншот необработанного и обработанного изображения. Пожалуйста, помогите мне решить эту проблему. Ссылка также содержит видео зрачка глаза, которое я использую в этом коде.

https://picasaweb.google.com/118169326982637604860/16November2011?authuser=0&authkey=Gv1sRgCPKwwrGTyvX1Aw&feat=directlink < /а>

Код:

include "cv.h"

include"highgui.h"

IplImage* GetThresholdedImage(IplImage* img)
{

    IplImage *imgHSV=cvCreateImage(cvGetSize(img),8,3);
    cvCvtColor(img,imgHSV,CV_BGR2HSV);
    IplImage *imgThresh=cvCreateImage(cvGetSize(img),8,1);
    cvInRangeS(imgHSV,cvScalar(0, 84, 0, 0),cvScalar(179, 256, 11, 0),imgThresh);
    cvReleaseImage(&imgHSV);
    return imgThresh;
}

void main(int *argv,char **argc)
{

    IplImage *imgScribble= NULL;
    char c=0;
    CvCapture *capture;
    capture=cvCreateFileCapture("main.avi");

    if(!capture)
    {
        printf("Camera could not be initialized");
        exit(0);
    }
    cvNamedWindow("Simple");
    cvNamedWindow("Thresholded");

    while(c!=32)
    {
        IplImage *img=0;
        img=cvQueryFrame(capture);
        if(!img)
            break;
        if(imgScribble==NULL)
            imgScribble=cvCreateImage(cvGetSize(img),8,3);

        IplImage *timg=GetThresholdedImage(img);
        CvMoments *moments=(CvMoments*)malloc(sizeof(CvMoments));
        cvMoments(timg,moments,1);

        double moment10 = cvGetSpatialMoment(moments, 1, 0);
        double moment01 = cvGetSpatialMoment(moments, 0, 1);
        double area = cvGetCentralMoment(moments, 0, 0);

        static int posX = 0;
        static int posY = 0;

        int lastX = posX;
        int lastY = posY;

        posX = moment10/area;
        posY = moment01/area;
         // Print it out for debugging purposes
        printf("position (%d,%d)\n", posX, posY);
        // We want to draw a line only if its a valid position
        if(lastX>0 && lastY>0 && posX>0 && posY>0)
        {
            // Draw a yellow line from the previous point to the current point
            cvLine(imgScribble, cvPoint(posX, posY), cvPoint(lastX, lastY), cvScalar(0,255,255), 5);
        }
        // Add the scribbling image and the frame...

        cvAdd(img, imgScribble, img);

        cvShowImage("Simple",img);
        cvShowImage("Thresholded",timg);
        c=cvWaitKey(3);
        cvReleaseImage(&timg);
        delete moments;

    }
    //cvReleaseImage(&img);
    cvDestroyWindow("Simple");
    cvDestroyWindow("Thresholded");

}

Я могу отслеживать глаз и точно находить центральные координаты зрачка.

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

Теперь моя цель — внедрить эту функцию в игру (гоночную игру). В котором Если я смотрю влево/вправо, машина движется влево/вправо, а если моргаю, машина замедляется. Как мне теперь поступить??? Нужен ли мне для этого игровой движок?

Я слышал о некоторых игровых движках с открытым исходным кодом, совместимых с Visual Studio 2010 (единство и т. д.). Возможно ли??? Если да, то как мне поступить?


person siso    schedule 16.11.2011    source источник


Ответы (3)


Я один из разработчиков SimpleCV. Мы поддерживаем библиотеку Python с открытым исходным кодом для компьютерного зрения. Вы можете скачать его на SimpleCV.org. SimpleCV отлично подходит для решения таких проблем путем взлома командной строки. Мне удалось извлечь зрачок всего за пару строк кода. Ну вот:

img = Image("eye4.jpg") # load the image
bm = BlobMaker() # create the blob extractor
# invert the image so the pupil is white, threshold the image, and invert again
# and then extract the information from the image
blobs = bm.extractFromBinary(img.invert().binarize(thresh=240).invert(),img)

if(len(blobs)>0): # if we got a blob
    blobs[0].draw() # the zeroth blob is the largest blob - draw it
    locationStr = "("+str(blobs[0].x)+","+str(blobs[0].y)+")"
    # write the blob's centroid to the image
    img.dl().text(locationStr,(0,0),color=Color.RED)
    # save the image
    img.save("eye4pupil.png")
    # and show us the result.
    img.show()

Вот результаты.

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

person kscottz    schedule 16.11.2011

Все зависит от того, насколько хороша ваша система. Если это двухмесячный университетский проект, можно найти и отследить несколько больших двоичных объектов или использовать готовое решение, как рекомендовал Кскоттц.

Но если вы стремитесь иметь более серьезную систему, вы должны идти глубже.

Подход, который я рекомендую вам, заключается в обнаружении точек интереса лица. Хорошим примером являются активные модели внешности, которые лучше всего подходят для отслеживания лиц.

http://www2.imm.dtu.dk/~aam/

а также

http://www.youtube.com/watch?v=M1iu__viJN8

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

И пусть вас не вводит в заблуждение тот факт, что демоверсии показывают отслеживание всего лица. Вы можете научить его отслеживать что угодно: руки, глаза, цветы или листья и т. д.

(Прежде чем начать с AAM, вы можете узнать больше о других алгоритмах отслеживания лиц. Они могут быть лучше для вас)

person Sam    schedule 16.11.2011

Это мое решение, я могу отслеживать глаз и точно находить центральные координаты зрачка.

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

person siso    schedule 20.11.2011
comment
Это действительно должен быть новый вопрос. - person Mark Hall; 20.11.2011
comment
хорошо, вот это stackoverflow.com/questions/8200031/ - person siso; 20.11.2011