#include "stdafx.h" #include #include "Readf.h" #include #include #include #pragma comment(lib, "shlwapi.lib") #include "C:\OpenCV2.0\include\opencv\cv.h" #include "C:\OpenCV2.0\include\opencv\highgui.h" #ifdef _DEBUG //Debugモードの場合 #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\debug\\cv200d.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\debug\\cxcore200d.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\debug\\cvaux200d.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\debug\\highgui200d.lib") #else //Releaseモードの場合 #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\release\\cv200.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\release\\cxcore200.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\release\\cvaux200.lib") #pragma comment(lib,"C:\\OpenCV2.0\\VS2008\\lib\\release\\highgui200.lib") #endif // ピクセル値取得用マクロ定義 #define B(IMG, X,Y) ((uchar*)((IMG)->imageData + (IMG)->widthStep*(Y)))[(X)*3] #define G(IMG, X,Y) ((uchar*)((IMG)->imageData + (IMG)->widthStep*(Y)))[(X)*3+1] #define R(IMG, X,Y) ((uchar*)((IMG)->imageData + (IMG)->widthStep*(Y)))[(X)*3+2] int _tmain(int argc, _TCHAR* argv[]) { // parameter 定義 int CameraNo; double SpeedBackGround; int ThresholdMoveDetect; bool DebugMode; int IntervalFileSave; int FPS; CameraNo = 0; // 0- SpeedBackGround = 0.2; // 0.001-0.999 ThresholdMoveDetect = 15; // 0-255 DebugMode = TRUE; // True 0:False IntervalFileSave = 3000; // 画面をファイルセーブしたら3000ms以内には次のファイルセーブしない FPS = 30; // frame oer second // 定義ファイルリード FILE *fp; fp=fopen("USBCAM.ini","r"); if(fp==0){ printf("error: USBCAM.ini not exist.\n"); return 1; } while(1) { int colum; colum=qfread(fp); printf("%s %s %g",Field[0],Field[1],atof(Field[1])); if(colum==0) break; /* EOF */ if(strcmp(Field[0],"CameraNo")==0) CameraNo = atof(Field[1]); if(strcmp(Field[0],"SpeedBackGround")==0) SpeedBackGround = atof(Field[1]); if(strcmp(Field[0],"ThresholdMoveDetect")==0) ThresholdMoveDetect = atof(Field[1]); if(strcmp(Field[0],"DebugMode")==0) DebugMode = atof(Field[1])==1 ? TRUE : FALSE ; if(strcmp(Field[0],"IntervalFileSave")==0) IntervalFileSave = atof(Field[1]); if(strcmp(Field[0],"FPS")==0) FPS = atof(Field[1]); } fclose(fp); printf("%d %g %d %d %d\n",CameraNo,SpeedBackGround,ThresholdMoveDetect,DebugMode,FPS); // ビデオ定義 CvCapture *src; // ビデオキャプチャ宣言 IplImage *camera, *img_diff, *img_back; // 画像変数宣言 CvMat *mat_src, *mat_diff, *mat_back; // 行列宣言 cvNamedWindow("入力映像",0); if(DebugMode) cvNamedWindow("平均映像",0); if(DebugMode) cvNamedWindow("差分映像",0); src = cvCaptureFromCAM(CameraNo); // 映像取得(カメラ映像) if(src == NULL){ printf("映像が取得できません。\n"); cvWaitKey(0); return -1;} camera = cvQueryFrame(src); // 初期フレーム取得 int h, w; w = camera->width; // 映像フレームの幅 h = camera->height; // 映像フレームの高さ // 画像領域確保 img_back = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 3); img_diff = cvCreateImage(cvSize(w,h), IPL_DEPTH_8U, 3); // 32bit浮動小数点数型3チャネルの配列を準備 mat_back = cvCreateMat(h,w, CV_32FC3); mat_diff = cvCreateMat(h,w, CV_32FC3); mat_src = cvCreateMat(h,w, CV_32FC3); cvSetZero(mat_back); cvSetZero(mat_diff); cvSetZero(mat_src); // 0で初期化 // 日付表示変数 CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX, 1, 1, 0, 2, CV_AA); time_t current; struct tm *local; char date[100], filename[100], directory[100]; int FileSavedTime; FileSavedTime=0; int date_old; date_old=0; // フレーム処理ループ while(1) { camera = cvQueryFrame(src); if(camera == NULL) break; // 1フレーム取得 cvConvert(camera, mat_src); // 入力画像を浮動小数点数型配列に変換 cvAbsDiff(mat_src, mat_back, mat_diff); // 差分の計算 diff = src - back cvRunningAvg(mat_src, mat_back, SpeedBackGround, 0); // 平均行列の更新 back = 0.1*src + 0.9*back cvConvert(mat_diff, img_diff); // 浮動小数点数型配列を画像に変換 cvConvert(mat_back, img_back); // 文字表示領域をダークにする for(int y=0; y<33; y++){ //ピクセル値変換領域垂直方向 for(int x=0; x<345; x++){ //ピクセル値変換領域水平方向 R(camera ,x,y)/=3; G(camera ,x,y)/=3; B(camera ,x,y)/=3; R(img_diff,x,y)/=3; G(img_diff,x,y)/=3; B(img_diff,x,y)/=3; R(img_back,x,y)/=3; G(img_back,x,y)/=3; B(img_back,x,y)/=3; } } //struct tm { // --- 時刻関連メンバ -------------------------------- //int tm_sec; // 秒 0-60(閏秒考慮) //int tm_min; // 分 0-59 //int tm_hour; // 時 0-23 // --- 日付関連メンバ -------------------------------- //int tm_mday; // 日 1-31 //int tm_mon; // 月 0-11(注:1月からの通算月数) //int tm_year; // 年 1900年から通算年数(0なら1900年) // --- その他のメンバ -------------------------------- //int tm_wday; // 日曜〜土曜まで 0-6 //int tm_yday; // 1/1 からの通算日数 //int tm_isdst; // サマータイム有効>0、無効=0,それ以外は意味無し time(¤t); /* 現在の時刻を取得 */ local = localtime(¤t); /* 地方時の構造体に変換 */ sprintf(date,"%d.%02d.%02d %02d:%02d:%02d", local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour, local->tm_min, local->tm_sec); sprintf(filename,"%d%02d%02d-%02d%02d%02d.jpg", local->tm_year+1900,local->tm_mon+1,local->tm_mday,local->tm_hour, local->tm_min, local->tm_sec); sprintf(directory,"%d%02d%02d", local->tm_year+1900,local->tm_mon+1,local->tm_mday); cvPutText(camera, date, cvPoint(3,26), &font, CV_RGB(255,0,255)); // 文字 cvPutText(img_back, date, cvPoint(3,26), &font, CV_RGB(255,0,255)); // 文字 cvPutText(img_diff, date, cvPoint(3,26), &font, CV_RGB(255,0,255)); // 文字 int max,min,ave[16],cnt; // 最大明度探索 max=0; min=1000; cnt=0; for(int i=0;i<=15;i++) ave[i]=0; for(int y=33; ymax) max=BW; if(BWTH) cvCircle(img_diff,cvPoint(w*0.5/4,h*0.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[1] >TH) cvCircle(img_diff,cvPoint(w*1.5/4,h*0.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[2] >TH) cvCircle(img_diff,cvPoint(w*2.5/4,h*0.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[3] >TH) cvCircle(img_diff,cvPoint(w*3.5/4,h*0.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[4] >TH) cvCircle(img_diff,cvPoint(w*0.5/4,h*1.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[5] >TH) cvCircle(img_diff,cvPoint(w*1.5/4,h*1.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[6] >TH) cvCircle(img_diff,cvPoint(w*2.5/4,h*1.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[7] >TH) cvCircle(img_diff,cvPoint(w*3.5/4,h*1.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[8] >TH) cvCircle(img_diff,cvPoint(w*0.5/4,h*2.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[9] >TH) cvCircle(img_diff,cvPoint(w*1.5/4,h*2.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[10]>TH) cvCircle(img_diff,cvPoint(w*2.5/4,h*2.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[11]>TH) cvCircle(img_diff,cvPoint(w*3.5/4,h*2.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[12]>TH) cvCircle(img_diff,cvPoint(w*0.5/4,h*3.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[13]>TH) cvCircle(img_diff,cvPoint(w*1.5/4,h*3.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[14]>TH) cvCircle(img_diff,cvPoint(w*2.5/4,h*3.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 if(ave[15]>TH) cvCircle(img_diff,cvPoint(w*3.5/4,h*3.5/4),5,CV_RGB(255,0,0),-1,CV_AA,0); // 円 // 動き検出ファイルセーブ { bool MoveDetect; for(int i=0;i<=15; i++){ if(ave[i]>TH){ MoveDetect=TRUE; break; }else MoveDetect=FALSE; } if(MoveDetect){ SYSTEMTIME st; GetLocalTime(&st); int time_ms; time_ms = st.wHour*1000*60*60 + st.wMinute*1000*60 + st.wSecond*1000 + st.wMilliseconds; if( (date_old!=local->tm_mday) || (FileSavedTime==0) || ((time_ms-FileSavedTime)>IntervalFileSave) ){ printf("%s save\n",filename); // file save //フォルダが存在するかどうかを調べる if (PathIsDirectory(directory)) printf("%sフォルダは存在します\n",directory); else { printf("%sフォルダは存在しませんので作ります\n",directory); CreateDirectory(directory,NULL); } strcat(directory,"\\"); strcat(directory,filename); cvSaveImage(directory, camera); FileSavedTime=time_ms; date_old=local->tm_mday; } } } cvShowImage("入力映像", camera); // 1フレーム表示 if(DebugMode) cvShowImage("平均映像", img_back); if(DebugMode) cvShowImage("差分映像", img_diff); if(cvWaitKey((int)(1000.0/FPS)) == 27) break; // ESCキーを押した時終了 } // ウィンドウ・キャプチャ・画像の解放 cvDestroyAllWindows(); cvReleaseCapture(&src); cvReleaseImage(&img_diff); cvReleaseImage(&img_back); cvReleaseMat(&mat_src); cvReleaseMat(&mat_diff); cvReleaseMat(&mat_back); return 0; }