virtual double GetConfidence(int BlobIndex, CvBlob* pBlob, IplImage* /*pImg*/, IplImage* pImgFG = NULL) { /* Define coefficients in exp by exp(-XT*K)=VT: */ static double _KS = -log(0.1)/pow(0.5,2); /* XT = 1, VT = 0.1 - when size is Larger in 2 times Confidence is smoller in 10 times */ static double _KP = -log(0.1)/pow(m_pImg->width*0.02,2); /* XT = 0.02*ImgWidth, VT = 0.1*/ DefBlobTracker* pBT = (DefBlobTracker*)m_BlobList.GetBlob(BlobIndex); float dx,dy,dw,dh; float dp2,ds2; double W = 1; CvBlob* pBC = GetNearestBlob(pBlob); if(pBC == NULL ) return 0; dx = pBC->x-pBlob->x; dy = pBC->y-pBlob->y; dw = (pBC->w-pBlob->w)/pBC->w; dh = (pBC->h-pBlob->h)/pBC->h; dp2 = dx*dx+dy*dy; ds2 = dw*dw+dh*dh; if(!pBT->Collision) { /* Confidence for size by nearest blob: */ W*=exp(-_KS*ds2); } if(m_ConfidenceType==0 && !pBT->Collision) { /* Confidence by nearest blob: */ W*=exp(-_KP*dp2); } if(m_ConfidenceType==1 && pBT->AverFG>0) { /* Calculate sum of mask: */ float Aver = CalcAverageMask(pBlob, pImgFG ); if(Aver < pBT->AverFG) { float diff = 1+0.9f*(Aver-pBT->AverFG)/pBT->AverFG; if(diff < 0.1f) diff = 0.1f; W *= diff; } } /* Calculate sum of mask. */ if(m_ConfidenceType==2) { /* Calculate BCoeff: */ float S = 0.2f; float Aver = CalcAverageMask(pBlob, pImgFG ); double B = sqrt(Aver*pBT->AverFG)+sqrt((1-Aver)*(1-pBT->AverFG)); W *= exp((B-1)/(2*S)); } /* Calculate sum of mask. */ return W; };
virtual void ProcessBlob(int BlobIndex, CvBlob* pBlob, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL) {/*输入是 已跟踪目标的index 和目标的团块 如果不考虑碰撞, 在新前景团块链表总 找最近的,更新 考虑碰撞: 团块位置= 预测值 */ //pBlob 是 外界目标Id对应的团块 BlobIndex是他的INdex //pB是内部cc类 自己的目标团块 //pBT是 内部团块的特殊表示 int ID = pBlob->ID; CvBlob* pB = m_BlobList.GetBlob(BlobIndex); DefBlobTrackerColorTracker* pBT = (DefBlobTrackerColorTracker*)pB; //CvBlob* pBBest = NULL; //double DistBest = -1; int BlobID; if (pB == NULL) return; BlobID = pB->ID;//看看ID 同不同? //对于考虑碰撞的,并且团块发生了碰撞 。 团块位置=团块的预测位置 if (m_Collision && pBT->Collision) { /* Tracking in collision: */ pB[0] = pBT->BlobPredict;//将预测的值赋值到团块的位置 CV_BLOB_ID(pB) = BlobID; } /* Tracking in collision. */ else { /* Non-collision tracking: */ CvBlob* pBBest = GetNearestBlob(pB);//用PB和新团块比较 ,获得最近的团块 if (pBBest) { float w = pBlob->w*(1 - m_AlphaSize) + m_AlphaSize*pBBest->w; float h = pBlob->h*(1 - m_AlphaSize) + m_AlphaSize*pBBest->h; float x = pBlob->x*(1 - m_AlphaPos) + m_AlphaPos*pBBest->x; float y = pBlob->y*(1 - m_AlphaPos) + m_AlphaPos*pBBest->y; //按比例更新 目标团块的大小和位置 pB->w = w; pB->h = h; pB->x = x; pB->y = y; CV_BLOB_ID(pB) = BlobID; }//这种最近邻匹配只能处理没有碰撞的目标跟踪 } /* Non-collision tracking. */ pBlob[0] = pB[0]; pBlob->ID = ID; };
virtual void ProcessBlob(int BlobIndex, CvBlob* pBlob, IplImage* /*pImg*/, IplImage* /*pImgFG*/ = NULL) { int ID = pBlob->ID; CvBlob* pB = m_BlobList.GetBlob(BlobIndex); DefBlobTracker* pBT = (DefBlobTracker*)pB; //CvBlob* pBBest = NULL; //double DistBest = -1; int BlobID; if(pB==NULL) return; BlobID = pB->ID; if(m_Collision && pBT->Collision) { /* Tracking in collision: */ pB[0]=pBT->BlobPredict; CV_BLOB_ID(pB)=BlobID; } /* Tracking in collision. */ else { /* Non-collision tracking: */ CvBlob* pBBest = GetNearestBlob(pB); if(pBBest) { float w = pBlob->w*(1-m_AlphaSize)+m_AlphaSize*pBBest->w; float h = pBlob->h*(1-m_AlphaSize)+m_AlphaSize*pBBest->h; float x = pBlob->x*(1-m_AlphaPos)+m_AlphaPos*pBBest->x; float y = pBlob->y*(1-m_AlphaPos)+m_AlphaPos*pBBest->y; pB->w = w; pB->h = h; pB->x = x; pB->y = y; CV_BLOB_ID(pB) = BlobID; } } /* Non-collision tracking. */ pBlob[0] = pB[0]; pBlob->ID = ID; };