#pragma once #include #include #include #include #include #include namespace byte_track { class BYTETracker { public: using STrackPtr = std::shared_ptr; BYTETracker(const int& frame_rate = 30, const int& track_buffer = 30, const float& track_thresh = 0.5, const float& high_thresh = 0.6, const float& match_thresh = 0.8); ~BYTETracker(); std::vector update(const std::vector& objects); inline void set_thresh_values(float track_thresh, float high_thresh, float match_thresh) { this->track_thresh_ = track_thresh; this->high_thresh_ = high_thresh; this->match_thresh_ = match_thresh; } private: std::vector jointStracks(const std::vector &a_tlist, const std::vector &b_tlist) const; std::vector subStracks(const std::vector &a_tlist, const std::vector &b_tlist) const; void removeDuplicateStracks(const std::vector &a_stracks, const std::vector &b_stracks, std::vector &a_res, std::vector &b_res) const; void linearAssignment(const std::vector> &cost_matrix, const int &cost_matrix_size, const int &cost_matrix_size_size, const float &thresh, std::vector> &matches, std::vector &b_unmatched, std::vector &a_unmatched) const; std::vector> calcIouDistance(const std::vector &a_tracks, const std::vector &b_tracks) const; std::vector> calcIous(const std::vector> &a_rect, const std::vector> &b_rect) const; double execLapjv(const std::vector > &cost, std::vector &rowsol, std::vector &colsol, bool extend_cost = false, float cost_limit = LONG_MAX, bool return_cost = true) const; private: float track_thresh_; float high_thresh_; float match_thresh_; const size_t max_time_lost_; size_t frame_id_; size_t track_id_count_; std::vector tracked_stracks_; std::vector lost_stracks_; std::vector removed_stracks_; }; }