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

📄 blobtrackanalysishist.cpp

📁 Program use openCV to demo edge detection (algorithm Gradient).
💻 CPP
📖 第 1 页 / 共 4 页
字号:
private:
    CvMemStorage*       m_pMem;
    int                 m_TrackNum;
    int                 m_Frame;
    char                m_DataFileName[1024];
    int                 m_Dim;
    float*              m_pFV;
    //CvStatModel*        m_pStatModel;
    void*               m_pStatModel;
    CvBlobSeq           m_Tracks;
    CvMat*              m_pTrainData;
    int                 m_LastTrainDataSize;
//    CvBlobTrackFVGen*   (*m_CreateFVGen)();
    CvBlobTrackFVGen*   m_pFVGen;
    float               m_NU;
    float               m_RBFWidth;
    IplImage*           m_pStatImg; /* for debug purpose */
    CvSize              m_ImgSize;
    void RetrainStatModel()
    {
///////// !!!!! TODO !!!!! Repair /////////////
#if 0        
        float               nu = 0;
        CvSVMModelParams    SVMParams = {0};
        CvStatModel*        pM = NULL;
        

        memset(&SVMParams,0,sizeof(SVMParams));
        SVMParams.svm_type = CV_SVM_ONE_CLASS;
        SVMParams.kernel_type = CV_SVM_RBF;
        SVMParams.gamma = 2.0/(m_RBFWidth*m_RBFWidth);
        SVMParams.nu = m_NU;
        SVMParams.degree = 3;
        SVMParams.criteria = cvTermCriteria(CV_TERMCRIT_EPS, 100, 1e-3 );
        SVMParams.C = 1;
        SVMParams.p = 0.1;
             

        if(m_pTrainData == NULL) return;
        {
            int64       TickCount = cvGetTickCount();
            printf("Frame: %d\n           Retrain SVM\nData Size = %d\n",m_Frame, m_pTrainData->rows);
            pM = cvTrainSVM( m_pTrainData,CV_ROW_SAMPLE, NULL, (CvStatModelParams*)&SVMParams, NULL, NULL);
            TickCount = cvGetTickCount() - TickCount ;
            printf("SV Count = %d\n",((CvSVMModel*)pM)->sv_total);
            printf("Processing Time = %.1f(ms)\n",TickCount/(1000*cvGetTickFrequency()));
            
        }
        if(pM==NULL) return;
        if(m_pStatModel) cvReleaseStatModel(&m_pStatModel);
        m_pStatModel = pM;
        
        if(m_pTrainData && m_Wnd)
        {
            float       MaxVal = 0;
            IplImage*   pW = cvCreateImage(m_ImgSize,IPL_DEPTH_32F,1);
            IplImage*   pI = cvCreateImage(m_ImgSize,IPL_DEPTH_8U,1);
            float*      pFVVar = m_pFVGen->GetFVVar();
            int     i;
            cvZero(pW);
            for(i=0;i<m_pTrainData->rows;++i)
            {/* draw all elements */
                float*          pFV = (float*)(m_pTrainData->data.ptr + m_pTrainData->step*i);
                int             x = cvRound(pFV[0]*pFVVar[0]);
                int             y = cvRound(pFV[1]*pFVVar[1]);
                float           r;

                if(x<0)x=0;
                if(x>=pW->width)x=pW->width-1;
                if(y<0)y=0;
                if(y>=pW->height)y=pW->height-1;

                r = ((float*)(pW->imageData + y*pW->widthStep))[x];
                r++;
                ((float*)(pW->imageData + y*pW->widthStep))[x] = r;

                if(r>MaxVal)MaxVal=r;
            }/* next point */
            if(MaxVal>0)cvConvertScale(pW,pI,255/MaxVal,0);
            cvNamedWindow("SVMData",0);
            cvShowImage("SVMData",pI);
            cvSaveImage("SVMData.bmp",pI);
            cvReleaseImage(&pW);
            cvReleaseImage(&pI);
        }/* prepare for debug */

        if(m_pStatModel && m_Wnd && m_Dim == 2)
        {
            float*      pFVVar = m_pFVGen->GetFVVar();
            int x,y;
            if(m_pStatImg==NULL)
            {
                m_pStatImg = cvCreateImage(m_ImgSize,IPL_DEPTH_8U,1);
            }
            cvZero(m_pStatImg);
            for(y=0;y<m_pStatImg->height;y+=1)for(x=0;x<m_pStatImg->width;x+=1)
            {/* draw all elements */
                float           res;
                uchar*  pData = (uchar*)m_pStatImg->imageData + x + y*m_pStatImg->widthStep;
                CvMat           FVmat;
                float           xy[2] = {x/pFVVar[0],y/pFVVar[1]};
                cvInitMatHeader( &FVmat, 1, 2, CV_32F, xy );
                res = cvStatModelPredict( m_pStatModel, &FVmat, NULL );
                pData[0]=((res>0.5)?255:0);
            }/* next point */
            cvNamedWindow("SVMMask",0);
            cvShowImage("SVMMask",m_pStatImg);
            cvSaveImage("SVMMask.bmp",m_pStatImg);
        }/* prepare for debug */
#endif
    };
    void SaveStatModel()
    {
        if(m_DataFileName[0])
        {
            if(m_pTrainData)cvSave(m_DataFileName, m_pTrainData);
        }
    };
    void LoadStatModel()
    {
        if(m_DataFileName[0])
        {
            CvMat* pTrainData = (CvMat*)cvLoad(m_DataFileName);
            if(CV_IS_MAT(pTrainData) && pTrainData->width == m_Dim)
            {
                if(m_pTrainData) cvReleaseMat(&m_pTrainData);
                m_pTrainData = pTrainData;
                RetrainStatModel();
            }
        }
    }
