Mac上的脸部跟踪软件(内置摄像头)

问题描述:

我想要一种方式来跟踪用户在一段时间内看着屏幕。Mac上的脸部跟踪软件(内置摄像头)

E.g.在正常使用中,用户在屏幕上看到的确切时间是几秒钟。

我想知道哪些创新想法或预先存在的软件会允许我这样做。

因此,更详细的方式,我看到它是会有一些容忍度例如距屏幕的距离,头与屏幕的角度,这将被视为与显示器“接合”。如果使用mac book pro中的相机进行跟踪,那么它将在文本文件/键值存储中记录程序打开时每秒钟的时间戳和布尔值。

任何有这种事情的任何经验?

你可以在这里找到一个很好的起点:http://code.google.com/p/ehci/

它是一种基于OpenCV的一个软件,跟踪头部和检测它的方向。它是开源的。

+0

不幸的是,这似乎没有为Mac准备好。当然可以在iOS上工作,但理想情况下我想避免这种情况。 –

+0

但它看起来确切地记录我需要什么。 –

+0

您可以查看您需要的代码。它的代码有点混乱(一种Frankenstein软件),但应该与iOS一起工作。 –

Face.com有一个解决方案来重新面对面部。那么只需抓住相机输入并将其发送到他们的服务器,我猜?

+2

似乎建议它只接受照片而不是视频。现在我意识到视频只是一系列照片,但看起来可能需要很多工作,以便随着时间消除,并发送到API以获得结果。 –

在OpenCV中有实现(并且已经用标记进行过训练)的facetrackers。我建议你先开始跟踪面孔。一旦你有一个强大的facetracker,并且你可以产生告诉多长时间一张脸一直在看屏幕,等等。

以后你可以添加改进。一旦检测到人脸,您可以尝试识别分析人脸像素的人。

另一条线是识别部分的脸,像嘴巴,眼睛,鼻子,眉毛......

如果你能追踪脸和脸的组成部分,你可以尝试识别面部表情模式,如快乐,悲伤等。

我已经建立了一个人脸检测系统来做这样的事情,一旦使用OpenCV,你可以看到结果here

我那时使用的方法是haarTraining与OpenCV分类器中内置的标准的两个单独使用。我使用名为haarcascade_frontalface_default.xml的分类器来查看用户是否正在观看屏幕,并使用haarcascade_profileface.xml来查看用户是否正在视线。下面的代码应该让你开始使用openCV和C++。

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 
}