2011-11-16 18 views
12

track eye pupil hedefleyen bir proje üzerinde çalışıyorum. Bunun için gözün görüntülerini yakalayan kafa montajlı bir sistem yaptım. Donanım bölümü yazılımında parçalanmış olarak tamamlanmıştır. opencv kullanıyorum. Lütfen öğrenciyi takip etmenin en etkili yolunun ne olacağını bana bildirin. Houghcircles iyi performans göstermedi. Ben de burada HSV filtresi ile denenmiş ve adres Bundan sonraBir videoda göz gözü öğrencisi

kodu ve ham görüntünün ekran link ve bir işlenmiş olduğunu. Lütfen bu sorunu çözmek için bana yardımcı olun. Bağlantı ayrıca bu kodda kullanıyorum göz öğrenci video içerir.

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

Kodu:

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

} 

Ben gözü izlemek ve merkezi bulmak mümkün duyuyorum doğrusu göz bebeğinin koordine eder.

İlk önce, başa takılan kamera tarafından çekilen görüntüyü eşleştiriyorum. Bundan sonra kontur bulma algoritması kullandım, sonra tüm konturların merkezini buldum. Bu bana gözbebeğinin merkez koordinatlarını veriyor, bu yöntem gerçek zamanlı olarak gayet iyi çalışıyor ve göz kırpmayı çok iyi doğrulukla tespit ediyor.

Şimdi, amacım bu özelliği bir oyuna (yarış oyunu) gömmek. Hangi durumda sol/sağa bakarsam o zaman araba sola/sağa hareket eder ve eğer yanıp sönerse araba yavaşlar. Şimdi nasıl devam edebilirim ??? Bunu yapmak için bir oyun motoruna ihtiyacım olur mu?

Görsel stüdyo 2010 (birlik vb.) Ile uyumlu açık kaynaklı oyun motorlarını duydum. Bu yapılabilir mi ??? Eğer evetse, nasıl devam etmeliyim?

cevap

10

SimpleCV'nin geliştiricilerinden biriyim. Bilgisayar vizyonu için açık kaynaklı bir python kütüphanesi kullanıyoruz. SimpleCV.org'dan indirebilirsiniz. SimpleCV, bu tür problemleri çözmek için komut satırında hackleme yapmak için harikadır. Öğrenciyi sadece birkaç satır kod içinde çıkarabiliyordum. Al bakalım:

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.

Yani bir sonraki adımlar sağlam öğrenci takip etmek, bir Kalmann filtre gibi, izleyici çeşit kullanmaktır. Gözü bir küre olarak modellemek ve öğrencinin merkezî koordinatlarını küresel koordinatlarda (yani teta ve phi) izlemek isteyebilirsiniz. Ayrıca, yanıp sönen olayları algılamak için biraz kod yazmak isteyeceksiniz, böylece kullanıcı yanıp sönerken sistemin tüm kazançlı çıkmayacak. Resimdeki en büyük yatay çizgileri bulmak için bir canny kenar dedektörü kullanmanızı ve bunların göz kapakları olduğunu varsayalım. Umarım bu yardımcı olur ve lütfen işinizin nasıl ilerlediğini bize bildirin.

2

Sisteminizin ne kadar iyi olması gerektiğine bağlıdır. 2 aylık bir üniversite projesi ise, Kscottz'ın önerdiği gibi, bazı lekeleri bulmak ve izlemek ya da hazır bir çözüm kullanmak işe yaramıyor.

Ama daha ciddi bir sisteme sahip olmayı hedeflerseniz, daha derine inmelisiniz.

Size önerdiğim bir yaklaşım, yüz ilgi noktalarını tespit etmektir.Buna iyi bir örnek izleme en iyi

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

ve

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

Size bilgisayarla görme algoritmalarının sağlam bir anlayış gerektirir yüzleri gibi görünüyor Aktif Görünüm Modelleri, iyi programlama bilgisi olan ve bazı işler. Ancak sonuçlar çabaya değer olacaktır.

Ve demoların tüm yüz izlemeyi göstermesi gerçeğiyle aldanmayın. Bunu şey izlemek için eğitebilirsiniz: eller, gözler, çiçek veya yaprak vb

(AAM ile başlamadan önce, diğer yüz izleme algoritmaları hakkında daha fazla okumak isteyebilirsiniz Onlar sizin için daha iyi olabilir.)

1

Bu benim çözümüm, gözle bakabiliyorum ve öğrencinin merkez koordinatlarını tam olarak bulabiliyorum.

İlk önce, başa takılan kamera tarafından çekilen görüntüyü eşleştiriyorum. Bundan sonra kontur bulma algoritması kullandım, sonra tüm konturların merkezini buldum. Bu bana gözbebeğinin merkez koordinatlarını veriyor, bu yöntem gerçek zamanlı olarak gayet iyi çalışıyor ve göz kırpmayı çok iyi doğrulukla tespit ediyor.

+0

Bu gerçekten yeni bir soru olmalı. –

+0

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

İlgili konular