void Multi2DHistogramAgent::operator() (const double val1, const double val2, const double val3) { if (val1 < min) return; else if (val1 > max) return; Histogram2DAgent* histo = FindHistogram(val1); histo->operator() (val2,val3); return; }
// Mean-shift iteration void CObjectTracker::FindNextLocation(UBYTE8 *frame) { UBYTE8 iteration = 0; FLOAT32 *currentHistogram = new FLOAT32[HISTOGRAM_LENGTH]; for (iteration=0; iteration<MEANSHIFT_ITARATION_NO; iteration++) { FindHistogram(frame,currentHistogram); //current frame histogram FindWightsAndCOM(frame,currentHistogram);//derive weights and new location //FindHistogram(frame,currentHistogram); //uptade histogram //UpdateInitialHistogram(currentHistogram);//uptade initial histogram } delete[] currentHistogram, currentHistogram = 0; }
void CObjectTracker::ObjeckTrackerHandlerByUser(UBYTE8 *frame) { m_cActiveObject = 0; if (m_sTrackingObjectTable[m_cActiveObject].Status) { if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject) { FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram); m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true; } else { FindNextLocation(frame); DrawObjectBox(frame); } } }
//进行一次跟踪 void CObjectTracker::ObjeckTrackerHandlerByUser(IplImage *frame) { m_cActiveObject = 0; if (m_sTrackingObjectTable[m_cActiveObject].Status) { if (!m_sTrackingObjectTable[m_cActiveObject].assignedAnObject) { //计算目标的初始直方图 FindHistogram(frame,m_sTrackingObjectTable[m_cActiveObject].initHistogram); m_sTrackingObjectTable[m_cActiveObject].assignedAnObject = true; } else { //在图像上搜索目标 FindNextLocation(frame); DrawObjectBox(frame); } } }
void CObjectTracker::FindNextFixScale(IplImage *frame) { UBYTE8 iteration = 0; SINT16 optX, optY; FLOAT32 *currentHistogram = new FLOAT32[HISTOGRAM_LENGTH]; FLOAT32 dist, optdist=1.0; for (iteration=0; iteration<MEANSHIFT_ITARATION_NO; iteration++) { FindHistogram(frame,currentHistogram); //current frame histogram, use the last frame location as starting point FindWightsAndCOM(frame,currentHistogram);//derive weights and new location //FindHistogram(frame,currentHistogram); //uptade histogram //UpdateInitialHistogram(currentHistogram);//uptade initial histogram if( ((dist=FindDistance(currentHistogram)) < optdist) || iteration==0 ) { optdist=dist; optX=m_sTrackingObjectTable[m_cActiveObject].X; optY=m_sTrackingObjectTable[m_cActiveObject].Y; // printf("%f->", dist); } else //bad iteration, then find a better start point for next iteration { m_sTrackingObjectTable[m_cActiveObject].X=(m_sTrackingObjectTable[m_cActiveObject].X+optX)/2; m_sTrackingObjectTable[m_cActiveObject].Y=(m_sTrackingObjectTable[m_cActiveObject].Y+optY)/2; } }//end for m_sTrackingObjectTable[m_cActiveObject].X=optX; m_sTrackingObjectTable[m_cActiveObject].Y=optY; LastDist=optdist; //the latest distance // printf("/n"); delete[] currentHistogram, currentHistogram = 0; }