顔認識のサンプル

OpenCVのライブラリに、顔学習ファイルがあります。
これを、実行ファイルと同じディレクトリにコピーしてください。

C:\Program Files\OpenCV\data\haarcascades\haarcascade_frontalface_alt.xml

ソースコード

#include <stdio.h>

#include <cv.h>
#include <highgui.h>
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cvaux.lib")
#pragma comment(lib, "cvcam.lib")
#pragma comment(lib, "cvhaartraining.lib")
#pragma comment(lib, "highgui.lib")

int main(int argc, char *argv[])
{
   int i;
   IplImage *frame, *frame_copy;
   CvRect *r;
   CvSeq *faces;
   CvPoint pt[6];
   CvCapture *capture;
   CvMemStorage *storage = 0;
   CvHaarClassifierCascade *cascade = 0;

   /* 学習ファイルを読み込む */
   if( !(cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_alt.xml", 0, 0, 0 )) ){
       printf("ERROR: Could not load classifier cascade\n");
       return(-1);
   }

   /* デバイスを開く */
   if( !(capture = cvCaptureFromCAM(0)) ){
       printf("ERROR: Could not open Camera Device\n");
       return(-2);
   }

   /* 初期化 */
   storage = cvCreateMemStorage(0);
   if( !(frame = cvQueryFrame(capture)) ) return(-3);
   frame_copy = cvCreateImage( cvSize(frame->width,frame->height), IPL_DEPTH_8U, frame->nChannels );
   cvNamedWindow("result", 1);

   /* メイン */
   while( cvWaitKey(1) != 'q' ){
       /* キャプチャ */
       if( !(frame = cvQueryFrame(capture)) ) return(-3);

       /* 顔認識 */
       cvFlip(frame, frame_copy, 0);
       faces = cvHaarDetectObjects(frame_copy, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(40, 40) );

       /* 線で軌跡を描く */
       for(i = 5; i > 0; i--){
           pt[i].x = pt[i - 1].x;
           pt[i].y = pt[i - 1].y;
       }
       if(faces->total){
           printf(" 発見(*゚Д゚) ムホムホ \n");
           r = (CvRect*)cvGetSeqElem(faces, 0);
           pt[0].x = r->x + r->width / 2;
           pt[0].y = r->y + r->height / 2;
       } else {
           printf(" o(・_・= ・_・)o キョロキョロ \n");
       }
       for(i = 0; i < 4; i++){
           cvLine(frame_copy, pt[i], pt[i + 1], CV_RGB(255,0,0), 3, 8, 0);
       }

       /* ウィンドウ表示 */
       cvShowImage("result", frame_copy);
   }

   /* 終了処理 */
   cvDestroyWindow("result");
   cvReleaseImage(&frame_copy);
   cvReleaseCapture(&capture);
   return(0);
}