From 59f29a066516d449ab2081d4ae8b8273366d904b Mon Sep 17 00:00:00 2001 From: "Kilic, Deniz" <d.kilic@fz-juelich.de> Date: Mon, 14 Jun 2021 16:20:34 +0200 Subject: [PATCH] Retrack iff path leading to current TP is better --- src/tracker.cpp | 57 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/src/tracker.cpp b/src/tracker.cpp index 72d19c1ff..baba88987 100644 --- a/src/tracker.cpp +++ b/src/tracker.cpp @@ -1157,26 +1157,49 @@ size_t Tracker::calcPrevFeaturePoints(int prevFrame, cv::Rect &rect, int frame, { for (int i = 0; i < size(); ++i) { - if (((onlyVisible.empty()) || (onlyVisible.contains(i))) && - at(i).trackPointExist(prevFrame) && - ((reTrack && at(i).trackPointExist(frame) && at(i).trackPointAt(frame).qual() < reQual) || - !at(i).trackPointExist(frame))) - { - cv::Point2f p2f(at(i).at(prevFrame-at(i).firstFrame()).x()+borderSize, - at(i).at(prevFrame-at(i).firstFrame()).y()+borderSize); - if(rect.contains(p2f)) - { - mPrevFeaturePoints.push_back(p2f); - ++j; + if(!((onlyVisible.empty()) || (onlyVisible.contains(i)))){ + continue; + } + if(!at(i).trackPointExist(prevFrame)){ + continue; + } - mPrevFeaturePointsIdx.push_back(i); - if (j > MAX_COUNT-2) - { - debout << "Warning: reached maximal number of tracking point: " << MAX_COUNT << std::endl; - break; // for loop - } + /* + * For retracking to occur, every point in the path from the last + * recognized point to this point should have been tracked with higher qual. + * This should eliminate cases in which wrong points are tracked confidently + * and replace better ones, under the assumption we only get to a wrong point + * due to a low-quality tracking earlier. + */ + bool applyReTrack = true; + int dir = (frame - prevFrame); // direction of tracking - forward/backwards + dir /= std::abs(dir); // theoretically possible to omit MAX_STEP_TRACK frames + constexpr int minQualReco = 90; + for(int j = 0; + at(i).trackPointExist(frame + j*dir) && at(i).trackPointAt(frame + j*dir).qual() < minQualReco; + ++j){ + if(at(i).trackPointAt(frame + j*dir).qual() < reQual){ + applyReTrack = false; } } + if( !(applyReTrack || !at(i).trackPointExist(frame)) ){ + continue; + } + + cv::Point2f p2f(at(i).at(prevFrame-at(i).firstFrame()).x()+borderSize, + at(i).at(prevFrame-at(i).firstFrame()).y()+borderSize); + if(rect.contains(p2f)) + { + mPrevFeaturePoints.push_back(p2f); + ++j; + + mPrevFeaturePointsIdx.push_back(i); + if (j > MAX_COUNT-2) + { + debout << "Warning: reached maximal number of tracking point: " << MAX_COUNT << std::endl; + break; // for loop + } + } } } -- GitLab