#pragma once #include "STrack.h" #include "lapjv.h" #include "Object.h" #include #include #include #include #include #include namespace ByteTrack { 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); void update_parameters(int frameRate = 30, int trackBuffer = 30, double trackThreshold = 0.5, double highThreshold = 0.6, double matchThresold = 0.8, bool autoFrameRate = false); float getEstimatedFps() const; 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; void estimateFrameRate(); private: float track_thresh_; float high_thresh_; float match_thresh_; size_t max_time_lost_; int track_buffer_; size_t frame_id_; size_t track_id_count_; // Frame rate auto-estimation bool auto_frame_rate_; float estimated_fps_; float time_scale_factor_; size_t fps_sample_count_; std::chrono::steady_clock::time_point last_update_time_; bool has_last_update_time_; std::vector tracked_stracks_; std::vector lost_stracks_; std::vector removed_stracks_; }; }