Tracker.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. #pragma once
  2. #ifdef ORTTOOLKIT
  3. #define ORTTOOLKIT __declspec(dllexport)
  4. #else
  5. #define ORTTOOLKIT __declspec(dllimport)
  6. #endif
  7. #include <opencv/cv.hpp>
  8. #include <opencv2/video/tracking.hpp>
  9. #include <opencv2/highgui/highgui.hpp>
  10. #include <iostream>
  11. #include <queue>
  12. #include <iostream>
  13. #include <vector>
  14. #include <fstream>
  15. #include <set>
  16. #include <Vision.h>
  17. namespace OrtToolkit {
  18. namespace Tracker {
  19. class HungarianAlgorithm
  20. {
  21. public:
  22. HungarianAlgorithm();
  23. ~HungarianAlgorithm();
  24. double Solve(std::vector<std::vector<double>>& DistMatrix, std::vector<int>& Assignment);
  25. private:
  26. void assignmentoptimal(int* assignment, double* cost, double* distMatrix, int nOfRows, int nOfColumns);
  27. void buildassignmentvector(int* assignment, bool* starMatrix, int nOfRows, int nOfColumns);
  28. void computeassignmentcost(int* assignment, double* cost, double* distMatrix, int nOfRows);
  29. void step2a(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim);
  30. void step2b(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim);
  31. void step3(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim);
  32. 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);
  33. void step5(int* assignment, double* distMatrix, bool* starMatrix, bool* newStarMatrix, bool* primeMatrix, bool* coveredColumns, bool* coveredRows, int nOfRows, int nOfColumns, int minDim);
  34. };
  35. class KalmanTracker
  36. {
  37. public:
  38. KalmanTracker()
  39. {
  40. init_kf(cv::Rect_<float>());
  41. m_time_since_update = 0;
  42. m_hits = 0;
  43. m_hit_streak = 0;
  44. m_age = 0;
  45. m_id = OrtToolkit::Util::create_uuid();
  46. }
  47. KalmanTracker(cv::Rect_<float> initRect)
  48. {
  49. init_kf(initRect);
  50. m_time_since_update = 0;
  51. m_hits = 0;
  52. m_hit_streak = 0;
  53. m_age = 0;
  54. m_id = OrtToolkit::Util::create_uuid();
  55. }
  56. ~KalmanTracker()
  57. {
  58. m_history.clear();
  59. }
  60. cv::Rect_<float> predict();
  61. void update(cv::Rect_<float> stateMat);
  62. cv::Rect_<float> get_state();
  63. cv::Rect_<float> get_rect_xysr(float cx, float cy, float s, float r);
  64. static int kf_count;
  65. int m_time_since_update;// 距上一次检测结果后预测的次数
  66. int m_hits;// 该目标检测的次数
  67. int m_hit_streak;// 距上一次进行卡尔曼滤波预测至今活跃的时间
  68. int m_age;//跟踪器总活跃次数
  69. std::string m_id;
  70. private:
  71. void init_kf(cv::Rect_<float> stateMat);
  72. cv::KalmanFilter kf;
  73. cv::Mat measurement;
  74. std::vector<cv::Rect_<float>> m_history;
  75. };
  76. class ORTTOOLKIT IouTracker {
  77. public:
  78. IouTracker(float low = 0.5, float iou = 0.3, int t_min = 3, int disapper_t = 1, int id_c = 10000, std::vector<cv::Point2f> FaceStd = { {38.2946, 51.6963},{73.5318, 51.6963},
  79. {56.0252, 71.7366},{41.5493, 92.3655},
  80. {70.7299, 92.3655} });
  81. ~IouTracker() {};
  82. void updata(std::vector<std::array<float, 4>> bbox, std::vector<float> score, std::vector<OrtToolkit::Type::track>& tracks_finished, std::vector<OrtToolkit::Type::track>& tracks_new);
  83. void updata(OrtToolkit::Type::Type_Boxs bboxs, OrtToolkit::Type::Type_Scores scores, std::vector<std::array<OrtToolkit::Type::Base_Type_iPoint, 5>> LandmarksPoints, std::vector<std::array<OrtToolkit::Type::Base_Type_Score, 5>> LandmarksScores, std::vector<OrtToolkit::Type::track>& tracks_finished, std::vector<OrtToolkit::Type::track>& tracks_new);
  84. void iou_batch(OrtToolkit::Type::Type_Boxs bb_test, OrtToolkit::Type::Type_Boxs bb_get, OrtToolkit::Type::Type_Scores& iou);
  85. // 全区禁区
  86. void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_PP_YOLOE res, std::queue <cv::Mat>& OriginalQueue, std::queue <cv::Mat>& ThumbnailQueue, int Width, int Height, std::queue<tm>& TimeQueue, std::queue<int>& TypeQueue, tm Nowtime, int type);
  87. // 目标检测禁区
  88. void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_PP_YOLOE res, std::vector<std::vector<cv::Point>> Border, std::queue <cv::Mat>& OriginalQueue, std::queue <cv::Mat>& ThumbnailQueue, int Width, int Height, std::queue<tm>& TimeQueue, std::queue<int>& TypeQueue, tm Nowtime, int type);
  89. // 人脸检测禁区
  90. void RestrictedZone(cv::Mat frame, OrtToolkit::Type::Res_YOLOV7_FACE res, std::vector<std::vector<cv::Point>> Border, std::queue <cv::Mat>& OriginalQueue, std::queue <cv::Mat>& ThumbnailQueue, std::queue <std::string>& FaceID, int Width, int Height, std::queue<tm>& TimeQueue, std::queue<int>& TypeQueue, tm Nowtime, int type, std::vector<cv::Mat>& FaceImg);
  91. float sigma_l;//检测器置信度的最小阈值
  92. public:
  93. std::vector<cv::Point2f> standard;//人脸标准模板
  94. private:
  95. float sigma_iou;//IOU的最小阈值
  96. int t_min;//判定跟踪的最小等待时
  97. int disapper_time;//消失后继续跟踪的最大等待值
  98. int max_id = 0;//ID起始值
  99. int id_clear;//ID清理值
  100. std::vector<OrtToolkit::Type::track> tracks_observe;
  101. };
  102. ORTTOOLKIT struct TrackingBox
  103. {
  104. std::string id;
  105. cv::Rect_<float> box;
  106. };
  107. class ORTTOOLKIT Sort
  108. {
  109. public:
  110. Sort(int max_age = 24, int min_hits = 3, double iouThreshold = 0.3);
  111. void update(std::vector<TrackingBox> detData);
  112. void UpdateOut();
  113. ~Sort();
  114. public:
  115. void GetFrameTrackingResult(std::vector<TrackingBox>& frameTrackingResult);
  116. void GetNewAdd(std::vector<TrackingBox>& NewAdd);
  117. void GetNewDel(std::vector<TrackingBox>& NewDel);
  118. void GetAllTrack(std::vector<TrackingBox>& NewDel);
  119. private:
  120. int max_age = 24;// 目标丢失后使用预测的方式进行预测的帧数
  121. int min_hits = 3;// 连续min_hits帧关联,才开始跟踪
  122. double iouThreshold = 0.3;// Iou阈值
  123. std::vector<KalmanTracker> trackers;
  124. std::vector<KalmanTracker> NewDel;
  125. };
  126. }
  127. }
  128. namespace Draw {
  129. void ORTTOOLKIT Border(cv::Mat& Image, const std::vector<cv::Point>& point_set, int gate_width = 10, int thickness = -1);
  130. void ORTTOOLKIT Border(cv::Mat& Image, const std::vector<std::vector<cv::Point>>& point_set, int gate_width = 10, int thickness = -1);
  131. void ORTTOOLKIT FillBorder(cv::Mat& Image, const std::vector<cv::Point>& point_set);
  132. void ORTTOOLKIT FillBorder(cv::Mat& Image, const std::vector<std::vector<cv::Point>>& point_set);
  133. void ORTTOOLKIT DrawBox(cv::Mat& Image, const std::array<float, 4>& box, int thicknes = 10);
  134. }