Подтвердить что ты не робот

Трек зрителя в видео

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

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

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 (единство и т.д.). Возможно ли это? Если да, как мне следует продолжить?

4b9b3361

Ответ 1

Я один из разработчиков 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 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()

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

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

Ответ 2

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

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

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

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

и

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

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

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

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

Ответ 3

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

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