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

📄 blobtrackanalysistrackdist.cpp

📁 Program use openCV to demo edge detection (algorithm Gradient).
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        m_pDebugAVIName = NULL;
        AddParam("DebugAVI",&m_pDebugAVIName);
        CommentParam("DebugAVI","Name of AVI file to save images from debug window");

        m_TraceLen = 50;
        AddParam("TraceLen",&m_TraceLen);
        CommentParam("TraceLen","Length (in frames) of trajectory part that is used for comparison");
        
        m_AbnormalThreshold = 0.02f;
        AddParam("AbnormalThreshold",&m_AbnormalThreshold);
        CommentParam("AbnormalThreshold","If trajectory is equal with less then <AbnormalThreshold*DataBaseTrackNum> tracks then trajectory is abnormal");

        m_PosThreshold = 1.25;
        AddParam("PosThreshold",&m_PosThreshold);
        CommentParam("PosThreshold","Minimal allowd distance in blob width that is allowed");

        m_VelThreshold = 0.5;
        AddParam("VelThreshold",&m_VelThreshold);
        CommentParam("VelThreshold","Minimal allowed relative difference between blob speed");

    }/* constructor */
    ~CvBlobTrackAnalysisTrackDist()
    {
        int i;
        for(i=m_Tracks.GetBlobNum();i>0;--i)
        {
            DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlob(i-1);
            delete pF->pTrack;
        }
        if(m_pDebugImg) cvReleaseImage(&m_pDebugImg);
        //if(m_pDebugAVI) cvReleaseVideoWriter(&m_pDebugAVI);
    }/* destructor */

    /*-----------------  interface --------------------*/
    virtual void    AddBlob(CvBlob* pBlob)
    {
        DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlobByID(CV_BLOB_ID(pBlob));
        if(pF == NULL)
        { /* create new TRack record */
            DefTrackForDist F;
            F.state = 0;
            F.blob = pBlob[0];
            F.LastFrame = m_Frame;
            F.pTrack = new DefTrackRec(CV_BLOB_ID(pBlob));
            m_Tracks.AddBlob((CvBlob*)&F);
            pF = (DefTrackForDist*)m_Tracks.GetBlobByID(CV_BLOB_ID(pBlob));
        }

        assert(pF);
        assert(pF->pTrack);
        pF->pTrack->AddPoint(pBlob->x,pBlob->y,pBlob->w*0.5f);
        pF->blob = pBlob[0];
        pF->LastFrame = m_Frame;
    };
    virtual void Process(IplImage* pImg, IplImage* /*pFG*/)
    {
        int i;
        double          MinTv = pImg->width/1440.0; /* minimal threshold for speed difference */
        double          MinTv2 = MinTv*MinTv;
        for(i=m_Tracks.GetBlobNum();i>0;--i)
        {
            DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlob(i-1);
            pF->state = 0;
            if(pF->LastFrame == m_Frame || pF->LastFrame+1 == m_Frame)
            {/* process one blob trajectory */
                int NumEq = 0;
                int it;
                for(it=m_TrackDataBase.GetBlobNum();it>0;--it)
                {/* check template */
                    DefTrackForDist*   pFT = (DefTrackForDist*)m_TrackDataBase.GetBlob(it-1);
                    int         Num = pF->pTrack->GetPointNum();
                    int         NumT = pFT->pTrack->GetPointNum();
                    int*        pPairIdx = (int*)ReallocTempData(sizeof(int)*2*(Num+NumT)+sizeof(DefMatch)*Num*NumT);
                    void*       pTmpData = pPairIdx+2*(Num+NumT);
                    int         PairNum = 0;
                    int         k;
                    int         Equal = 1;
                    int         UseVel = 0;
                    int         UsePos = 0;

                    if(i==it) continue;
                    
                    /* match track */
                    PairNum = cvTrackMatch( pF->pTrack, m_TraceLen, pFT->pTrack, pPairIdx, pTmpData );
                    Equal = MAX(1,cvRound(PairNum*0.1));

                    UseVel = 3*pF->pTrack->GetPointNum() > m_TraceLen;
                    UsePos = 10*pF->pTrack->GetPointNum() > m_TraceLen;

                    { /* check continues */
                        float   D;
                        int     DI = pPairIdx[0*2+0]-pPairIdx[(PairNum-1)*2+0];
                        int     DIt = pPairIdx[0*2+1]-pPairIdx[(PairNum-1)*2+1];
                        if(UseVel && DI != 0)
                        {
                            D = (float)(DI-DIt)/(float)DI;
                            if(fabs(D)>m_VelThreshold)Equal=0;
                            if(fabs(D)>m_VelThreshold*0.5)Equal/=2;
                        }
                    }/* check continues */

                    for(k=0;Equal>0 && k<PairNum;++k)
                    {/* compare with threshold */
                        int             j = pPairIdx[k*2+0];
                        int             jt = pPairIdx[k*2+1];
                        DefTrackPoint*  pB = pF->pTrack->GetPoint(j);
                        DefTrackPoint*  pBT = pFT->pTrack->GetPoint(jt);
                        double          dx = pB->x-pBT->x;
                        double          dy = pB->y-pBT->y;
                        double          dvx = pB->vx - pBT->vx;
                        double          dvy = pB->vy - pBT->vy;
                        //double          dv = pB->v - pBT->v;
                        double          D = dx*dx+dy*dy;
                        double          Td = pBT->r*m_PosThreshold;
                        double          dv2 = dvx*dvx+dvy*dvy;
                        double          Tv2 = (pBT->vx*pBT->vx+pBT->vy*pBT->vy)*m_VelThreshold*m_VelThreshold;
                        double          Tvm = pBT->v*m_VelThreshold;

                        
                        if(Tv2 < MinTv2) Tv2 = MinTv2;
                        if(Tvm < MinTv) Tvm = MinTv;

                        /* check trajectory position */
                        if(UsePos && D > Td*Td)
                        {
                            Equal--;
                        }
                        else
                        /* check trajectory velacity */
                        /* don't consider tails of trajectory becasue its unnstable for velosity calculation */
                        if(UseVel && j>5 && jt>5 && dv2 > Tv2 )
                        {
                            Equal--;
                        }
                    }/* compare with threshold */

                    if(Equal>0)
                    {
                        NumEq++;
                        pFT->close++;
                    }
                }/* next template */

                { /* calc state */
                    float   T = m_TrackDataBase.GetBlobNum() * m_AbnormalThreshold; /* calc threshold */

                    if(T>0)
                    {
                        pF->state = (T - NumEq)/(T*0.2f) + 0.5f;
                    }
                    if(pF->state<0)pF->state=0;
                    if(pF->state>1)pF->state=1;
                    
                    /*if(0)if(pF->state>0)
                    {// if abnormal blob
                        printf("Abnormal blob(%d) %d < %f, state=%f\n",CV_BLOB_ID(pF),NumEq,T, pF->state);
                    }*/
                }/* calc state */
            }/* process one blob trajectory */
            else
            {/* move track to trcaks data base */
                m_TrackDataBase.AddBlob((CvBlob*)pF);
                m_Tracks.DelBlob(i-1);
            }
        }/* next blob */


        if(m_Wnd)
        {/* debug output */
            int i;

            if(m_pDebugImg==NULL) 
                m_pDebugImg = cvCloneImage(pImg);
            else 
                cvCopyImage(pImg, m_pDebugImg);

            for(i=m_TrackDataBase.GetBlobNum();i>0;--i)
            {/* draw all elements from trackdata base  */
                int         j;
                DefTrackForDist*   pF = (DefTrackForDist*)m_TrackDataBase.GetBlob(i-1);
                CvScalar    color = CV_RGB(0,0,0);
                if(!pF->close) continue;
                if(pF->close) 
                {
                    color = CV_RGB(0,0,255);
                }
                else
                {
                    color = CV_RGB(0,0,128);
                }

                for(j=pF->pTrack->GetPointNum();j>0;j--)
                {
                    DefTrackPoint* pB = pF->pTrack->GetPoint(j-1);
                    int r = 0;//MAX(cvRound(pB->r),1);
                    cvCircle(m_pDebugImg, cvPoint(cvRound(pB->x),cvRound(pB->y)), r, color);
                }
                pF->close = 0;
            }/* draw all elements from trackdata base  */

            for(i=m_Tracks.GetBlobNum();i>0;--i)
            {/* draw all elements for all trajectories */
                DefTrackForDist*    pF = (DefTrackForDist*)m_Tracks.GetBlob(i-1);
                int                 j;
                int                 c = cvRound(pF->state*255);
                CvScalar            color = CV_RGB(c,255-c,0);
                CvPoint             p = cvPointFrom32f(CV_BLOB_CENTER(pF));
                int                 x = cvRound(CV_BLOB_RX(pF)), y = cvRound(CV_BLOB_RY(pF));
                CvSize              s = cvSize(MAX(1,x), MAX(1,y));
                
                cvEllipse( m_pDebugImg, 
                    p,
                    s,
                    0, 0, 360, 
                    CV_RGB(c,255-c,0), cvRound(1+(0*c)/255) );

                for(j=pF->pTrack->GetPointNum();j>0;j--)
                {
                    DefTrackPoint* pB = pF->pTrack->GetPoint(j-1);
                    if(pF->pTrack->GetPointNum()-j > m_TraceLen) break;
                    cvCircle(m_pDebugImg, cvPoint(cvRound(pB->x),cvRound(pB->y)), 0, color);
                }
                pF->close = 0;
            }/* draw all elements for all trajectories */
            
            //cvNamedWindow("Tracks",0);
            //cvShowImage("Tracks", m_pDebugImg);
        }/* debug output */

#if 0        
        if(m_pDebugImg && m_pDebugAVIName)
        {
            if(m_pDebugAVI==NULL)
            {/* create avi file for writing */
                m_pDebugAVI = cvCreateVideoWriter( 
                    m_pDebugAVIName, 
                    CV_FOURCC('x','v','i','d'), 
                    25, 
                    cvSize(m_pDebugImg->width,m_pDebugImg->height));
                if(m_pDebugAVI == NULL)
                {
                    printf("WARNING!!! Can not create AVI file %s for writing\n",m_pDebugAVIName);
                }
            }/* create avi file for writing */
            if(m_pDebugAVI)cvWriteFrame( m_pDebugAVI, m_pDebugImg );
        }/* write debug window to AVI file */
#endif
        m_Frame++;
    };
    float GetState(int BlobID)
    {
        DefTrackForDist* pF = (DefTrackForDist*)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)
    {
        m_DataFileName[0] = 0;
        if(DataBaseName)
        {
            strncpy(m_DataFileName,DataBaseName,1000);
            strcat(m_DataFileName, ".yml");
        }
    };

    virtual void    Release(){ delete this; };

};



CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisTrackDist()
{return (CvBlobTrackAnalysis*) new CvBlobTrackAnalysisTrackDist;}

⌨️ 快捷键说明

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