#include "stdafx.h" #include #include #include #include "DirectShow.h" #include #include "string.h" #include #include #include #include #include #include #include // ライブラリ読み込み #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"cvaux.lib") #pragma comment(lib,"highgui.lib") // 定数 #define CAPTURE_SIZE_X 640 #define CAPTURE_SIZE_Y 480 #define window_name "ふじもん" static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_default.xml" ); void detect_and_draw( IplImage* image ); int main() { storage = cvCreateMemStorage(0); cvClearMemStorage (storage); CvSeq* faces; int i; int count = 0; //int getchar(); int d = 0; //DirectShowクラスを生成 DirectShow capture(CAPTURE_SIZE_X, CAPTURE_SIZE_Y, 0); //処理速度表示用 CvFont dfont; char message[64] = ""; //フォントの初期化 cvInitFont(&dfont, CV_FONT_HERSHEY_SIMPLEX , 1.0f, 1.0f, 0.0f, 2, CV_AA); //OpenCV用の画像領域確保 IplImage *frame = cvCreateImage(cvSize(CAPTURE_SIZE_X, CAPTURE_SIZE_Y), 8, 3); IplImage *image = cvCreateImage(cvSize(CAPTURE_SIZE_X, CAPTURE_SIZE_Y), 8, 3); //ウインドウを開く cvNamedWindow(window_name, CV_WINDOW_AUTOSIZE); //以下ループ while(1) { //キャプチャ frame = capture.capture(); cvCopy(frame, image); //顔認識のON/OFF切り替え /*switch(d){ case 65: count = 1; break; case 66: count = 0; break; }*/ //if(count==1){ detect_and_draw( frame); // 顔認識と表示 //} //キー入力を取得 int c = cvWaitKey(10); if( (char)c == 27 ) { //Ecsキーで終了 break; } //画像表示 cvShowImage(window_name, image); } //終了処理 cvDestroyWindow(window_name); cvReleaseImage(&image); } void detect_and_draw( IplImage* img ) { static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} }; double scale = 1.3; IplImage* gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 ); IplImage* small_img = cvCreateImage( cvSize( cvRound (img->width/scale), cvRound (img->height/scale)), 8, 1 ); int i; //色空間を変換しdstに出力 cvCvtColor( img, gray, CV_BGR2GRAY ); //画像のサイズ変更 cvResize( gray, small_img, CV_INTER_LINEAR ); //グレースケール画像のヒストグラムを均一化する cvEqualizeHist( small_img, small_img ); //メモリストレージをクリアする cvClearMemStorage( storage ); if( cascade ) { //cvGetTickCount→1マイクロ秒あたりのtick数を返す double t = (double)cvGetTickCount(); //cvhaarDetectObject→顔検出 CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage, 1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/, cvSize(30, 30) ); t = (double)cvGetTickCount() - t; printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) ); /* 顔領域の描画 */ for( i = 0; i < (faces ? faces->total : 0); i++ ) { CvRect* r = (CvRect*)cvGetSeqElem( faces, i ); CvPoint center; int radius; center.x = cvRound((r->x + r->width*0.5)*scale); center.y = cvRound((r->y + r->height*0.5)*scale); radius = cvRound((r->width + r->height)*0.25*scale); cvCircle( img, center, radius, colors[i%8], 3, 8, 0 ); } } cvShowImage( window_name, img ); cvReleaseImage( &gray ); cvReleaseImage( &small_img ); }