2012-05-29 2 views
6

Ich möchte eine Möglichkeit, einen Benutzer im Laufe der Zeit auf einen Bildschirm zu verfolgen.Face-Tracking-Software auf dem Mac (in Build-Kamera)

z. bei normalem Gebrauch hatte der Benutzer genau die Sekunden des Tages, die auf den Bildschirm schauten.

Ich frage mich, was innovative Ideen oder bereits vorhandene Software mir erlauben würde, dies zu tun.

Also für weitere Details die Art, wie ich es sehe, wäre da einige Toleranzstufen, z. Abstand vom Bildschirm, Winkel des Kopfes zum Bildschirm, der als "verlobt" mit dem Monitor betrachtet werden würde. Wenn die Kamera ein Mac Book Pro verwendet, um dies zu verfolgen, dann würde sie in einem Textdatei-/Schlüsselwertspeicher einen Zeitstempel und einen booleschen Wert für jede Sekunde der Zeit, in der das Programm eingeschaltet war, aufzeichnen.

Jeder mit so etwas Erfahrung?

Antwort

6

Sie können einen guten Ausgangspunkt finden Sie hier: http://code.google.com/p/ehci/

Es ist eine Software, die auf OpenCV basiert ist, die Kopfspuren und seine Orientierung erkennen. Es ist opensource.

+0

Leider scheint dies nicht für Mac bereit zu sein. Sicherlich könnte man versuchen, mit iOS zu arbeiten, aber im Idealfall möchte ich das vermeiden. –

+0

aber es sieht genau das aus, was ich brauche. –

+0

Sie können nach Code suchen, was Sie brauchen. Es ist ein wenig verwirrend Code (eine Art Frankenstein-Software), sollte aber mit ein wenig Arbeit mit iOS arbeiten. –

1

Face.com hat eine Lösung, Gesichter zu regonisieren. Also schnappen Sie sich einfach die Kamera und senden Sie sie an ihre Server, denke ich?

+2

Scheint, es akzeptiert nur Fotos im Gegensatz zu Video. Jetzt ist mir klar, dass Video nur eine Sequenz von Fotos ist, aber es sieht so aus, als wäre es eine Menge Arbeit, das mit der Zeit auszustreifen und an die API zu schicken, um Ergebnisse zu erzielen. –

3

Es gibt Facetrackers implementiert (und bereits mit Markern trainiert), zum Beispiel in OpenCV. Ich schlage vor, dass Sie zuerst mit dem Tracking von Gesichtern beginnen. Sobald Sie einen robusten Facetracker haben, können Sie eine Ausgabe erzeugen, die anzeigt, wie lange ein Gesicht auf den Bildschirm gesehen hat usw.

Später können Sie Verbesserungen hinzufügen. Sobald Sie ein Gesicht erkannt haben, können Sie versuchen, Personen zu erkennen, die Gesichtspixel analysieren.

andere Linie ist, Teile des Gesichts zu erkennen, wie Mund, Augen, Nase, Augenbrauen ...

Wenn Sie Gesicht und Teile des Gesichts verfolgen können, können Sie versuchen, Mimik, Muster zu erkennen, wie Glück, Traurigkeit, etc.

1

Ich habe ein Gesichtserkennungssystem gebaut, um so etwas einmal mit OpenCV zu tun, können Sie das Ergebnis here sehen.

Die Methode, die ich dann verwendet habe, war zwei separate Verwendungen von HaarTraining mit dem Standard in OpenCV-Klassifikatoren gebaut. Ich habe den Klassifizierer haarcascade_frontalface_default.xml verwendet, um zu sehen, ob ein Benutzer den Bildschirm und haarcascade_profileface.xml beobachtet, um zu sehen, ob der Benutzer weggeschaut hat. Der folgende Code sollte Ihnen den Einstieg in openCV und C++ erleichtern.

CvHaarClassifierCascade *cascade_face; 
CvMemStorage   *storage_face; 
CvHaarClassifierCascade *cascade_profile; 
CvMemStorage   *storage_profile; 

//profile face 
storage_profile = cvCreateMemStorage(0); 
cascade_profile = (CvHaarClassifierCascade*)cvLoad("haarcascade_profileface.xml", 0, 0, 0); 
cvHaarDetectObjects(frm, cascade_profile, storage_profile, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING); 

//frontal face 
storage_face = cvCreateMemStorage(0); 
cascade_face = (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_default.xml", 0, 0, 0); 
cvHaarDetectObjects(frm, cascade_face, storage_face, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING); 

//detect profiles 
CvSeq *profile = cvHaarDetectObjects(img,cascade_profile, storage_profile, 1.1,3,0,cvSize(20, 20)); 

for(i = 0 ; i < (profile ? profile->total : 0) ; i++) { 
    CvRect *r = (CvRect*)cvGetSeqElem(profile, i); 
    //draw rectangle here, or do other stuff 
} 

//detect front 
CvSeq *faces = cvHaarDetectObjects(img,cascade_face, storage_face, 1.1,3,0,cvSize(20,20)); 

for(i = 0 ; i < (faces ? faces->total : 0) ; i++) { 
    CvRect *r = (CvRect*)cvGetSeqElem(faces, i); 
    //draw rectangle here, or do other stuff 
}