[[掲示板]] 3(5).avi、test.txtというファイルがプロジェクトのフォルダにないと動きません。 ご注意ください。 ご注意ください(森田)。 --------------------------------------------------------- // 概要 : 直前のフレームとの差分をとる // #include "cv.h" #include "cxcore.h" #include "highgui.h" #include "stdio.h" #define WIDTH 720 // キャプチャ画像の横幅 #define HEIGHT 480 // キャプチャ画像の縦幅 #define _CRT_SECURE_NO_DEPRECATE 1 //画像ファイルの名前 //char* filename="1(yuki).avi"; char* filename="3(5).avi"; int main( int argc, char **argv ) { int key; // キー入力用の変数 CvCapture *capture = NULL; // カメラキャプチャ用の構造体 IplImage *frameImage; // キャプチャ画像用IplImage int num; // 変化量格納変数 int x; // 画素探索用変数 int y; // 画素探索用変数 char buf[5]; // 数値から文字列への変換 //出力用テキストファイルの用意 FILE *fp; //出力ファイルポインタ fp = fopen( "test.txt", "w" ); if( fp == NULL ){ puts( "ファイルのオープンに失敗" ); return 1; } // 画像を生成する IplImage *backgroundImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); // 背景画像用IplImage IplImage *grayImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); // 背景画像用IplImage IplImage *differenceImage = cvCreateImage( cvSize(WIDTH, HEIGHT), IPL_DEPTH_8U, 1 ); // 差分画像用IplImage char windowNameCapture[] = "Capture"; // キャプチャした画像を表示するウィンドウの名前 char windowNameDifference[] = "Difference"; // 背景差分結果を表示するウィンドウの名前 if(NULL==(capture = cvCaptureFromAVI(filename))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } // ウィンドウを生成する cvNamedWindow( windowNameCapture, CV_WINDOW_AUTOSIZE ); cvNamedWindow( windowNameDifference, CV_WINDOW_AUTOSIZE ); // 初期背景を設定するためにカメラから画像取得 frameImage = cvQueryFrame( capture ); // frameImageをグレースケール化し、背景画像とする cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); // メインループ while ( 1 ) { // captureの入力画像1フレームをframeImageに格納する if (NULL==(frameImage = cvQueryFrame( capture ))){ fprintf(stderr,"指定のaviファイルが見つかりませんでした."); return -1; } // frameImageをグレースケール化したものを、grayImageに格納する cvCvtColor( frameImage, grayImage, CV_BGR2GRAY ); // grayImageと背景画像との差分をとる cvAbsDiff( grayImage, backgroundImage, differenceImage ); // differenceImageの画素を足し合わせる num = 0; for (x=0;x<WIDTH;x++){ for (y=0;y<HEIGHT;y++){ num = ((unsigned char*) (differenceImage->imageData + differenceImage->widthStep * y))[x] + num; } } // 足し合わせた値をテキストファイルへ出力 sprintf(buf, "%d\n", num); fprintf(fp,buf); fprintf(stdout,buf); cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); if ( differenceImage->origin == 0 ) { // 左上が原点の場合 cvFlip( differenceImage, differenceImage, 0 ); } // 画像を表示する cvShowImage( windowNameCapture, grayImage ); cvShowImage( windowNameDifference, differenceImage ); // キー入力判定 key = cvWaitKey( 1 ); if ( key == 'q' ) { // 'q'キーが押されたらループを抜ける break; } else if ( key == 'b' ) { // 'b'キーが押されたら、その時点でのキャプチャ画像を背景画像とする frameImage = cvQueryFrame( capture ); //cvCvtColor( frameImage, backgroundImage, CV_BGR2GRAY ); } } // キャプチャを解放する cvReleaseCapture( &capture ); // メモリを解放する cvReleaseImage( &backgroundImage ); cvReleaseImage( &differenceImage ); // ウィンドウを破棄する cvDestroyWindow( windowNameCapture ); cvDestroyWindow( windowNameDifference ); fclose( fp ); //ファイルを閉じる return 0; }