Tracking.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #pragma once
  2. #include "Ctracker.h"
  3. #include <iostream>
  4. #include <vector>
  5. #include "dataReader.h"
  6. bool InitTracker(cv::UMat frame, CTracker& tracker)
  7. {
  8. TrackerSettings settings;
  9. settings.SetDistance(tracking::DistRects);
  10. settings.m_kalmanType = tracking::KalmanLinear;
  11. settings.m_filterGoal = tracking::FilterRect;
  12. settings.m_lostTrackType = tracking::TrackNone; // Use visual objects tracker for collisions resolving
  13. settings.m_matchType = tracking::MatchHungrian;
  14. settings.m_useAcceleration = false; // Use constant acceleration motion model
  15. settings.m_dt = settings.m_useAcceleration ? 0.05f : 0.2f; // Delta time for Kalman filter
  16. settings.m_accelNoiseMag = 0.2f; // Accel noise magnitude for Kalman filter
  17. settings.m_distThres = 0.95f; // Distance threshold between region and object on two frames
  18. #if 1
  19. settings.m_minAreaRadiusPix = frame.rows / 20.f;
  20. #else
  21. settings.m_minAreaRadiusPix = -1.f;
  22. #endif
  23. settings.m_minAreaRadiusK = 0.8f;
  24. settings.m_useAbandonedDetection = true;
  25. if (settings.m_useAbandonedDetection)
  26. {
  27. settings.m_minStaticTime = 5;
  28. settings.m_maxStaticTime = 10;
  29. settings.m_maximumAllowedSkippedFrames = 30; // Maximum allowed skipped frames
  30. settings.m_maxTraceLength = 60; // Maximum trace length
  31. }
  32. else
  33. {
  34. settings.m_maximumAllowedSkippedFrames = 30; // Maximum allowed skipped frames
  35. settings.m_maxTraceLength = 60; // Maximum trace length
  36. }
  37. tracker.setSettings(settings);
  38. return true;
  39. }
  40. void Track(cv::Mat frame, const regions_t& regions, CTracker& tracker)
  41. {
  42. cv::UMat uframe;
  43. if (tracker.CanColorFrameToTrack())
  44. {
  45. uframe = frame.getUMat(cv::ACCESS_READ);
  46. }
  47. else
  48. {
  49. cv::cvtColor(frame, uframe, cv::COLOR_BGR2GRAY);
  50. }
  51. tracker.Update(regions, uframe, 30);
  52. }
  53. // ----------------------------------------------------------------------
  54. void Tracking(cv::Mat frame, std::vector<Tn::Bbox>& boxes, CTracker& tracker)
  55. {
  56. regions_t regions;
  57. for(int i=0;i<boxes.size();i++)
  58. {
  59. int lt_x = boxes[i].left;
  60. int lt_y = boxes[i].top;
  61. int w = abs(boxes[i].right-boxes[i].left);
  62. int h = abs(boxes[i].bot-boxes[i].top);
  63. cv::Rect rect(lt_x, lt_y, w>0?w:w+1,h>0?h:h+1);
  64. CRegion region = CRegion(rect,std::to_string(boxes[i].classId),boxes[i].score);
  65. regions.push_back(region);
  66. //std::cout<<"l,r,t,b:"<<boxes[i].left<<","<<boxes[i].right<<","<<boxes[i].top<<","<<boxes[i].bot<<std::endl;
  67. }
  68. Track(frame, regions,tracker);
  69. auto tracks = tracker.GetTracks();
  70. for (size_t i = 0; i < tracks.size(); i++)
  71. {
  72. const auto& track = tracks[i];
  73. int obj_id = track.m_regionID;
  74. if(obj_id != -1)
  75. {
  76. boxes[obj_id].id = track.m_ID;
  77. // cv::RotatedRect rrect = track.m_rrect;
  78. // Point_t c = rrect.center;
  79. // int w = rrect.size.width;
  80. // int h = rrect.size.height;
  81. // boxes[obj_id].left = c.x - w / 2;
  82. // boxes[obj_id].right = c.x + w / 2;
  83. // boxes[obj_id].top = c.y - h / 2;
  84. // boxes[obj_id].bot = c.y + h / 2;
  85. boxes[obj_id].speedx = track.m_velocity[0];//x
  86. boxes[obj_id].speedy = track.m_velocity[1];//y
  87. }
  88. }
  89. // for (size_t i = 0; i < boxes.size(); i++)
  90. // {
  91. // std::cout<<"id:"<<boxes[i].id<<std::endl;
  92. // std::cout<<"speed:"<<boxes[i].speedx<<","<<boxes[i].speedy<<","<<std::endl;
  93. // }
  94. regions.clear();
  95. tracks.clear();
  96. }