#pragma once #include "NCNNSTrack.h" #include #include namespace ByteTrackNCNN { class BYTETracker { public: BYTETracker(int frame_rate = 10, int track_buffer = 30); ~BYTETracker(); std::vector update(const std::vector& objects); //cv::Scalar get_color(int idx); void update_parameters(int frameRate = 10, int trackBuffer = 30, double trackThreshold = 0.5, double highThreshold = 0.6, double matchThresold = 0.8, bool autoFrameRate = false); float getEstimatedFps() const; private: std::vector joint_stracks(std::vector& tlista, std::vector& tlistb); std::vector joint_stracks(std::vector& tlista, std::vector& tlistb); std::vector sub_stracks(std::vector& tlista, std::vector& tlistb); void remove_duplicate_stracks(std::vector& resa, std::vector& resb, std::vector& stracksa, std::vector& stracksb); void linear_assignment(std::vector< std::vector >& cost_matrix, int cost_matrix_size, int cost_matrix_size_size, float thresh, std::vector< std::vector >& matches, std::vector& unmatched_a, std::vector& unmatched_b); std::vector< std::vector > iou_distance(std::vector& atracks, std::vector& btracks, int& dist_size, int& dist_size_size); std::vector< std::vector > iou_distance(std::vector& atracks, std::vector& btracks); std::vector< std::vector > ious(std::vector< std::vector >& atlbrs, std::vector< std::vector >& btlbrs); double lapjv(const std::vector< std::vector >& cost, std::vector& rowsol, std::vector& colsol, bool extend_cost = false, float cost_limit = LONG_MAX, bool return_cost = true); void estimateFrameRate(); private: float track_thresh; float high_thresh; float match_thresh; int frame_id; int max_time_lost; int track_id_count; int track_buffer_; // 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; ByteTrackNCNN::ByteKalmanFilter kalman_filter; }; }