#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char* argv[])
{
	IplImage *now,*bg,*diff,*object,*gray;
	CvCapture *capture = 0;
	int key;
	
	capture = cvCaptureFromCAM(0);

	if(!capture){
		printf("Can't find capture device.\n");
		exit(0);
	}
	// 背景をキャプチャし、セーブする
	now = cvQueryFrame(capture);
	
	//IplImageの領域確保
	bg = cvCreateImage(cvSize(now->width,now->height),
			   IPL_DEPTH_8U,3);
	diff =cvCreateImage(cvSize(now->width,now->height),
			    IPL_DEPTH_8U,3);
	object = cvCreateImage(cvSize(now->width,now->height),
			       IPL_DEPTH_8U,3);
	gray = cvCreateImage(cvSize(now->width,now->height),
			       IPL_DEPTH_8U,1);

	cvCopy(now,bg,NULL);
	
	cvNamedWindow("differential frame",1);

	while( 1 ){
		cvSetZero(object);
		if( !(now = cvQueryFrame(capture)) )
			break;
		//背景と現画像との差の絶対値を計算する
		cvAbsDiff(now,bg,diff);

		// グレー画像にする
		cvCvtColor(diff,gray,CV_BGR2GRAY);

		// 閾値が30で2値化する
		cvThreshold(gray,gray,20,1,CV_THRESH_BINARY);

		//grayをマスクにして、現画像を切り取りコピーする
		cvCopy(now,object,gray);

		cvShowImage("differential frame",object);
			
		switch(key=cvWaitKey(10)){
		case 'r': // 現画像を背景画像として保存
			cvCopy(now,bg,NULL);
			break;
		}
		if(key == 'q') // 終了
			break;
		if(key == 's'){
			cvSaveImage("original.jpg",now);
			cvSaveImage("output.jpg",object);
		}
	}
	cvReleaseCapture(&capture);
	cvReleaseImage(&diff);
	cvReleaseImage(&bg);
	cvReleaseImage(&object);
	cvReleaseImage(&gray);
	cvDestroyWindow("differential frame");

	return 0;
}