掲示板?

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