void TLD::selectObject(const Mat &img, Rect *bb) { //Delete old object detectorCascade->release(); detectorCascade->objWidth = bb->width; detectorCascade->objHeight = bb->height; //Init detector cascade detectorCascade->init(); currImg = img; if(currBB) { delete currBB; currBB = NULL; } currBB = tldCopyRect(bb); currConf = 1; valid = true; initialLearning(); }
void TLD::selectObject(const Mat &img, Rect *bb) { //Delete old object detectorCascade->release(); detectorCascade->objWidth = bb->width; detectorCascade->objHeight = bb->height; //Init detector cascade detectorCascade->init(); #ifdef USE_HTLD if(hTLDMaster->getNumOfObjects() > 0) hTLDMaster->destroyTLDObject(tldObjId); FAST_DET_INIT_PARAMS* fdi = detectorCascade->createFastDetInitStr(); FAST_TR_INIT_PARAMS* fti = medianFlowTracker->createFastTrInitStr(); tldObjId = hTLDMaster->createTLDObject(fti, fdi); free((void*)fdi); #endif currImg = img; if(currBB) { delete currBB; currBB = NULL; } currBB = tldCopyRect(bb); currConf = 1; valid = true; initialLearning(); }
void TLD::fuseHypotheses() { Rect* trackerBB = medianFlowTracker->trackerBB; int numClusters = detectorCascade->detectionResult->numClusters; Rect* detectorBB = detectorCascade->detectionResult->detectorBB; currBB = NULL; currConf = 0; valid = false; float confDetector = 0; if(numClusters == 1) { confDetector = nnClassifier->classifyBB(currImg, detectorBB); } if(trackerBB != NULL) { float confTracker = nnClassifier->classifyBB(currImg, trackerBB); if(numClusters == 1 && confDetector > confTracker && tldOverlapRectRect(*trackerBB, *detectorBB) < 0.5) { currBB = tldCopyRect(detectorBB); currConf = confDetector; } else { currBB = tldCopyRect(trackerBB); currConf = confTracker; if(confTracker > nnClassifier->thetaTP) { valid = true; } else if(wasValid && confTracker > nnClassifier->thetaFP) { valid = true; } } } else if(numClusters == 1) { currBB = tldCopyRect(detectorBB); currConf = confDetector; } /* float var = CalculateVariance(patch.values, nn->patch_size*nn->patch_size); if(var < min_var) { //TODO: Think about incorporating this printf("%f, %f: Variance too low \n", var, classifier->min_var); valid = 0; }*/ }
void TLD::fuseHypotheses(const Mat& colorImg) { int numClusters = detectorCascade->detectionResult->numClusters; Rect* detectorBB = detectorCascade->detectionResult->detectorBB; deleteCurrentBB(); currConf = 0; valid = false; if (!detectorEnabled) { if (!isTrackerValid) { return; } currBB = tldCopyRect(&trackerBB); valid = true; return; } float confDetector = 0; if (numClusters == 1) { confDetector = nnClassifier->classifyBB(currImg, detectorBB); } if (isTrackerValid) { float confTracker = nnClassifier->classifyBB(currImg, &trackerBB); currBB = tldCopyRect(&trackerBB); valid = true; currConf = confTracker; } else if (numClusters == 1) { // reinit tracker if (trackerEnabled) { if (tracker->updateAt(colorImg, *detectorBB)) { currConf = nnClassifier->classifyBB(currImg, detectorBB); currBB = tldCopyRect(detectorBB); valid = true; runTracker = true; } else { deleteCurrentBB(); currConf = 0; valid = false; } } } }
void TLD::selectObject(const Mat& img, Rect* bb) { if (!tracker) { return; } if (!rng) { std::random_device rd; std::shared_ptr<std::mt19937> g(new std::mt19937(rd())); g->seed((unsigned long)seed); rng = g; } rng->seed((unsigned long)seed); Mat grayFrame; cvtColor(img, grayFrame, CV_BGR2GRAY); // initialize the image dimensions once if (!hasImageDimensions) { detectorCascade->imgWidth = grayFrame.cols; detectorCascade->imgHeight = grayFrame.rows; detectorCascade->imgWidthStep = static_cast<int>(grayFrame.step); } runTracker = true; //Delete old object detectorCascade->release(); detectorCascade->objWidth = bb->width; detectorCascade->objHeight = bb->height; if (bb->height < detectorCascade->minSize) { detectorCascade->minSize = bb->height; } if (bb->width < detectorCascade->minSize) { detectorCascade->minSize = bb->width; } //Init detector cascade detectorCascade->init(rng); tracker->reinit(img, *bb); currImg = grayFrame; deleteCurrentBB(); currBB = tldCopyRect(bb); currConf = 1; valid = true; initialLearning(); }