2011-11-16 12 views
12

Sto lavorando a un progetto destinato a pupilla occhio traccia. Per questo ho realizzato un sistema montato sulla testa che cattura le immagini dell'occhio. Completato con la parte hardware I am colpito nel software parte. Sto usando opencv. Per favore fatemi sapere quale sarebbe il modo più efficiente per seguire l'allievo. Houghcircles non ha funzionato bene.pupilla occhio traccia in un video

Dopo che ho anche provato con HSV filtro e qui è il codice e collegamento schermata del grezzo immagine e trasformati uno. Per favore aiutami a risolvere questo problema. Il link contiene anche il video della pupilla dell'occhio che sto usando in questo codice.

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

Codice:

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"); 

} 

io sono in grado di monitorare l'occhio e trovare il centro coordinate della pupilla con precisione.

Innanzitutto ho messo a segno l'immagine presa dalla telecamera montata sulla testa. Dopo di che ho usato l'algoritmo per la ricerca dei contorni, quindi trovo il centroide di tutti i contorni. Questo mi dà le coordinate del centro della pupilla dell'occhio, questo metodo sta funzionando bene in tempo reale e anche rilevando l'ammiccamento degli occhi con una precisione molto buona.

Ora, il mio obiettivo è incorporare questa funzione in un gioco (un gioco di corse). In cui, se guardo a sinistra/destra, l'auto si sposta a sinistra/destra e se lampeggia l'auto rallenta. Come posso procedere ora ??? Avrei bisogno di un motore di gioco per farlo?

Ho sentito parlare di alcuni motori di gioco open source compatibili con Visual Studio 2010 (unità ecc.). È fattibile ??? Se sì, come dovrei procedere?

risposta

10

Sono uno degli sviluppatori di SimpleCV. Manteniamo una libreria python open source per la visione artificiale. Puoi scaricarlo allo SimpleCV.org. SimpleCV è ottimo per risolvere questi tipi di problemi mediante l'hacking sulla riga di comando. Sono stato in grado di estrarre la pupilla solo in un paio di righe di codice. Qui si va:

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() 

Here are the results.

Così i vostri prossimi passi sono da utilizzare una sorta di inseguitore, come un filtro Kalmann, per monitorare la pupilla robusto. Potresti voler modellare l'occhio come una sfera e tracciare il centroide della pupilla in coordinate sferiche (cioè theta e phi). Dovrai anche scrivere un po 'di codice per rilevare gli eventi di intermittenza in modo che il sistema non diventi instabile quando l'utente lampeggia. Suggerisco di usare un rivelatore di bordo per trovare le più grandi linee orizzontali nell'immagine e assumendo quelle sono le palpebre. Spero che questo aiuti e per favore facci sapere come procede il tuo lavoro.

2

Tutto dipende dalla qualità del sistema. Se si tratta di un progetto universitario di 2 mesi, va bene trovare e tenere traccia di alcuni BLOB o utilizzare una soluzione già pronta, come raccomandato da Kscottz.

Ma se si mira ad avere un sistema più serio, è necessario andare più a fondo.

Un approccio che consiglio di rilevare i punti di interesse del viso.Un buon esempio è modelle active, che sembra essere il migliore a monitoraggio volti

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

e

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

Si richiede una solida conoscenza di algoritmi di visione artificiale, buone conoscenze di programmazione e un po 'di lavoro. Ma i risultati varrà la pena.

E non fatevi ingannare dal fatto che le demo mostrano il tracciamento di tutto il viso. Ci si può allenare per monitorare qualsiasi cosa: mani, occhi, fiori o foglie, ecc

(Prima di iniziare con AAM, si consiglia di saperne di più su altri algoritmi di face-tracking Essi possono essere meglio per voi.)

1

Questa è la mia soluzione, sono in grado di seguire l'occhio e trovare le coordinate del centro della pupilla con precisione.

Innanzitutto ho messo a segno l'immagine presa dalla telecamera montata sulla testa. Dopo di che ho usato l'algoritmo per la ricerca dei contorni, quindi trovo il centroide di tutti i contorni. Questo mi dà le coordinate del centro della pupilla dell'occhio, questo metodo sta funzionando bene in tempo reale e anche rilevando l'ammiccamento degli occhi con una precisione molto buona.

+0

Questa dovrebbe essere una nuova domanda. –

+0

ok, eccolo http://stackoverflow.com/questions/8200031/transfer-output-of-opencv-to-input-for-a-game-engine – siso