⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blobtrack.cpp

📁 opencv 中科院数字图像处理入门教程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -