我已经建立了一个人脸检测系统,用 OpenCV 做一次这样的事情,你可以看到结果here。
我当时使用的方法是使用内置 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
}