Tracking.hpp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #pragma once
  2. #include "fusionobjectarray.pb.h"
  3. #include "fusionobject.pb.h"
  4. #include "Ctracker.h"
  5. #include <iostream>
  6. #include <vector>
  7. #define FPS 8
  8. #define MIN_DETECTEDFRAMES 5
  9. ///
  10. /// \brief 跟踪器参数设置
  11. ///
  12. bool InitTracker(CTracker& tracker)
  13. {
  14. TrackerSettings settings;
  15. settings.SetDistance(tracking::DistRect3Ds); // 代价矩阵:两中心点之间的距离
  16. settings.m_kalmanType = tracking::KalmanLinear; // 滤波器类型:卡尔曼线性滤波器
  17. settings.m_filterGoal = tracking::FilterRect3D; // 滤波对象:Rect3D
  18. settings.m_lostTrackType = tracking::TrackNone; // 丢失了的目标,不再追踪
  19. settings.m_matchType = tracking::MatchHungrian; // 匹配算法:匈牙利
  20. settings.m_dt = 1.f; // 卡尔曼滤波器的时间步长
  21. settings.m_accelNoiseMag = 0.5f; // 卡尔曼的噪声放大器
  22. settings.m_distThres = 30.f; // 匹配算法中的距离阈值
  23. settings.m_minAreaRadiusPix = -1.f;//frame.rows / 20.f; // 目标的最小面积半径(像素)
  24. settings.m_maximumAllowedSkippedFrames = 2; // 被跟踪目标允许未匹配到的最大次数,当超过这一数值,该目标的跟踪器将被移除
  25. settings.m_maxTraceLength = 5; // 最大跟踪长度,即历史轨迹保留的最大长度
  26. tracker.setSettings(settings);
  27. return true;
  28. }
  29. ///
  30. /// \brief 对融合后的目标进行跟踪,并以跟踪后的最优估计值更新融合目标的状态信息
  31. ///
  32. iv::fusion::fusionobjectarray Tracking(iv::fusion::fusionobjectarray& fusionobjvec, CTracker& tracker)
  33. {
  34. #ifdef DEBUG_SHOW
  35. std::cout<<"-------------------------------------------------"<<std::endl;
  36. #endif
  37. iv::fusion::fusionobjectarray trackedobjvec;
  38. trackedobjvec.clear_obj();
  39. trackedobjvec.set_timestamp(fusionobjvec.timestamp());
  40. regions_t regions;
  41. cv::Point3f pointXYZ;
  42. for(int i = 0;i<fusionobjvec.obj_size();i++)
  43. {
  44. pointXYZ.x = fusionobjvec.obj(i).centroid().x();
  45. pointXYZ.y = fusionobjvec.obj(i).centroid().y();
  46. pointXYZ.z = fusionobjvec.obj(i).centroid().z();
  47. Rect3D rect;
  48. rect.center = pointXYZ;
  49. rect.size.width = fusionobjvec.obj(i).dimensions().x();
  50. rect.size.height = fusionobjvec.obj(i).dimensions().y();
  51. rect.size.length = fusionobjvec.obj(i).dimensions().z();
  52. rect.yaw = fusionobjvec.obj(i).yaw();
  53. CRegion region = CRegion(rect,fusionobjvec.obj(i).type(),fusionobjvec.obj(i).prob());
  54. regions.push_back(region);
  55. #ifdef DEBUG_SHOW
  56. std::cout<<"old id:"<<i<<std::endl;
  57. std::cout<<"old type:"<<fusionobjvec.obj(i).type()<<std::endl;
  58. std::cout<<"old x,y,z,w,h,l,yaw:"<<rect.center.x<<","<<rect.center.y<<","<<rect.center.z<<" "<<rect.size.width<<","<<rect.size.height<<","<<rect.size.length<<" "<<rect.yaw<<std::endl;
  59. #endif
  60. }
  61. tracker.Update(regions, cv::UMat(), 30);
  62. auto tracks = tracker.GetTracks();
  63. #ifdef DEBUG_SHOW
  64. std::cout<<"fusion size, tracker size:"<<regions.size()<<","<<tracks.size()<<std::endl;
  65. #endif
  66. for (size_t i = 0; i < tracks.size(); i++)
  67. {
  68. const auto& track = tracks[i];
  69. if(track.m_detectedFrames<MIN_DETECTEDFRAMES) continue;
  70. int obj_id = track.m_regionID;
  71. iv::fusion::fusionobject fusion_object;
  72. if(obj_id != -1) // 当前融合目标成功匹配上跟踪器中的已有目标,则根据跟踪所得的最优估计值更新融合目标状态
  73. {
  74. fusion_object = fusionobjvec.obj(obj_id);
  75. fusion_object.set_id(track.m_ID);
  76. iv::fusion::PointXYZ centroid;
  77. iv::fusion::PointXYZ *centerpoint;
  78. centroid.set_x(track.m_rect.center.x);
  79. centroid.set_y(track.m_rect.center.y);
  80. centroid.set_z(track.m_rect.center.z);
  81. centerpoint=fusion_object.mutable_centroid();
  82. centerpoint->CopyFrom(centroid);
  83. /* not update */
  84. // iv::fusion::Dimension dimension;
  85. // iv::fusion::Dimension *obj_dimension;
  86. // dimension.set_x(track.m_rect.size.width);
  87. // dimension.set_y(track.m_rect.size.height);
  88. // dimension.set_z(track.m_rect.size.length);
  89. // obj_dimension=fusion_object.mutable_dimensions();
  90. // obj_dimension->CopyFrom(dimension);
  91. // fusion_object.set_yaw(track.m_rect.yaw);
  92. // iv::fusion::VelXY vel_relative;
  93. // iv::fusion::VelXY *velrelative;
  94. // vel_relative.set_x(track.m_velocity[0]);
  95. // vel_relative.set_y(track.m_velocity[1]);
  96. // velrelative = fusion_object.mutable_vel_relative();
  97. // velrelative->CopyFrom(vel_relative);
  98. iv::fusion::PointXYZ point_historical;
  99. for(int j=0;j<track.m_trace.size();j++)
  100. {
  101. point_historical.set_x(track.m_trace[j].x);
  102. point_historical.set_y(track.m_trace[j].y);
  103. point_historical.set_z(track.m_trace[j].z);
  104. iv::fusion::PointXYZ *p = fusion_object.add_point_historical();
  105. p->CopyFrom(point_historical);
  106. }
  107. iv::fusion::fusionobject *pe = trackedobjvec.add_obj();
  108. pe->CopyFrom(fusion_object);
  109. }else{ // 当前时刻没有融合目标与跟踪器中的已有目标匹配上,则将跟踪器中已有目标的预测结果增加到融合结果中
  110. fusion_object.set_id(track.m_ID);
  111. fusion_object.set_type(track.m_region.m_type);
  112. iv::fusion::PointXYZ centroid;
  113. iv::fusion::PointXYZ *centerpoint;
  114. centroid.set_x(track.m_rect.center.x);
  115. centroid.set_y(track.m_rect.center.y);
  116. centroid.set_z(track.m_rect.center.z);
  117. centerpoint=fusion_object.mutable_centroid();
  118. centerpoint->CopyFrom(centroid);
  119. iv::fusion::Dimension dimension;
  120. iv::fusion::Dimension *obj_dimension;
  121. dimension.set_x(track.m_region.m_rect.size.width);
  122. dimension.set_y(track.m_region.m_rect.size.height);
  123. dimension.set_z(track.m_region.m_rect.size.length);
  124. obj_dimension=fusion_object.mutable_dimensions();
  125. obj_dimension->CopyFrom(dimension);
  126. fusion_object.set_yaw(track.m_region.m_rect.yaw);
  127. iv::fusion::VelXY vel_relative;
  128. iv::fusion::VelXY *velrelative;
  129. vel_relative.set_x(track.m_velocity[0]*FPS);
  130. vel_relative.set_y(track.m_velocity[1]*FPS);
  131. velrelative = fusion_object.mutable_vel_relative();
  132. velrelative->CopyFrom(vel_relative);
  133. iv::fusion::PointXYZ point_historical;
  134. for(int j=0;j<track.m_trace.size();j++)
  135. {
  136. point_historical.set_x(track.m_trace[j].x);
  137. point_historical.set_y(track.m_trace[j].y);
  138. point_historical.set_z(track.m_trace[j].z);
  139. iv::fusion::PointXYZ *p = fusion_object.add_point_historical();
  140. p->CopyFrom(point_historical);
  141. }
  142. iv::fusion::fusionobject *pe = trackedobjvec.add_obj();
  143. pe->CopyFrom(fusion_object);
  144. }
  145. #ifdef DEBUG_SHOW
  146. std::cout<<"id:"<<fusion_object.id()<<" "<<obj_id<<std::endl;
  147. std::cout<<"type:"<<fusion_object.type()<<std::endl;
  148. std::cout<<"update x,y,z,w,h,l,yaw,vx,vy:"<<fusion_object.centroid().x()<<","<<fusion_object.centroid().y()<<","<<fusion_object.centroid().z()<<" "<<fusion_object.dimensions().x()<<","<<fusion_object.dimensions().y()<<","<<fusion_object.dimensions().z()<<" "<<fusion_object.yaw()<<" "<<fusion_object.vel_relative().x()<<","<<fusion_object.vel_relative().y()<<std::endl;
  149. #endif
  150. }
  151. #ifdef DEBUG_SHOW
  152. std::cout<<"trackedobjvec size:"<<trackedobjvec.obj_size()<<std::endl;
  153. #endif
  154. // for (size_t i = 0; i < trackedobjvec.obj_size(); i++)
  155. // {
  156. // iv::fusion::fusionobject fusion_object;
  157. // fusion_object = trackedobjvec.obj(i);
  158. // std::cout<<"historical size:"<<fusion_object.point_historical_size()<<std::endl;
  159. // }
  160. regions.clear();
  161. tracks.clear();
  162. return trackedobjvec;
  163. }