public:
    CvBlobTrackAnalysisSVM(CvBlobTrackFVGen*   (*createFVGen)()):m_Tracks(sizeof(DefTrackSVM))
    {
        m_pFVGen = createFVGen();
        m_Dim = m_pFVGen->GetFVSize();
        m_pFV = (float*)cvAlloc(sizeof(float)*m_Dim);
        m_Frame = 0;
        m_TrackNum = 0;
        m_pTrainData = NULL;
        m_pStatModel = NULL;
        m_DataFileName[0] = 0;
        m_pStatImg = NULL;
        m_LastTrainDataSize = 0;
        
        m_NU = 0.2f;
        AddParam("Nu",&m_NU);
        CommentParam("Nu","Parameters that tunes SVM border elastic");
        
        m_RBFWidth = 1;
        AddParam("RBFWidth",&m_RBFWidth);
        CommentParam("RBFWidth","Parameters that tunes RBF kernel function width.");

    }/* constructor */
    ~CvBlobTrackAnalysisSVM()
    {
        int i;
        SaveStatModel();
        for(i=m_Tracks.GetBlobNum();i>0;--i)
        {
            DefTrackSVM* pF = (DefTrackSVM*)m_Tracks.GetBlob(i-1);
            if(pF->pMem) cvReleaseMemStorage(&pF->pMem);
            //pF->pFVGen->Release();
        }
        if(m_pStatImg)cvReleaseImage(&m_pStatImg);
        cvFree(&m_pFV);
    }/* destructor */

    /*-----------------  interface --------------------*/
    virtual void    AddBlob(CvBlob* pBlob)
    {
        DefTrackSVM* pF = (DefTrackSVM*)m_Tracks.GetBlobByID(CV_BLOB_ID(pBlob));

        m_pFVGen->AddBlob(pBlob);

        if(pF == NULL)
        { /* create new record */
            DefTrackSVM F;
            F.state = 0;
            F.blob = pBlob[0];
            F.LastFrame = m_Frame;
            //F.pFVGen = m_CreateFVGen();
            F.pMem = cvCreateMemStorage();
            F.pFVSeq = cvCreateSeq(0,sizeof(CvSeq),sizeof(float)*m_Dim,F.pMem);
            
            F.BlobLast.x = -1;
            F.BlobLast.y = -1;
            F.BlobLast.w = -1;
            F.BlobLast.h = -1;
            m_Tracks.AddBlob((CvBlob*)&F);
            pF = (DefTrackSVM*)m_Tracks.GetBlobByID(CV_BLOB_ID(pBlob));
        }

        assert(pF);
        pF->blob = pBlob[0];
        pF->LastFrame = m_Frame;
    };
    virtual void Process(IplImage* pImg, IplImage* pFG)
    {
        int     i;
        float*  pFVVar = m_pFVGen->GetFVVar();
        
        m_pFVGen->Process(pImg, pFG);
        m_ImgSize = cvSize(pImg->width,pImg->height);

        for(i=m_pFVGen->GetFVNum();i>0;--i)
        {
            int             BlobID = 0;
            float*          pFV = m_pFVGen->GetFV(i,&BlobID);
            DefTrackSVM*    pF = (DefTrackSVM*)m_Tracks.GetBlobByID(BlobID);
            if(pF && pFV)
            {/* process */
                float   dx,dy;
                CvMat   FVmat;
                
                pF->state = 0;

                if(m_pStatModel)
                {
                    int j;
                    for(j=0;j<m_Dim;++j)
                    {
                        m_pFV[j] = pFV[j]/pFVVar[j];
                    }
                    cvInitMatHeader( &FVmat, 1, m_Dim, CV_32F, m_pFV );
                    //pF->state = cvStatModelPredict( m_pStatModel, &FVmat, NULL )<0.5;
                    pF->state = 1.f;
                }

                dx = (pF->blob.x - pF->BlobLast.x);
                dy = (pF->blob.y - pF->BlobLast.y);

                if(pF->BlobLast.x<0 || (dx*dx+dy*dy) >= 2*2)
                {   /* add feature vector to train data base */
                    pF->BlobLast = pF->blob;
                    cvSeqPush(pF->pFVSeq,pFV);
                }
            }/* process one blob */
        }/* next FV */

        for(i=m_Tracks.GetBlobNum();i>0;--i)
        {/* check each blob record */
            DefTrackSVM* pF = (DefTrackSVM*)m_Tracks.GetBlob(i-1);
            if(pF->LastFrame+3 < m_Frame )
            {/* retrain stat model and delete blob filter */
                int                 mult = 1+m_Dim;
                int                 old_height = m_pTrainData?m_pTrainData->height:0;
                int                 height = old_height + pF->pFVSeq->total*mult;
                CvMat*              pTrainData = cvCreateMat(height, m_Dim, CV_32F);
                int                 j;
                if(m_pTrainData && pTrainData)
                { /* create new train data matrix */
                    int h = pTrainData->height;
                    pTrainData->height = MIN(pTrainData->height, m_pTrainData->height);
                    cvCopy(m_pTrainData,pTrainData);
                    pTrainData->height = h;
                }
                for(j=0;j<pF->pFVSeq->total;++j)
                {/* copy new data to train data */
                    float*  pFVVar = m_pFVGen->GetFVVar();
                    float*  pFV = (float*)cvGetSeqElem(pF->pFVSeq,j);
                    int     k;
                    for(k=0;k<mult;++k)
                    {
                        int t;
                        float*  pTD = (float*)CV_MAT_ELEM_PTR( pTrainData[0], old_height+j*mult+k, 0);
                        memcpy(pTD,pFV,sizeof(float)*m_Dim);
                        
                        if(pFVVar)for(t=0;t<m_Dim;++t)
                        {/* scale FV */
                            pTD[t] /= pFVVar[t];
                        }

                        if(k>0)
                        {/* variate */
                            for(t=0;t<m_Dim;++t)
                            {
                                pTD[t] += m_RBFWidth*0.5f*(1-2.0f*rand()/(float)RAND_MAX);
                            }
                        }
                    }
                }/* next new data */

                if(m_pTrainData) cvReleaseMat(&m_pTrainData);
                m_pTrainData = pTrainData;

                /* delete track record */
                cvReleaseMemStorage(&pF->pMem);
                m_TrackNum++;
                m_Tracks.DelBlob(i-1);
            }/* end delete */
        }/* next track */

        /* retraind data each 1 minute if new data exist */
        if(m_Frame%(25*60) == 0 && m_pTrainData && m_pTrainData->rows > m_LastTrainDataSize)
        {
            RetrainStatModel();
        }

        m_Frame++;

        if(m_Wnd && m_Dim==2)
        {/* debug output */
            int         x,y;
            IplImage*   pI = cvCloneImage(pImg);

            if(m_pStatModel && m_pStatImg)
            for(y=0;y<pI->height;y+=2)
            {
                uchar*  pStatData = (uchar*)m_pStatImg->imageData + y*m_pStatImg->widthStep;
                uchar*  pData = (uchar*)pI->imageData + y*pI->widthStep;
                for(x=0;x<pI->width;x+=2)
                {/* draw all elements */
                    int d = pStatData[x];
                    d = (d<<8) | (d^0xff);
                    *(ushort*)(pData + x*3) = (ushort)d;
                }
            }/* next line */

            //cvNamedWindow("SVMMap",0);
            //cvShowImage("SVMMap", pI);
            cvReleaseImage(&pI);
        }/* debug output */
    };
    float GetState(int BlobID)
    {
        DefTrackSVM* pF = (DefTrackSVM*)m_Tracks.GetBlobByID(BlobID);
        return pF?pF->state:0.0f;
    };
    /* return 0 if trajectory is normal 
       return >0 if trajectory abnormal */
    virtual char*   GetStateDesc(int BlobID)
    {
        if(GetState(BlobID)>0.5) return "abnormal";
        return NULL;
    }
    virtual void    SetFileName(char* DataBaseName)
    {
        if(m_pTrainData)SaveStatModel();
        m_DataFileName[0] = 0;
        if(DataBaseName)
        {
            strncpy(m_DataFileName,DataBaseName,1000);
            strcat(m_DataFileName, ".yml");
        }
        LoadStatModel();
    };


    virtual void    Release(){ delete this; };

}; /* CvBlobTrackAnalysisSVM */


CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMP()
{return (CvBlobTrackAnalysis*) new CvBlobTrackAnalysisSVM(cvCreateFVGenP);}
CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPV()
{return (CvBlobTrackAnalysis*) new CvBlobTrackAnalysisSVM(cvCreateFVGenPV);}
CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMPVS()
{return (CvBlobTrackAnalysis*) new CvBlobTrackAnalysisSVM(cvCreateFVGenPVS);}
CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisSVMSS()
{return (CvBlobTrackAnalysis*) new CvBlobTrackAnalysisSVM(cvCreateFVGenSS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -