virtual void DelBlobByID(int BlobID) { DefBlobTracker* pBT = (DefBlobTracker*)m_BlobList.GetBlobByID(BlobID); pBT->pPredictor->Release(); delete pBT->pBlobHyp; m_BlobList.DelBlobByID(BlobID); };
virtual void DelBlobByID(int BlobID) { DefBlobTrackerCR* pBT = (DefBlobTrackerCR*)m_BlobList.GetBlobByID(BlobID); if(pBT->pResolver)pBT->pResolver->Release(); if(pBT->pPredictor)pBT->pPredictor->Release(); delete pBT->pBlobHyp; m_BlobList.DelBlobByID(BlobID); };
virtual void AddBlob(CvBlob* pBlob) { DefBlobFilter* pF = (DefBlobFilter*)m_BlobFilterList.GetBlobByID(CV_BLOB_ID(pBlob)); if(pF == NULL) { /* Create new filter: */ DefBlobFilter F; F.blob = pBlob[0]; F.m_LastFrame = m_Frame; F.pFilter = m_CreatePostProc(); TransferParamsToChild(F.pFilter,NULL); m_BlobFilterList.AddBlob((CvBlob*)&F); pF = (DefBlobFilter*)m_BlobFilterList.GetBlobByID(CV_BLOB_ID(pBlob)); } assert(pF); pF->blob = pBlob[0]; pF->m_LastFrame = m_Frame; };
virtual void AddBlob(CvBlob* pBlob) { DefTrackAnalyser* pF = (DefTrackAnalyser*)m_TrackAnalyserList.GetBlobByID(CV_BLOB_ID(pBlob)); if(pF == NULL) { /* Create new filter: */ DefTrackAnalyser F; F.state = 0; F.blob = pBlob[0]; F.m_LastFrame = m_Frame; F.pFilter = m_CreateAnalysis(); m_TrackAnalyserList.AddBlob((CvBlob*)&F); pF = (DefTrackAnalyser*)m_TrackAnalyserList.GetBlobByID(CV_BLOB_ID(pBlob)); } assert(pF); pF->blob = pBlob[0]; pF->m_LastFrame = m_Frame; };
void AddBlob(CvBlob* pBlob) { DefBlobTrack* pTrack = (DefBlobTrack*)m_TrackList.GetBlobByID(CV_BLOB_ID(pBlob)); if (pTrack == NULL) { /* Add new track: */ DefBlobTrack Track; Track.blob = pBlob[0]; Track.FrameBegin = m_Frame; Track.pSeq = new CvBlobSeq; Track.Saved = 0; m_TrackList.AddBlob((CvBlob*)&Track); pTrack = (DefBlobTrack*)m_TrackList.GetBlobByID(CV_BLOB_ID(pBlob)); } /* Add new track. */ assert(pTrack); pTrack->FrameLast = m_Frame; assert(pTrack->pSeq); pTrack->pSeq->AddBlob(pBlob); };
/*----------------- 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 LoadState(CvFileStorage* fs, CvFileNode* node) { int b,bN = cvReadIntByName(fs,node,"BlobNum",0); CvFileNode* pBlobListNode = cvGetFileNodeByName(fs,node,"BlobList"); if(!CV_NODE_IS_SEQ(pBlobListNode->tag)) return; bN = pBlobListNode->data.seq->total; for(b=0; b<bN; ++b) { DefBlobTrackerCR* pF = NULL; CvBlob Blob; CvFileNode* pSeqNode = NULL; CvFileNode* pBlobNode = (CvFileNode*)cvGetSeqElem(pBlobListNode->data.seq,b); assert(pBlobNode); Blob.ID = cvReadIntByName(fs,pBlobNode,"ID",0); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "Blob"); if(CV_NODE_IS_SEQ(pSeqNode->tag)) cvReadRawData( fs, pSeqNode, &Blob, "ffffi" ); AddBlob(&Blob,NULL,NULL); pF = (DefBlobTrackerCR*)m_BlobList.GetBlobByID(Blob.ID); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "BlobPredict"); if(CV_NODE_IS_SEQ(pSeqNode->tag)) cvReadRawData( fs, pSeqNode, &pF->BlobPredict, "ffffi" ); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "BlobPrev"); if(CV_NODE_IS_SEQ(pSeqNode->tag)) cvReadRawData( fs, pSeqNode, &pF->BlobPrev, "ffffi" ); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "BlobHyp"); if(pSeqNode) pF->pBlobHyp->Load(fs,pSeqNode); pF->Collision = cvReadIntByName(fs, pBlobNode,"Collision",pF->Collision); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "Predictor"); if(pSeqNode) pF->pPredictor->LoadState(fs,pSeqNode); pSeqNode = cvGetFileNodeByName(fs, pBlobNode, "Resolver"); if(pSeqNode) pF->pResolver->LoadState(fs,pSeqNode); } /* Read next blob. */ } /* CCwithCR LoadState */
void CvBlobTrackerAuto1::Process(IplImage* pImg, IplImage* pMask) { int CurBlobNum = 0; int i; IplImage* pFG = pMask; /* Bump frame counter: */ m_FrameCount++; if(m_TimesFile) { static int64 TickCount = cvGetTickCount(); static double TimeSum = 0; static int Count = 0; Count++; if(Count%100==0) { #ifndef WINCE time_t ltime; time( <ime ); char* stime = ctime( <ime ); #else /* WINCE does not have above POSIX functions (time,ctime) */ const char* stime = " wince "; #endif FILE* out = fopen(m_TimesFile,"at"); double Time; TickCount = cvGetTickCount()-TickCount; Time = TickCount/FREQ; if(out){fprintf(out,"- %sFrame: %d ALL_TIME - %f\n",stime,Count,Time/1000);fclose(out);} TimeSum = 0; TickCount = cvGetTickCount(); } } /* Update BG model: */ TIME_BEGIN() if(m_pFG) { /* If FG detector is needed: */ m_pFG->Process(pImg); pFG = m_pFG->GetMask(); } /* If FG detector is needed. */ TIME_END("FGDetector",-1) m_pFGMask = pFG; /* For external use. */ /*if(m_pFG && m_pFG->GetParam("DebugWnd") == 1) {// debug foreground result IplImage *pFG = m_pFG->GetMask(); if(pFG) { cvNamedWindow("FG",0); cvShowImage("FG", pFG); } }*/ /* Track blobs: */ TIME_BEGIN() if(m_pBT) { int i; m_pBT->Process(pImg, pFG); for(i=m_BlobList.GetBlobNum(); i>0; --i) { /* Update data of tracked blob list: */ CvBlob* pB = m_BlobList.GetBlob(i-1); int BlobID = CV_BLOB_ID(pB); int i = m_pBT->GetBlobIndexByID(BlobID); m_pBT->ProcessBlob(i, pB, pImg, pFG); pB->ID = BlobID; } CurBlobNum = m_pBT->GetBlobNum(); } TIME_END("BlobTracker",CurBlobNum) /* This part should be removed: */ if(m_BTReal && m_pBT) { /* Update blob list (detect new blob for real blob tracker): */ int i; for(i=m_pBT->GetBlobNum(); i>0; --i) { /* Update data of tracked blob list: */ CvBlob* pB = m_pBT->GetBlob(i-1); if(pB && m_BlobList.GetBlobByID(CV_BLOB_ID(pB)) == NULL ) { CvBlobTrackAuto NewB; NewB.blob = pB[0]; NewB.BadFrames = 0; m_BlobList.AddBlob((CvBlob*)&NewB); } } /* Next blob. */ /* Delete blobs: */ for(i=m_BlobList.GetBlobNum(); i>0; --i) { /* Update tracked-blob list: */ CvBlob* pB = m_BlobList.GetBlob(i-1); if(pB && m_pBT->GetBlobByID(CV_BLOB_ID(pB)) == NULL ) { m_BlobList.DelBlob(i-1); } } /* Next blob. */ } /* Update bloblist. */ TIME_BEGIN() if(m_pBTPostProc) { /* Post-processing module: */ int i; for(i=m_BlobList.GetBlobNum(); i>0; --i) { /* Update tracked-blob list: */ CvBlob* pB = m_BlobList.GetBlob(i-1); m_pBTPostProc->AddBlob(pB); } m_pBTPostProc->Process(); for(i=m_BlobList.GetBlobNum(); i>0; --i) { /* Update tracked-blob list: */ CvBlob* pB = m_BlobList.GetBlob(i-1); int BlobID = CV_BLOB_ID(pB); CvBlob* pBN = m_pBTPostProc->GetBlobByID(BlobID); if(pBN && m_UsePPData && pBN->w >= CV_BLOB_MINW && pBN->h >= CV_BLOB_MINH) { /* Set new data for tracker: */ m_pBT->SetBlobByID(BlobID, pBN ); } if(pBN) { /* Update blob list with results from postprocessing: */ pB[0] = pBN[0]; } } } /* Post-processing module. */ TIME_END("PostProcessing",CurBlobNum) /* Blob deleter (experimental and simple): */ TIME_BEGIN() if(pFG) { /* Blob deleter: */ int i; if(!m_BTReal)for(i=m_BlobList.GetBlobNum();i>0;--i) { /* Check all blobs on list: */ CvBlobTrackAuto* pB = (CvBlobTrackAuto*)(m_BlobList.GetBlob(i-1)); int Good = 0; int w=pFG->width; int h=pFG->height; CvRect r = CV_BLOB_RECT(pB); CvMat mat; double aver = 0; double area = CV_BLOB_WX(pB)*CV_BLOB_WY(pB); if(r.x < 0){r.width += r.x;r.x = 0;} if(r.y < 0){r.height += r.y;r.y = 0;} if(r.x+r.width>=w){r.width = w-r.x-1;} if(r.y+r.height>=h){r.height = h-r.y-1;} if(r.width > 4 && r.height > 4 && r.x < w && r.y < h && r.x >=0 && r.y >=0 && r.x+r.width < w && r.y+r.height < h && area > 0) { aver = cvSum(cvGetSubRect(pFG,&mat,r)).val[0] / area; /* if mask in blob area exists then its blob OK*/ if(aver > 0.1*255)Good = 1; } else { pB->BadFrames+=2; } if(Good) { pB->BadFrames = 0; } else { pB->BadFrames++; } } /* Next blob: */ /* Check error count: */ for(i=0; i<m_BlobList.GetBlobNum(); ++i) { CvBlobTrackAuto* pB = (CvBlobTrackAuto*)m_BlobList.GetBlob(i); if(pB->BadFrames>3) { /* Delete such objects */ /* from tracker... */ m_pBT->DelBlobByID(CV_BLOB_ID(pB)); /* ... and from local list: */ m_BlobList.DelBlob(i); i--; } } /* Check error count for next blob. */ } /* Blob deleter. */ TIME_END("BlobDeleter",m_BlobList.GetBlobNum()) /* Update blobs: */ TIME_BEGIN() if(m_pBT) m_pBT->Update(pImg, pFG); TIME_END("BlobTrackerUpdate",CurBlobNum) /* Detect new blob: */ TIME_BEGIN() if(!m_BTReal && m_pBD && pFG && (m_FrameCount > m_FGTrainFrames) ) { /* Detect new blob: */ static CvBlobSeq NewBlobList; CvBlobTrackAuto NewB; NewBlobList.Clear(); if(m_pBD->DetectNewBlob(pImg, pFG, &NewBlobList, &m_BlobList)) { /* Add new blob to tracker and blob list: */ int i; IplImage* pMask = pFG; /*if(0)if(NewBlobList.GetBlobNum()>0 && pFG ) {// erode FG mask (only for FG_0 and MS1||MS2) pMask = cvCloneImage(pFG); cvErode(pFG,pMask,NULL,2); }*/ for(i=0; i<NewBlobList.GetBlobNum(); ++i) { CvBlob* pBN = NewBlobList.GetBlob(i); pBN->ID = m_NextBlobID; if(pBN && pBN->w >= CV_BLOB_MINW && pBN->h >= CV_BLOB_MINH) { CvBlob* pB = m_pBT->AddBlob(pBN, pImg, pMask ); if(pB) { NewB.blob = pB[0]; NewB.BadFrames = 0; m_BlobList.AddBlob((CvBlob*)&NewB); m_NextBlobID++; } } } /* Add next blob from list of detected blob. */ if(pMask != pFG) cvReleaseImage(&pMask); } /* Create and add new blobs and trackers. */ } /* Detect new blob. */ TIME_END("BlobDetector",-1) TIME_BEGIN() if(m_pBTGen) { /* Run track generator: */ for(i=m_BlobList.GetBlobNum(); i>0; --i) { /* Update data of tracked blob list: */ CvBlob* pB = m_BlobList.GetBlob(i-1); m_pBTGen->AddBlob(pB); } m_pBTGen->Process(pImg, pFG); } /* Run track generator: */ TIME_END("TrajectoryGeneration",-1) TIME_BEGIN() if(m_pBTA) { /* Trajectory analysis module: */ int i; for(i=m_BlobList.GetBlobNum(); i>0; i--) m_pBTA->AddBlob(m_BlobList.GetBlob(i-1)); m_pBTA->Process(pImg, pFG); } /* Trajectory analysis module. */ TIME_END("TrackAnalysis",m_BlobList.GetBlobNum()) } /* CvBlobTrackerAuto1::Process */
virtual CvBlob* GetBlobByID(int BlobID){return m_BlobList.GetBlobByID(BlobID);};
float GetState(int BlobID) { DefTrackForDist* pF = (DefTrackForDist*)m_Tracks.GetBlobByID(BlobID); return pF ? pF->state : 0.0f; };
/* Additional functionality: */ CvBlob* GetBlobByID(int BlobID){return m_BlobFilterList.GetBlobByID(BlobID);}
float GetState(int BlobID) { DefTrackAnalyser* pF = (DefTrackAnalyser*)m_TrackAnalyserList.GetBlobByID(BlobID); return pF?pF->state:0.f; };