X-Git-Url: https://fleuret.org/cgi-bin/gitweb/gitweb.cgi?a=blobdiff_plain;f=tracker.cc;h=0d1d781ede1febbc57ad39fe50dc48451dcf83f0;hb=f2f1701bfeb50ecb468489d58a59741400d1d791;hp=0e6ed6a4de53b86414da5e5208e473842b3005a0;hpb=924a2d8b5313d1bbe84515fc262db3c7e7d50355;p=mtp.git diff --git a/tracker.cc b/tracker.cc index 0e6ed6a..0d1d781 100644 --- a/tracker.cc +++ b/tracker.cc @@ -82,11 +82,12 @@ void Tracker::set_detection_score(int time, int location, scalar_t score) { } void Tracker::build_graph() { - // Delete existing graph + // Delete existing graph if there was one delete[] _edge_lengths; delete _graph; int nb_motions = 0, nb_exits = 0, nb_entrances = 0; + for(int l = 0; l < _nb_locations; l++) { if(_exits[l]) nb_exits++; if(_entrances[l]) nb_entrances++; @@ -98,14 +99,22 @@ void Tracker::build_graph() { int nb_vertices = 2 + 2 * _nb_time_steps * _nb_locations; int nb_edges = + // The edges from the source to the first frame, and from the last + // frame to the sink _nb_locations * 2 + - (_nb_time_steps - 2) * (nb_exits + nb_entrances) + + // The edges from the source to the entrances and from the exists + // to the sink (in every time frames but the first and last) + (_nb_time_steps - 1) * (nb_exits + nb_entrances) + + // The edges for the motions, between every pair of successive + // frames (_nb_time_steps - 1) * nb_motions + + // The edges inside the duplicated nodes _nb_locations * _nb_time_steps; - int source = 0, sink = nb_vertices - 1; int *node_from = new int[nb_edges]; int *node_to = new int[nb_edges]; + + int source = 0, sink = nb_vertices - 1; int e = 0; _edge_lengths = new scalar_t[nb_edges]; @@ -148,15 +157,15 @@ void Tracker::build_graph() { } } - for(int t = 1; t < _nb_time_steps-1; t++) { + for(int t = 0; t < _nb_time_steps; t++) { for(int l = 0; l < _nb_locations; l++) { - if(_entrances[l]) { + if(t > 0 && _entrances[l]) { node_from[e] = source; node_to[e] = 1 + (2 * (t + 0) + 0) * _nb_locations + l; _edge_lengths[e] = 0.0; e++; } - if(_exits[l]) { + if(t < _nb_time_steps - 1 && _exits[l]) { node_from[e] = 1 + (2 * (t + 0) + 1) * _nb_locations + l; node_to[e] = sink; _edge_lengths[e] = 0.0; @@ -173,7 +182,7 @@ void Tracker::build_graph() { delete[] node_to; } -void Tracker::print_dot_graph(ostream *os) { +void Tracker::print_graph_dot(ostream *os) { int e = 0; for(int t = 0; t < _nb_time_steps; t++) { for(int l = 0; l < _nb_locations; l++) {