6

我想要一种方法来跟踪用户在一段时间内查看屏幕的情况。

例如,在正常使用中,用户在一天中的确切秒数查看屏幕。

我想知道什么样的创新想法或预先存在的软件可以让我做到这一点。

因此,对于我所看到的更多细节,会有一些公差水平,例如与屏幕的距离、头到屏幕的角度,这些都被认为是与显示器“接合”。如果相机上的一个mac book pro被用来跟踪这个,那么它会在一个文本文件/键值存储中记录程序打开的每一秒的时间戳和布尔值。

有没有人有这种事情的经验?

4

4 回答 4

6

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

它是一个基于 OpenCV 的软件,可以跟踪头部并检测其方向。它是开源的。

于 2012-05-29T12:46:47.130 回答
3

例如在 OpenCV 中实现了面部跟踪器(并且已经使用标记进行了训练)。我建议您首先从跟踪面部开始。一旦你有了一个强大的面部跟踪器,你就可以生成输出,告诉你一张脸已经看着屏幕多长时间了,等等。

稍后您可以添加改进。检测到人脸后,您可以尝试通过分析人脸像素来识别人。

另一条线是识别面部的各个部分,例如嘴巴、眼睛、鼻子、眉毛……

如果您可以跟踪面部和面部的某些部分,您可以尝试识别面部表情模式,如快乐、悲伤等。

于 2012-05-29T13:15:08.873 回答
1

Face.com 有一个重新识别面孔的解决方案。所以我猜只是抓住相机输入并将其发送到他们的服务器?

于 2012-05-29T12:45:08.253 回答
1

我曾经使用 OpenCV 构建了一个人脸检测系统来做这样的事情,你可以在这里看到结果。

我当时使用的方法是使用内置 OpenCV 分类器标准的 haarTraining 两次单独使用。我使用名为 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
}
于 2012-05-30T07:57:34.803 回答