+char trajectory_filename[FILENAME_SIZE];
+char graph_filename[FILENAME_SIZE];
+int verbose;
+
+void usage(ostream *os) {
+ (*os) << "mtp [-h|--help] [-v|--verbose] [-t|--trajectory-filename <trajectory filename>] [-g|--graph-filename <graph filename>] [<tracking parameter file>]" << endl;
+ (*os) << endl;
+ (*os) << "The mtp command processes a file containing the description of a topology" << endl;
+ (*os) << "and detection scores, and prints the optimal set of trajectories." << endl;
+ (*os) << "If no filename is provided, it will read the parameters from the stdin." << endl;
+ (*os) << "If no trajectory filename is provided, it will write the result to" << endl;
+ (*os) << "stdout." << endl;
+ (*os) << endl;
+ (*os) << "Written by Francois Fleuret. (C) Idiap Research Institute, 2012." << endl;
+}
+
+scalar_t diff_in_second(struct timeval *start, struct timeval *end) {
+ return
+ scalar_t(end->tv_sec - start->tv_sec) +
+ scalar_t(end->tv_usec - start->tv_usec)/1000000;
+}
+
+void do_tracking(istream *in_tracker) {
+ timeval start_time, end_time;
+ MTPTracker *tracker = new MTPTracker();
+
+ if(verbose) { cout << "Reading the tracking parameters." << endl; }
+ tracker->read(in_tracker);
+
+ if(verbose) {
+ cout << "Building the graph ... "; cout.flush();
+ gettimeofday(&start_time, 0);
+ }
+ tracker->build_graph();
+ if(verbose) {
+ gettimeofday(&end_time, 0);
+ cout << "done (" << diff_in_second(&start_time, &end_time) << "s)." << endl;
+ }
+
+ if(verbose) {
+ cout << "Tracking ... "; cout.flush();
+ gettimeofday(&start_time, 0);
+ }
+ tracker->track();
+ if(verbose) {
+ gettimeofday(&end_time, 0);
+ cout << "done (" << diff_in_second(&start_time, &end_time) << "s)." << endl;
+ }
+
+ if(strcmp(trajectory_filename, "")) {
+ ofstream out_traj(trajectory_filename);
+ tracker->write_trajectories(&out_traj);
+ if(verbose) { cout << "Wrote " << trajectory_filename << "." << endl; }