OpenCV を使用して、このようなことを行う顔検出システムを構築しました。結果はこちらで確認できます。
そのとき私が使用した方法は、標準で組み込まれた OpenCV 分類器を使用した haarTraining の 2 つの別々の使用法でした。ユーザーが画面を見ているかどうかを確認するために 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
}