📄 blobtrack.cpp
字号:
#include "cvaux.h"#include "highgui.h"#include <stdio.h>/* select the correct function for doing case insensitive string comparaison */#ifdef WIN32 #define MY_STRNICMP strnicmp #define MY_STRICMP stricmp#else #define MY_STRNICMP strncasecmp #define MY_STRICMP strcasecmp#endif/* list of FG DETECTION modules */static CvFGDetector* cvCreateFGDetector0(){return cvCreateFGDetectorBase(CV_BG_MODEL_FGD, NULL);}static CvFGDetector* cvCreateFGDetector0Simple(){return cvCreateFGDetectorBase(CV_BG_MODEL_FGD_SIMPLE, NULL);}static CvFGDetector* cvCreateFGDetector1(){return cvCreateFGDetectorBase(CV_BG_MODEL_MOG, NULL);}typedef struct DefModule_FGDetector{ CvFGDetector* (*create)(); char* nickname; char* description;} DefModule_FGDetector;DefModule_FGDetector FGDetector_Modules[] ={ {cvCreateFGDetector0,"FG_0","Foreground Object Detection from Videos Containing Complex Background. ACM MM2003."}, {cvCreateFGDetector0Simple,"FG_0S","Simplyfied version of FG_0"}, {cvCreateFGDetector1,"FG_1","Adaptive background mixture models for real-time tracking. CVPR1999"}, {NULL,NULL,NULL}};/* list of BLOB DETECTION modules */typedef struct DefModule_BlobDetector{ CvBlobDetector* (*create)(); char* nickname; char* description;} DefModule_BlobDetector;DefModule_BlobDetector BlobDetector_Modules[] ={ {cvCreateBlobDetectorCC,"BD_CC","Detect new blob by tracking CC of FG mask"}, {cvCreateBlobDetectorSimple,"BD_Simple","Detect new blob by uniform moving of connected components of FG mask"}, {NULL,NULL,NULL}};/* list of BLOB TRACKING modules */typedef struct DefModule_BlobTracker{ CvBlobTracker* (*create)(); char* nickname; char* description;} DefModule_BlobTracker;DefModule_BlobTracker BlobTracker_Modules[] ={ {cvCreateBlobTrackerCCMSPF,"CCMSPF","connected component tracking and MSPF resolver for collision"}, {cvCreateBlobTrackerCC,"CC","Simple connected component tracking"}, {cvCreateBlobTrackerMS,"MS","Mean shift algorithm "}, {cvCreateBlobTrackerMSFG,"MSFG","Mean shift algorithm with FG mask using"}, {cvCreateBlobTrackerMSPF,"MSPF","Particle filtering based on MS weight"}, {NULL,NULL,NULL}};/* list of BLOB TRAJECTORY GENERATION modules */typedef struct DefModule_BlobTrackGen{ CvBlobTrackGen* (*create)(); char* nickname; char* description;} DefModule_BlobTrackGen;DefModule_BlobTrackGen BlobTrackGen_Modules[] ={ {cvCreateModuleBlobTrackGenYML,"YML","Generate track record in YML format as synthetic video data"}, {cvCreateModuleBlobTrackGen1,"RawTracks","Generate raw track record (x,y,sx,sy),()... in each line"}, {NULL,NULL,NULL}};/* list of BLOB TRAJECTORY POST PROCESSING modules */typedef struct DefModule_BlobTrackPostProc{ CvBlobTrackPostProc* (*create)(); char* nickname; char* description;} DefModule_BlobTrackPostProc;DefModule_BlobTrackPostProc BlobTrackPostProc_Modules[] ={ {cvCreateModuleBlobTrackPostProcKalman,"Kalman","Kalman filtering of blob position and size"}, {NULL,"None","No post processing filter"},// {cvCreateModuleBlobTrackPostProcTimeAverRect,"TimeAverRect","Average by time using rectangle window"},// {cvCreateModuleBlobTrackPostProcTimeAverExp,"TimeAverExp","Average by time using exponential window"}, {NULL,NULL,NULL}};/* list of BLOB TRAJECTORY ANALYSIS modules */CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisDetector();typedef struct DefModule_BlobTrackAnalysis{ CvBlobTrackAnalysis* (*create)(); char* nickname; char* description;} DefModule_BlobTrackAnalysis;DefModule_BlobTrackAnalysis BlobTrackAnalysis_Modules[] ={ {cvCreateModuleBlobTrackAnalysisHistPVS,"HistPVS","Histogramm of 5D feture vector analysis (x,y,vx,vy,state)"}, {NULL,"None","No trajectory analiser"}, {cvCreateModuleBlobTrackAnalysisHistP,"HistP","Histogramm of 2D feture vector analysis (x,y)"}, {cvCreateModuleBlobTrackAnalysisHistPV,"HistPV","Histogramm of 4D feture vector analysis (x,y,vx,vy)"}, {cvCreateModuleBlobTrackAnalysisHistSS,"HistSS","Histogramm of 4D feture vector analysis (startpos,endpos)"}, {cvCreateModuleBlobTrackAnalysisTrackDist,"TrackDist","Compare tracks directly"}, {cvCreateModuleBlobTrackAnalysisIOR,"IOR","Integrator (by OR operation) of several analysers "}, {NULL,NULL,NULL}};/* list of Blob Trajectory ANALYSIS modules *//*================= END MODULES DECRIPTION ===================================*//* run pipeline on all frames */static int RunBlobTrackingAuto( CvCapture* pCap, CvBlobTrackerAuto* pTracker,char* fgavi_name = NULL, char* btavi_name = NULL ){ int OneFrameProcess = 0; int key; int FrameNum = 0; CvVideoWriter* pFGAvi = NULL; CvVideoWriter* pBTAvi = NULL; //cvNamedWindow( "FG", 0 ); /* main cicle */ for( FrameNum=0; pCap && (key=cvWaitKey(OneFrameProcess?0:4))!=27; FrameNum++) {/* main cicle */ IplImage* pImg = NULL; IplImage* pMask = NULL; if(key!=-1) { OneFrameProcess = 1; if(key=='r')OneFrameProcess = 0; } pImg = cvQueryFrame(pCap); if(pImg == NULL) break; /* Process */ pTracker->Process(pImg, pMask); if(fgavi_name) if(pTracker->GetFGMask()) {/* debug FG */ IplImage* pFG = pTracker->GetFGMask(); CvSize S = cvSize(pFG->width,pFG->height); static IplImage* pI = NULL; if(pI==NULL)pI = cvCreateImage(S,pFG->depth,3); cvCvtColor( pFG, pI, CV_GRAY2BGR ); if(fgavi_name) {/* save fg to avi file */ if(pFGAvi==NULL) { pFGAvi=cvCreateVideoWriter( fgavi_name, CV_FOURCC('x','v','i','d'), 25, S ); } cvWriteFrame( pFGAvi, pI ); } if(pTracker->GetBlobNum()>0) {/* draw detected blobs */ int i; for(i=pTracker->GetBlobNum();i>0;i--) { CvBlob* pB = pTracker->GetBlob(i-1); CvPoint p = cvPointFrom32f(CV_BLOB_CENTER(pB)); CvSize s = cvSize(MAX(1,cvRound(CV_BLOB_RX(pB))), MAX(1,cvRound(CV_BLOB_RY(pB)))); int c = cvRound(255*pTracker->GetState(CV_BLOB_ID(pB))); cvEllipse( pI, p, s, 0, 0, 360, CV_RGB(c,255-c,0), cvRound(1+(3*c)/255) ); }/* next blob */; } cvNamedWindow( "FG",0); cvShowImage( "FG",pI); }/* debug FG*/ /* draw debug info */ if(pImg) {/* draw all inforamtion about tets sequence */ char str[1024]; int line_type = CV_AA; // change it to 8 to see non-antialiased graphics CvFont font; int i; IplImage* pI = cvCloneImage(pImg); cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 0.7, 0.7, 0, 1, line_type ); for(i=pTracker->GetBlobNum();i>0;i--) { CvSize TextSize; CvBlob* pB = pTracker->GetBlob(i-1); CvPoint p = cvPoint(cvRound(pB->x*256),cvRound(pB->y*256)); CvSize s = cvSize(MAX(1,cvRound(CV_BLOB_RX(pB)*256)), MAX(1,cvRound(CV_BLOB_RY(pB)*256))); int c = cvRound(255*pTracker->GetState(CV_BLOB_ID(pB))); cvEllipse( pI, p, s, 0, 0, 360, CV_RGB(c,255-c,0), cvRound(1+(3*0)/255), CV_AA, 8 ); p.x >>= 8; p.y >>= 8; s.width >>= 8; s.height >>= 8; sprintf(str,"%03d",CV_BLOB_ID(pB)); cvGetTextSize( str, &font, &TextSize, NULL ); p.y -= s.height; cvPutText( pI, str, p, &font, CV_RGB(0,255,255)); { char* pS = pTracker->GetStateDesc(CV_BLOB_ID(pB)); if(pS) { char* pStr = strdup(pS); char* pStrFree = pStr; for(;pStr && strlen(pStr)>0;) { char* str_next = strchr(pStr,'\n'); if(str_next) { str_next[0] = 0; str_next++; } p.y += TextSize.height+1; cvPutText( pI, pStr, p, &font, CV_RGB(0,255,255)); pStr = str_next; } free(pStrFree); } } }/* next blob */; cvNamedWindow( "Tracking", 0); cvShowImage( "Tracking",pI ); if(btavi_name && pI) {/* save to avi file */ CvSize S = cvSize(pI->width,pI->height); if(pBTAvi==NULL) { pBTAvi=cvCreateVideoWriter( btavi_name, CV_FOURCC('x','v','i','d'), 25, S ); } cvWriteFrame( pBTAvi, pI ); } cvReleaseImage(&pI); }/* draw all inforamtion about tets sequence */ }/* main cicle */ if(pFGAvi)cvReleaseVideoWriter( &pFGAvi ); if(pBTAvi)cvReleaseVideoWriter( &pBTAvi ); return 0;}/* RunBlobTrackingAuto *//* read parameters from command line and transfer to specified module */static void set_params(int argc, char* argv[], CvVSModule* pM, char* prefix, char* module){ int prefix_len = strlen(prefix); int i; for(i=0;i<argc;++i) { int j; char* ptr_eq = NULL; int cmd_param_len=0; char* cmd = argv[i]; if(MY_STRNICMP(prefix,cmd,prefix_len)!=0) continue; cmd += prefix_len; if(cmd[0]!=':')continue; cmd++; ptr_eq = strchr(cmd,'='); if(ptr_eq)cmd_param_len = ptr_eq-cmd; for(j=0;;++j) { int param_len; char* param = pM->GetParamName(j); if(param==NULL) break; param_len = strlen(param); if(cmd_param_len!=param_len) continue; if(MY_STRNICMP(param,cmd,param_len)!=0) continue; cmd+=param_len; if(cmd[0]!='=')continue; cmd++; pM->SetParamStr(param,cmd); printf("%s:%s param set to %g\n",module,param,pM->GetParam(param)); } } pM->ParamUpdate();}/* set_params *//* print all parameters value for given module */static void print_params(CvVSModule* pM, char* module, char* log_name){ FILE* log = log_name?fopen(log_name,"at"):NULL; int i; if(pM->GetParamName(0) == NULL ) return; printf("%s(%s) module parameters:\n",module,pM->GetNickName()); if(log) fprintf(log,"%s(%s) module parameters:\n",module,pM->GetNickName()); for(i=0;;++i) { char* param = pM->GetParamName(i); char* str = param?pM->GetParamStr(param):NULL; if(param == NULL)break; if(str) { printf(" %s: %s\n",param,str); if(log) fprintf(log," %s: %s\n",param,str); } else { printf(" %s: %g\n",param,pM->GetParam(param)); if(log) fprintf(log," %s: %g\n",param,pM->GetParam(param)); } } if(log)fclose(log);}/* print_params */int main(int argc, char* argv[]){/* main function */ CvCapture* pCap = NULL; CvBlobTrackerAutoParam1 param = {0}; CvBlobTrackerAuto* pTracker = NULL; float scale = 1; char* scale_name = NULL; char* yml_name = NULL; char** yml_video_names = NULL; int yml_video_num = 0; char* avi_name = NULL; char* fg_name = NULL; char* fgavi_name = NULL; char* btavi_name = NULL; char* bd_name = NULL; char* bt_name = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -