#pragma once #ifdef ORTTOOLKIT #define ORTTOOLKIT __declspec(dllexport) #else #define ORTTOOLKIT __declspec(dllimport) #endif #include #include #include #include #include #include #include #include #include #include namespace OrtToolkit { namespace Tracker { class HungarianAlgorithm { public: HungarianAlgorithm(); ~HungarianAlgorithm(); double Solve(std::vector>& DistMatrix, std::vector& Assignment); private: void assignmentoptimal(int* assignment, double* cost, double* distMatrix, int nOfRows, int nOfColumns); void buildassignmentvector(int* assignment, bool* starMatrix, int nOfRows, int nOfColumns); void computeassignmentcost(int* assignment, double* cost, double* distMatrix, int nOfRows); void step2a(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim); void step2b(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim); void step3(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim); void step4(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim, int row, int col); void step5(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim); }; class KalmanTracker { public: KalmanTracker() { init_kf(cv::Rect_()); m_time_since_update = 0; m_hits = 0; m_hit_streak = 0; m_age = 0; m_id = OrtToolkit::Util::create_uuid(); } KalmanTracker(cv::Rect_ initRect) { init_kf(initRect); m_time_since_update = 0; m_hits = 0; m_hit_streak = 0; m_age = 0; m_id = OrtToolkit::Util::create_uuid(); } ~KalmanTracker() { m_history.clear(); } cv::Rect_ predict(); void update(cv::Rect_ stateMat); cv::Rect_ get_state(); cv::Rect_ get_rect_xysr(float cx, float cy, float s, float r); static int kf_count; int m_time_since_update;// 距上一次检测结果后预测的次数 int m_hits;// 该目标检测的次数 int m_hit_streak;// 距上一次进行卡尔曼滤波预测至今活跃的时间 int m_age;//跟踪器总活跃次数 std::string m_id; private: void init_kf(cv::Rect_ stateMat); cv::KalmanFilter kf; cv::Mat measurement; std::vector> m_history; }; class ORTTOOLKIT IouTracker { public: IouTracker(float low = 0.5, float iou = 0.3, int t_min = 3, int disapper_t = 1, int id_c = 10000, std::vector FaceStd = { {38.2946, 51.6963},{73.5318, 51.6963}, {56.0252, 71.7366},{41.5493, 92.3655}, {70.7299, 92.3655} }); ~IouTracker() {}; void updata(std::vector> bbox, std::vector score, std::vector& tracks_finished, std::vector& tracks_new); void updata(OrtToolkit::Type::Type_Boxs bboxs, OrtToolkit::Type::Type_Scores scores, std::vector> LandmarksPoints, std::vector> LandmarksScores, std::vector& tracks_finished, std::vector& tracks_new); void iou_batch(OrtToolkit::Type::Type_Boxs bb_test, OrtToolkit::Type::Type_Boxs bb_get, OrtToolkit::Type::Type_Scores& iou); // 全区禁区 void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_PP_YOLOE res, std::queue & OriginalQueue, std::queue & ThumbnailQueue, int Width, int Height, std::queue& TimeQueue, std::queue& TypeQueue, tm Nowtime, int type); // 目标检测禁区 void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_PP_YOLOE res, std::vector> Border, std::queue & OriginalQueue, std::queue & ThumbnailQueue, int Width, int Height, std::queue& TimeQueue, std::queue& TypeQueue, tm Nowtime, int type); // 人脸检测禁区 void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_YOLOV7_FACE res, std::vector> Border, std::queue & OriginalQueue, std::queue & ThumbnailQueue, std::queue & FaceID, int Width, int Height, std::queue& TimeQueue, std::queue& TypeQueue, tm Nowtime, int type, std::vector& FaceImg); float sigma_l;//检测器置信度的最小阈值 public: std::vector standard;//人脸标准模板 private: float sigma_iou;//IOU的最小阈值 int t_min;//判定跟踪的最小等待时 int disapper_time;//消失后继续跟踪的最大等待值 int max_id = 0;//ID起始值 int id_clear;//ID清理值 std::vector tracks_observe; }; ORTTOOLKIT struct TrackingBox { std::string id; cv::Rect_ box; }; class ORTTOOLKIT Sort { public: Sort(int max_age = 24, int min_hits = 3, double iouThreshold = 0.3); void update(std::vector detData); void UpdateOut(); ~Sort(); public: void GetFrameTrackingResult(std::vector& frameTrackingResult); void GetNewAdd(std::vector& NewAdd); void GetNewDel(std::vector& NewDel); void GetAllTrack(std::vector& NewDel); private: int max_age = 24;// 目标丢失后使用预测的方式进行预测的帧数 int min_hits = 3;// 连续min_hits帧关联,才开始跟踪 double iouThreshold = 0.3;// Iou阈值 std::vector trackers; std::vector NewDel; }; } } namespace Draw { void ORTTOOLKIT Border(cv::Mat& Image, const std::vector& point_set, int gate_width = 10, int thickness = -1); void ORTTOOLKIT Border(cv::Mat& Image, const std::vector>& point_set, int gate_width = 10, int thickness = -1); void ORTTOOLKIT FillBorder(cv::Mat& Image, const std::vector& point_set); void ORTTOOLKIT FillBorder(cv::Mat& Image, const std::vector>& point_set); void ORTTOOLKIT DrawBox(cv::Mat& Image, const std::array& box, int thicknes = 10); }