inline size_t trackFeatures_deleteOOB_impl_simple_feat( FEATLIST &trackedFeats, const size_t img_width, const size_t img_height, const int MIN_DIST_MARGIN_TO_STOP_TRACKING) { if (trackedFeats.empty()) return 0; std::vector<size_t> survival_idxs; const size_t N = trackedFeats.size(); // 1st: Build list of survival indexes: survival_idxs.reserve(N); for (size_t i=0;i<N;i++) { const typename FEATLIST::feature_t &ft = trackedFeats[i]; const TFeatureTrackStatus status = ft.track_status; bool eras = (status_TRACKED!=status && status_IDLE!=status); if (!eras) { // Also, check if it's too close to the image border: const int x= ft.pt.x; const int y= ft.pt.y; if (x<MIN_DIST_MARGIN_TO_STOP_TRACKING || y<MIN_DIST_MARGIN_TO_STOP_TRACKING || x>static_cast<int>(img_width-MIN_DIST_MARGIN_TO_STOP_TRACKING) || y>static_cast<int>(img_height-MIN_DIST_MARGIN_TO_STOP_TRACKING)) { eras = true; } } if (!eras) survival_idxs.push_back(i); } // 2nd: Build updated list: const size_t N2 = survival_idxs.size(); const size_t n_removed = N-N2; for (size_t i=0;i<N2;i++) { if (survival_idxs[i]!=i) trackedFeats[i] = trackedFeats[ survival_idxs[i] ]; } trackedFeats.resize(N2); return n_removed; } // end of trackFeatures_deleteOOB