16 float in = (bb_test & bb_gt).area();
17 float un = bb_test.area() + bb_gt.area() - in;
22 return (
double)(in / un);
27 cv::Rect_<float> bb_test,
28 cv::Rect_<float> bb_gt)
30 float bb_test_centroid_x = (bb_test.x + bb_test.width / 2);
31 float bb_test_centroid_y = (bb_test.y + bb_test.height / 2);
33 float bb_gt_centroid_x = (bb_gt.x + bb_gt.width / 2);
34 float bb_gt_centroid_y = (bb_gt.y + bb_gt.height / 2);
36 double distance = (double)sqrt(pow(bb_gt_centroid_x - bb_test_centroid_x, 2) + pow(bb_gt_centroid_y - bb_test_centroid_y, 2));
41 void SortTracker::update(vector<cv::Rect> detections_cv,
int frame_count,
double image_diagonal, std::vector<float> confidences, std::vector<int> classIds)
43 vector<TrackingBox> detections;
44 if (trackers.size() == 0)
46 alive_tracker =
false;
48 for (
unsigned int i = 0; i < detections_cv.size(); i++)
52 tb.
box = cv::Rect_<float>(detections_cv[i]);
55 detections.push_back(tb);
58 trackers.push_back(trk);
64 for (
unsigned int i = 0; i < detections_cv.size(); i++)
67 tb.
box = cv::Rect_<float>(detections_cv[i]);
70 detections.push_back(tb);
72 for (
auto it = frameTrackingResult.begin(); it != frameTrackingResult.end(); it++)
74 int frame_age = frame_count - it->frame;
75 if (frame_age >= _max_age || frame_age < 0)
77 dead_trackers_id.push_back(it->id);
84 predictedBoxes.clear();
85 for (
unsigned int i = 0; i < trackers.size();)
87 cv::Rect_<float> pBox = trackers[i].predict();
88 if (pBox.x >= 0 && pBox.y >= 0)
90 predictedBoxes.push_back(pBox);
94 trackers.erase(trackers.begin() + i);
97 trkNum = predictedBoxes.size();
98 detNum = detections.size();
100 centroid_dist_matrix.clear();
101 centroid_dist_matrix.resize(trkNum, vector<double>(detNum, 0));
103 for (
unsigned int i = 0; i < trkNum; i++)
105 for (
unsigned int j = 0; j < detNum; j++)
109 centroid_dist_matrix[i][j] = distance;
115 HungAlgo.
Solve(centroid_dist_matrix, assignment);
117 unmatchedTrajectories.clear();
118 unmatchedDetections.clear();
120 matchedItems.clear();
124 for (
unsigned int n = 0; n < detNum; n++)
127 for (
unsigned int i = 0; i < trkNum; ++i)
128 matchedItems.insert(assignment[i]);
130 set_difference(allItems.begin(), allItems.end(),
131 matchedItems.begin(), matchedItems.end(),
132 insert_iterator<set<int>>(unmatchedDetections, unmatchedDetections.begin()));
134 else if (detNum < trkNum)
136 for (
unsigned int i = 0; i < trkNum; ++i)
137 if (assignment[i] == -1)
138 unmatchedTrajectories.insert(i);
144 matchedPairs.clear();
145 for (
unsigned int i = 0; i < trkNum; ++i)
147 if (assignment[i] == -1)
149 if (centroid_dist_matrix[i][assignment[i]] > max_centroid_dist_norm)
151 unmatchedTrajectories.insert(i);
152 unmatchedDetections.insert(assignment[i]);
155 matchedPairs.push_back(cv::Point(i, assignment[i]));
158 for (
unsigned int i = 0; i < matchedPairs.size(); i++)
160 int trkIdx = matchedPairs[i].x;
161 int detIdx = matchedPairs[i].y;
162 trackers[trkIdx].update(detections[detIdx].box);
163 trackers[trkIdx].classId = detections[detIdx].classId;
164 trackers[trkIdx].confidence = detections[detIdx].confidence;
168 for (
auto umd : unmatchedDetections)
171 trackers.push_back(tracker);
174 for (
auto it2 = dead_trackers_id.begin(); it2 != dead_trackers_id.end(); it2++)
176 for (
unsigned int i = 0; i < trackers.size();)
178 if (trackers[i].m_id == (*it2))
180 trackers.erase(trackers.begin() + i);
188 frameTrackingResult.clear();
189 for (
unsigned int i = 0; i < trackers.size();)
191 if ((trackers[i].m_time_since_update < 1 && trackers[i].m_hit_streak >= _min_hits) || frame_count <= _min_hits)
193 alive_tracker =
true;
195 res.
box = trackers[i].get_state();
196 res.
id = trackers[i].m_id;
197 res.
frame = frame_count;
198 res.
classId = trackers[i].classId;
200 frameTrackingResult.push_back(res);
204 if (trackers[i].m_time_since_update >= _max_age)
206 trackers.erase(trackers.begin() + i);
double Solve(std::vector< std::vector< double >> &DistMatrix, std::vector< int > &Assignment)
This class represents the internel state of individual tracked objects observed as bounding box.
SortTracker(int max_age=7, int min_hits=2)
double GetCentroidsDistance(cv::Rect_< float > bb_test, cv::Rect_< float > bb_gt)
void update(std::vector< cv::Rect > detection, int frame_count, double image_diagonal, std::vector< float > confidences, std::vector< int > classIds)
double GetIOU(cv::Rect_< float > bb_test, cv::Rect_< float > bb_gt)