[[掲示板]]

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;
 }