Ver Fonte

added the k-shortest-paths algorithm
outsourced the graph definitions into an separate file

Helge Wrede há 9 anos atrás
pai
commit
d167ff8e05
81 ficheiros alterados com 1229 adições e 394 exclusões
  1. 14 24
      CMakeLists.txt
  2. 0 0
      Documentation/html/DetectionSequence_8h_source.html
  3. 0 0
      Documentation/html/FileIO_8h_source.html
  4. 0 0
      Documentation/html/Logger_8h_source.html
  5. 0 0
      Documentation/html/MyMath_8h_source.html
  6. 0 0
      Documentation/html/ObjectData3D_8h_source.html
  7. 0 0
      Documentation/html/ObjectDataAngular_8h_source.html
  8. 0 0
      Documentation/html/ObjectDataMap_8h_source.html
  9. 0 0
      Documentation/html/ObjectData_8h_source.html
  10. 0 0
      Documentation/html/Parser_8h_source.html
  11. 0 0
      Documentation/html/Tracklet_8h_source.html
  12. 0 0
      Documentation/html/TwoStage_8h_source.html
  13. 14 13
      Documentation/html/annotated.html
  14. 1 1
      Documentation/html/classalgo_1_1TwoStage-members.html
  15. 4 4
      Documentation/html/classalgo_1_1TwoStage.html
  16. 13 13
      Documentation/html/classes.html
  17. 4 2
      Documentation/html/classutil_1_1FileIO-members.html
  18. 110 10
      Documentation/html/classutil_1_1FileIO.html
  19. 4 4
      Documentation/html/classutil_1_1Parser-members.html
  20. 16 16
      Documentation/html/classutil_1_1Parser.html
  21. 12 13
      Documentation/html/files.html
  22. 28 6
      Documentation/html/functions.html
  23. 28 6
      Documentation/html/functions_func.html
  24. 10 9
      Documentation/html/hierarchy.html
  25. 1 1
      Documentation/html/search/all_1.js
  26. 2 6
      Documentation/html/search/all_7.js
  27. 7 1
      Documentation/html/search/all_8.js
  28. 1 10
      Documentation/html/search/all_9.js
  29. 10 5
      Documentation/html/search/all_a.js
  30. 5 1
      Documentation/html/search/all_b.js
  31. 2 7
      Documentation/html/search/all_c.js
  32. 7 4
      Documentation/html/search/all_d.js
  33. 4 1
      Documentation/html/search/all_e.js
  34. 1 1
      Documentation/html/search/classes_2.js
  35. 1 1
      Documentation/html/search/classes_3.js
  36. 1 4
      Documentation/html/search/classes_4.js
  37. 4 1
      Documentation/html/search/classes_5.js
  38. 1 2
      Documentation/html/search/classes_6.js
  39. 1 1
      Documentation/html/search/functions_1.js
  40. 1 5
      Documentation/html/search/functions_7.js
  41. 6 5
      Documentation/html/search/functions_8.js
  42. 5 4
      Documentation/html/search/functions_9.js
  43. 4 1
      Documentation/html/search/functions_a.js
  44. 2 7
      Documentation/html/search/functions_b.js
  45. 7 2
      Documentation/html/search/functions_c.js
  46. 2 1
      Documentation/html/search/functions_d.js
  47. 3 3
      Documentation/html/search/searchdata.js
  48. 1 0
      Documentation/latex/annotated.tex
  49. 4 4
      Documentation/latex/classalgo_1_1TwoStage.tex
  50. BIN
      Documentation/latex/classcore_1_1ObjectData.pdf
  51. BIN
      Documentation/latex/classcore_1_1ObjectData3D.pdf
  52. BIN
      Documentation/latex/classcore_1_1ObjectDataAngular.pdf
  53. BIN
      Documentation/latex/classcore_1_1ObjectDataMap.pdf
  54. BIN
      Documentation/latex/classcore_1_1Tracklet.pdf
  55. 50 10
      Documentation/latex/classutil_1_1FileIO.tex
  56. 16 16
      Documentation/latex/classutil_1_1Parser.tex
  57. 1 0
      Documentation/latex/hierarchy.tex
  58. 1 0
      Documentation/latex/refman.tex
  59. 0 36
      algo/Definitions.h
  60. 336 0
      algo/KShortestPaths.cpp
  61. 156 0
      algo/KShortestPaths.h
  62. 12 11
      algo/TwoStage.cpp
  63. 9 8
      algo/TwoStage.h
  64. 0 28
      core/Definitions.h
  65. 0 1
      core/DetectionSequence.h
  66. 4 1
      core/ObjectData.h
  67. 2 2
      core/ObjectData3D.cpp
  68. 3 0
      core/ObjectData3D.h
  69. 1 3
      core/ObjectDataAngular.cpp
  70. 3 0
      core/ObjectDataAngular.h
  71. 3 0
      core/ObjectDataMap.h
  72. 3 0
      core/Tracklet.h
  73. 39 0
      graph/Definitions.h
  74. 127 12
      main/main.cpp
  75. 1 1
      main/preview.cpp
  76. 68 4
      util/FileIO.cpp
  77. 33 5
      util/FileIO.h
  78. 6 7
      util/Parser.cpp
  79. 11 12
      util/Parser.h
  80. 3 28
      visual/Visualizer.cpp
  81. 0 10
      visual/Visualizer.h

+ 14 - 24
CMakeLists.txt

@@ -8,30 +8,20 @@ include_directories(${HOME_LOCAL}/include)
 
 set(SOURCE_FILES
         main/main.cpp
-        core/DetectionSequence.cpp
-        core/DetectionSequence.h
-        core/ObjectData.cpp
-        core/ObjectData.h
-        core/ObjectDataMap.cpp
-        core/ObjectDataMap.h
-        core/Definitions.h
-        core/Tracklet.cpp
-        core/Tracklet.h
-        util/FileIO.cpp
-        util/FileIO.h
-        util/Parser.cpp
-        util/Parser.h
-        algo/TwoStage.cpp
-        algo/TwoStage.h
-        algo/Definitions.h
-        util/MyMath.cpp
-        util/MyMath.h
-        core/ObjectData3D.cpp
-        core/ObjectData3D.h
-        visual/Visualizer.cpp
-        visual/Visualizer.h
-        util/Logger.cpp
-        util/Logger.h core/ObjectDataAngular.cpp core/ObjectDataAngular.h)
+        core/DetectionSequence.cpp core/DetectionSequence.h
+        core/ObjectData.cpp core/ObjectData.h
+        core/ObjectDataMap.cpp core/ObjectDataMap.h
+        core/Tracklet.cpp core/Tracklet.h
+        util/FileIO.cpp util/FileIO.h
+        util/Parser.cpp util/Parser.h
+        algo/TwoStage.cpp algo/TwoStage.h
+        util/MyMath.cpp util/MyMath.h
+        core/ObjectData3D.cpp core/ObjectData3D.h
+        visual/Visualizer.cpp visual/Visualizer.h
+        util/Logger.cpp util/Logger.h
+        core/ObjectDataAngular.cpp core/ObjectDataAngular.h
+        algo/KShortestPaths.cpp algo/KShortestPaths.h
+        graph/Definitions.h)
 
 find_package(Doxygen)
 

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/DetectionSequence_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/FileIO_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/Logger_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/MyMath_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/ObjectData3D_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/ObjectDataAngular_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/ObjectDataMap_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/ObjectData_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/Parser_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/Tracklet_8h_source.html


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
Documentation/html/TwoStage_8h_source.html


+ 14 - 13
Documentation/html/annotated.html

@@ -90,19 +90,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
 <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>algo</b></td><td class="desc"></td></tr>
-<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1TwoStage.html" target="_self">TwoStage</a></td><td class="desc"></td></tr>
-<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>core</b></td><td class="desc"></td></tr>
-<tr id="row_1_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1DetectionSequence.html" target="_self">DetectionSequence</a></td><td class="desc"></td></tr>
-<tr id="row_1_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData.html" target="_self">ObjectData</a></td><td class="desc"></td></tr>
-<tr id="row_1_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData3D.html" target="_self">ObjectData3D</a></td><td class="desc"></td></tr>
-<tr id="row_1_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataAngular.html" target="_self">ObjectDataAngular</a></td><td class="desc"></td></tr>
-<tr id="row_1_4_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataMap.html" target="_self">ObjectDataMap</a></td><td class="desc"></td></tr>
-<tr id="row_1_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1Tracklet.html" target="_self">Tracklet</a></td><td class="desc"></td></tr>
-<tr id="row_2_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>util</b></td><td class="desc"></td></tr>
-<tr id="row_2_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1FileIO.html" target="_self">FileIO</a></td><td class="desc"></td></tr>
-<tr id="row_2_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Logger.html" target="_self">Logger</a></td><td class="desc"></td></tr>
-<tr id="row_2_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1MyMath.html" target="_self">MyMath</a></td><td class="desc"></td></tr>
-<tr id="row_2_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Parser.html" target="_self">Parser</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1KShortestPaths.html" target="_self">KShortestPaths</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1TwoStage.html" target="_self">TwoStage</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>core</b></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1DetectionSequence.html" target="_self">DetectionSequence</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData.html" target="_self">ObjectData</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData3D.html" target="_self">ObjectData3D</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataAngular.html" target="_self">ObjectDataAngular</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataMap.html" target="_self">ObjectDataMap</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1Tracklet.html" target="_self">Tracklet</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span class="icona"><span class="icon">N</span></span><b>util</b></td><td class="desc"></td></tr>
+<tr id="row_2_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1FileIO.html" target="_self">FileIO</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Logger.html" target="_self">Logger</a></td><td class="desc"></td></tr>
+<tr id="row_2_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1MyMath.html" target="_self">MyMath</a></td><td class="desc"></td></tr>
+<tr id="row_2_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Parser.html" target="_self">Parser</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->

+ 1 - 1
Documentation/html/classalgo_1_1TwoStage-members.html

@@ -94,7 +94,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <p>This is the complete list of members for <a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11">CreateObjectGraph</a>(DirectedGraph &amp;graph, core::DetectionSequence &amp;detections)</td><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a></td><td class="entry"></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a">CreateObjectGraph</a>(DirectedGraph &amp;graph, const core::DetectionSequence &amp;detections)</td><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837">CreateTrackletGraph</a>(DirectedGraph &amp;obj_graph, DirectedGraph &amp;tlt_graph, size_t frame_count)</td><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a></td><td class="entry"></td></tr>
   <tr class="even"><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html#a09168d0ace15d689c9d594ca16b93c38">ExtractTracks</a>(DirectedGraph &amp;tlt_graph, size_t depth, std::vector&lt; core::TrackletPtr &gt; &amp;tracks)</td><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a></td><td class="entry"></td></tr>
   <tr><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7">TwoStage</a>(size_t max_frame_skip, double penalty_value, size_t max_tracklet_count)</td><td class="entry"><a class="el" href="classalgo_1_1TwoStage.html">algo::TwoStage</a></td><td class="entry"></td></tr>

+ 4 - 4
Documentation/html/classalgo_1_1TwoStage.html

@@ -101,8 +101,8 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 Public Member Functions</h2></td></tr>
 <tr class="memitem:ae302f9ea93d56155a9dbd0be060500f7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7">TwoStage</a> (size_t max_frame_skip, double penalty_value, size_t max_tracklet_count)</td></tr>
 <tr class="separator:ae302f9ea93d56155a9dbd0be060500f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:aa2b03f5bc30427ec5d0a7ca703e25e11"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11">CreateObjectGraph</a> (DirectedGraph &amp;graph, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;detections)</td></tr>
-<tr class="separator:aa2b03f5bc30427ec5d0a7ca703e25e11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02dfe4e3fb244ecad13f676ce53d689a"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a">CreateObjectGraph</a> (DirectedGraph &amp;graph, const <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;detections)</td></tr>
+<tr class="separator:a02dfe4e3fb244ecad13f676ce53d689a"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:ae14cf79859b4275c862d6750b6bc6837"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837">CreateTrackletGraph</a> (DirectedGraph &amp;obj_graph, DirectedGraph &amp;tlt_graph, size_t frame_count)</td></tr>
 <tr class="separator:ae14cf79859b4275c862d6750b6bc6837"><td class="memSeparator" colspan="2">&#160;</td></tr>
 <tr class="memitem:a09168d0ace15d689c9d594ca16b93c38"><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classalgo_1_1TwoStage.html#a09168d0ace15d689c9d594ca16b93c38">ExtractTracks</a> (DirectedGraph &amp;tlt_graph, size_t depth, std::vector&lt; core::TrackletPtr &gt; &amp;tracks)</td></tr>
@@ -152,7 +152,7 @@ Public Member Functions</h2></td></tr>
 </div>
 </div>
 <h2 class="groupheader">Member Function Documentation</h2>
-<a class="anchor" id="aa2b03f5bc30427ec5d0a7ca703e25e11"></a>
+<a class="anchor" id="a02dfe4e3fb244ecad13f676ce53d689a"></a>
 <div class="memitem">
 <div class="memproto">
       <table class="memname">
@@ -165,7 +165,7 @@ Public Member Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype"><a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;&#160;</td>
+          <td class="paramtype">const <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;&#160;</td>
           <td class="paramname"><em>detections</em>&#160;</td>
         </tr>
         <tr>

+ 13 - 13
Documentation/html/classes.html

@@ -87,25 +87,25 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="title">Class Index</div>  </div>
 </div><!--header-->
 <div class="contents">
-<div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_M">M</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a></div>
+<div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_K">K</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_M">M</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a></div>
 <table class="classindex">
 <tr><td rowspan="2" valign="bottom"><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;D&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_K"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;K&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;M&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classcore_1_1ObjectData3D.html">ObjectData3D</a> (core)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;T&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="classcore_1_1ObjectDataAngular.html">ObjectDataAngular</a> (core)&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="classcore_1_1DetectionSequence.html">DetectionSequence</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classalgo_1_1KShortestPaths.html">KShortestPaths</a> (algo)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1MyMath.html">MyMath</a> (util)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classcore_1_1ObjectDataMap.html">ObjectDataMap</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classcore_1_1Tracklet.html">Tracklet</a> (core)&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
 </td><td rowspan="2" valign="bottom"><a name="letter_L"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;L&#160;&#160;</div></td></tr></table>
 </td><td rowspan="2" valign="bottom"><a name="letter_O"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;O&#160;&#160;</div></td></tr></table>
-</td><td valign="top"><a class="el" href="classcore_1_1ObjectDataMap.html">ObjectDataMap</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classalgo_1_1TwoStage.html">TwoStage</a> (algo)&#160;&#160;&#160;</td></tr>
-<tr><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
-</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="classcore_1_1DetectionSequence.html">DetectionSequence</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1Logger.html">Logger</a> (util)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classcore_1_1ObjectData.html">ObjectData</a> (core)&#160;&#160;&#160;</td><td></td></tr>
-<tr><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
-</td><td rowspan="2" valign="bottom"><a name="letter_M"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;M&#160;&#160;</div></td></tr></table>
-</td><td valign="top"><a class="el" href="classcore_1_1ObjectData3D.html">ObjectData3D</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1Parser.html">Parser</a> (util)&#160;&#160;&#160;</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="classcore_1_1ObjectDataAngular.html">ObjectDataAngular</a> (core)&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;T&#160;&#160;</div></td></tr></table>
-</td><td></td></tr>
-<tr><td valign="top"><a class="el" href="classutil_1_1FileIO.html">FileIO</a> (util)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1MyMath.html">MyMath</a> (util)&#160;&#160;&#160;</td><td></td><td></td></tr>
-<tr><td></td><td></td><td></td><td valign="top"><a class="el" href="classcore_1_1Tracklet.html">Tracklet</a> (core)&#160;&#160;&#160;</td><td></td></tr>
+</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classalgo_1_1TwoStage.html">TwoStage</a> (algo)&#160;&#160;&#160;</td></tr>
+<tr><td></td></tr>
+<tr><td valign="top"><a class="el" href="classutil_1_1FileIO.html">FileIO</a> (util)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1Logger.html">Logger</a> (util)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classcore_1_1ObjectData.html">ObjectData</a> (core)&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classutil_1_1Parser.html">Parser</a> (util)&#160;&#160;&#160;</td><td></td></tr>
 <tr><td></td><td></td><td></td><td></td><td></td></tr>
 </table>
-<div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_M">M</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a></div>
+<div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_K">K</a>&#160;|&#160;<a class="qindex" href="#letter_L">L</a>&#160;|&#160;<a class="qindex" href="#letter_M">M</a>&#160;|&#160;<a class="qindex" href="#letter_O">O</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a></div>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>

+ 4 - 2
Documentation/html/classutil_1_1FileIO-members.html

@@ -94,8 +94,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <p>This is the complete list of members for <a class="el" href="classutil_1_1FileIO.html">util::FileIO</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4">ReadCSV</a>(core::Vector3d &amp;values, const std::string &amp;filename, const char &amp;delimiter=';')</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classutil_1_1FileIO.html#a5d145cb872989165f76d00c343170bc5">ReadCSV</a>(core::Vector2d &amp;values, const std::string &amp;filename, const char &amp;delimiter=';')</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa">ListFiles</a>(const std::string &amp;folder, std::vector&lt; std::string &gt; &amp;file_names, bool sort=true)</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677">ReadCSV</a>(Vector3d &amp;values, const std::string &amp;filename, char delimiter=';')</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1FileIO.html#a264c9b694fd7218635c8a783956d2c1e">ReadCSV</a>(Vector2d &amp;values, const std::string &amp;filename, char delimiter=';')</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classutil_1_1FileIO.html#a862586aced240e732ecd35773b57c267">WriteCSVMatlab</a>(DirectedGraph &amp;graph, const std::string &amp;file_name, char delimiter=';')</td><td class="entry"><a class="el" href="classutil_1_1FileIO.html">util::FileIO</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>

+ 110 - 10
Documentation/html/classutil_1_1FileIO.html

@@ -99,15 +99,67 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
 Static Public Member Functions</h2></td></tr>
-<tr class="memitem:acfce3977f435f2b024984da05408dfb4"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4">ReadCSV</a> (core::Vector3d &amp;values, const std::string &amp;filename, const char &amp;delimiter=';')</td></tr>
-<tr class="separator:acfce3977f435f2b024984da05408dfb4"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5d145cb872989165f76d00c343170bc5"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#a5d145cb872989165f76d00c343170bc5">ReadCSV</a> (core::Vector2d &amp;values, const std::string &amp;filename, const char &amp;delimiter=';')</td></tr>
-<tr class="separator:a5d145cb872989165f76d00c343170bc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af42c183525923014e142a10a626d3677"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677">ReadCSV</a> (Vector3d &amp;values, const std::string &amp;filename, char delimiter=';')</td></tr>
+<tr class="separator:af42c183525923014e142a10a626d3677"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a264c9b694fd7218635c8a783956d2c1e"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#a264c9b694fd7218635c8a783956d2c1e">ReadCSV</a> (Vector2d &amp;values, const std::string &amp;filename, char delimiter=';')</td></tr>
+<tr class="separator:a264c9b694fd7218635c8a783956d2c1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e290e22083d49619b757bfca96a51fa"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa">ListFiles</a> (const std::string &amp;folder, std::vector&lt; std::string &gt; &amp;file_names, bool sort=true)</td></tr>
+<tr class="separator:a6e290e22083d49619b757bfca96a51fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a862586aced240e732ecd35773b57c267"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1FileIO.html#a862586aced240e732ecd35773b57c267">WriteCSVMatlab</a> (DirectedGraph &amp;graph, const std::string &amp;file_name, char delimiter=';')</td></tr>
+<tr class="separator:a862586aced240e732ecd35773b57c267"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Utility class for file in- and output. </p>
 </div><h2 class="groupheader">Member Function Documentation</h2>
-<a class="anchor" id="acfce3977f435f2b024984da05408dfb4"></a>
+<a class="anchor" id="a6e290e22083d49619b757bfca96a51fa"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+  <tr>
+  <td class="mlabels-left">
+      <table class="memname">
+        <tr>
+          <td class="memname">void util::FileIO::ListFiles </td>
+          <td>(</td>
+          <td class="paramtype">const std::string &amp;&#160;</td>
+          <td class="paramname"><em>folder</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">std::vector&lt; std::string &gt; &amp;&#160;</td>
+          <td class="paramname"><em>file_names</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">bool&#160;</td>
+          <td class="paramname"><em>sort</em> = <code>true</code>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+  </td>
+  <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span>  </td>
+  </tr>
+</table>
+</div><div class="memdoc">
+<p>Lists all file names in the given folder. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">folder</td><td>The folder to look into </td></tr>
+    <tr><td class="paramname">file_names</td><td>The vector to store the file names into </td></tr>
+    <tr><td class="paramname">sort</td><td>True, if the files should be sorted alphabetically </td></tr>
+  </table>
+  </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="af42c183525923014e142a10a626d3677"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -117,7 +169,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="memname">void util::FileIO::ReadCSV </td>
           <td>(</td>
-          <td class="paramtype">core::Vector3d &amp;&#160;</td>
+          <td class="paramtype">Vector3d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>
@@ -129,7 +181,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const char &amp;&#160;</td>
+          <td class="paramtype">char&#160;</td>
           <td class="paramname"><em>delimiter</em> = <code>';'</code>&#160;</td>
         </tr>
         <tr>
@@ -155,7 +207,7 @@ Static Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a5d145cb872989165f76d00c343170bc5"></a>
+<a class="anchor" id="a264c9b694fd7218635c8a783956d2c1e"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -165,7 +217,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="memname">void util::FileIO::ReadCSV </td>
           <td>(</td>
-          <td class="paramtype">core::Vector2d &amp;&#160;</td>
+          <td class="paramtype">Vector2d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>
@@ -177,7 +229,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const char &amp;&#160;</td>
+          <td class="paramtype">char&#160;</td>
           <td class="paramname"><em>delimiter</em> = <code>';'</code>&#160;</td>
         </tr>
         <tr>
@@ -201,6 +253,54 @@ Static Public Member Functions</h2></td></tr>
   </dd>
 </dl>
 
+</div>
+</div>
+<a class="anchor" id="a862586aced240e732ecd35773b57c267"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+  <tr>
+  <td class="mlabels-left">
+      <table class="memname">
+        <tr>
+          <td class="memname">void util::FileIO::WriteCSVMatlab </td>
+          <td>(</td>
+          <td class="paramtype">DirectedGraph &amp;&#160;</td>
+          <td class="paramname"><em>graph</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">const std::string &amp;&#160;</td>
+          <td class="paramname"><em>file_name</em>, </td>
+        </tr>
+        <tr>
+          <td class="paramkey"></td>
+          <td></td>
+          <td class="paramtype">char&#160;</td>
+          <td class="paramname"><em>delimiter</em> = <code>';'</code>&#160;</td>
+        </tr>
+        <tr>
+          <td></td>
+          <td>)</td>
+          <td></td><td></td>
+        </tr>
+      </table>
+  </td>
+  <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span>  </td>
+  </tr>
+</table>
+</div><div class="memdoc">
+<p>Writes the given graph into a CSV file with an format readable by Matlab. </p><dl class="params"><dt>Parameters</dt><dd>
+  <table class="params">
+    <tr><td class="paramname">graph</td><td>The graph to write </td></tr>
+    <tr><td class="paramname">file_name</td><td>The name of the file to write into </td></tr>
+    <tr><td class="paramname">delimiter</td><td>The delimiter to use </td></tr>
+  </table>
+  </dd>
+</dl>
+
 </div>
 </div>
 <hr/>The documentation for this class was generated from the following files:<ul>

+ 4 - 4
Documentation/html/classutil_1_1Parser-members.html

@@ -94,10 +94,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <p>This is the complete list of members for <a class="el" href="classutil_1_1Parser.html">util::Parser</a>, including all inherited members.</p>
 <table class="directory">
-  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92">ParseObjectData3D</a>(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a">ParseObjectDataAngular</a>(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1Parser.html#a5a4c53339551dbf67bd351fd0fe2c087">ParseObjectDataAngular</a>(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
-  <tr><td class="entry"><a class="el" href="classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a">ParseObjectDataMap</a>(const std::vector&lt; std::string &gt; &amp;keys, const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298">ParseObjectData3D</a>(const Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c">ParseObjectDataAngular</a>(const Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr class="even"><td class="entry"><a class="el" href="classutil_1_1Parser.html#a0f2ad399b88036840fa206704253cb56">ParseObjectDataAngular</a>(const Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+  <tr><td class="entry"><a class="el" href="classutil_1_1Parser.html#a25a262843b391df324db620205a13156">ParseObjectDataMap</a>(const std::vector&lt; std::string &gt; &amp;keys, const Vector3d &amp;values, core::DetectionSequence &amp;sequence)</td><td class="entry"><a class="el" href="classutil_1_1Parser.html">util::Parser</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
 </table></div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>

+ 16 - 16
Documentation/html/classutil_1_1Parser.html

@@ -99,19 +99,19 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <table class="memberdecls">
 <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
 Static Public Member Functions</h2></td></tr>
-<tr class="memitem:ac2095e8699706079dde135098f30de0a"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a">ParseObjectDataMap</a> (const std::vector&lt; std::string &gt; &amp;keys, const core::Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
-<tr class="separator:ac2095e8699706079dde135098f30de0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:afbc0421d8672a418284efb5a9b6cec92"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92">ParseObjectData3D</a> (const core::Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
-<tr class="separator:afbc0421d8672a418284efb5a9b6cec92"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a314cfd3ebd16ab18cd132e7d8dd4c04a"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a">ParseObjectDataAngular</a> (const core::Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
-<tr class="separator:a314cfd3ebd16ab18cd132e7d8dd4c04a"><td class="memSeparator" colspan="2">&#160;</td></tr>
-<tr class="memitem:a5a4c53339551dbf67bd351fd0fe2c087"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#a5a4c53339551dbf67bd351fd0fe2c087">ParseObjectDataAngular</a> (const core::Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)</td></tr>
-<tr class="separator:a5a4c53339551dbf67bd351fd0fe2c087"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25a262843b391df324db620205a13156"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#a25a262843b391df324db620205a13156">ParseObjectDataMap</a> (const std::vector&lt; std::string &gt; &amp;keys, const Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
+<tr class="separator:a25a262843b391df324db620205a13156"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4372acb257c7c0292439f1c863287298"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298">ParseObjectData3D</a> (const Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
+<tr class="separator:a4372acb257c7c0292439f1c863287298"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acad67e4a565fb4a008a2d85fa9ea215c"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c">ParseObjectDataAngular</a> (const Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence)</td></tr>
+<tr class="separator:acad67e4a565fb4a008a2d85fa9ea215c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f2ad399b88036840fa206704253cb56"><td class="memItemLeft" align="right" valign="top">static void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classutil_1_1Parser.html#a0f2ad399b88036840fa206704253cb56">ParseObjectDataAngular</a> (const Vector3d &amp;values, <a class="el" href="classcore_1_1DetectionSequence.html">core::DetectionSequence</a> &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)</td></tr>
+<tr class="separator:a0f2ad399b88036840fa206704253cb56"><td class="memSeparator" colspan="2">&#160;</td></tr>
 </table>
 <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
 <div class="textblock"><p>Utility class for parsing diverse objects. </p>
 </div><h2 class="groupheader">Member Function Documentation</h2>
-<a class="anchor" id="afbc0421d8672a418284efb5a9b6cec92"></a>
+<a class="anchor" id="a4372acb257c7c0292439f1c863287298"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -121,7 +121,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="memname">void util::Parser::ParseObjectData3D </td>
           <td>(</td>
-          <td class="paramtype">const core::Vector3d &amp;&#160;</td>
+          <td class="paramtype">const Vector3d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>
@@ -152,7 +152,7 @@ Static Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a314cfd3ebd16ab18cd132e7d8dd4c04a"></a>
+<a class="anchor" id="acad67e4a565fb4a008a2d85fa9ea215c"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -162,7 +162,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="memname">void util::Parser::ParseObjectDataAngular </td>
           <td>(</td>
-          <td class="paramtype">const core::Vector3d &amp;&#160;</td>
+          <td class="paramtype">const Vector3d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>
@@ -193,7 +193,7 @@ Static Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="a5a4c53339551dbf67bd351fd0fe2c087"></a>
+<a class="anchor" id="a0f2ad399b88036840fa206704253cb56"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -203,7 +203,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="memname">void util::Parser::ParseObjectDataAngular </td>
           <td>(</td>
-          <td class="paramtype">const core::Vector3d &amp;&#160;</td>
+          <td class="paramtype">const Vector3d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>
@@ -255,7 +255,7 @@ Static Public Member Functions</h2></td></tr>
 
 </div>
 </div>
-<a class="anchor" id="ac2095e8699706079dde135098f30de0a"></a>
+<a class="anchor" id="a25a262843b391df324db620205a13156"></a>
 <div class="memitem">
 <div class="memproto">
 <table class="mlabels">
@@ -271,7 +271,7 @@ Static Public Member Functions</h2></td></tr>
         <tr>
           <td class="paramkey"></td>
           <td></td>
-          <td class="paramtype">const core::Vector3d &amp;&#160;</td>
+          <td class="paramtype">const Vector3d &amp;&#160;</td>
           <td class="paramname"><em>values</em>, </td>
         </tr>
         <tr>

+ 12 - 13
Documentation/html/files.html

@@ -87,21 +87,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="textblock">Here is a list of all documented files with brief descriptions:</div><div class="directory">
 <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_0_" class="arrow" onclick="toggleFolder('0_')">&#9660;</span><span id="img_0_" class="iconfopen" onclick="toggleFolder('0_')">&#160;</span><a class="el" href="dir_14879d16547af1f036be9d5915ae128f.html" target="_self">algo</a></td><td class="desc"></td></tr>
-<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="algo_2Definitions_8h_source.html"><span class="icondoc"></span></a><b>Definitions.h</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="KShortestPaths_8h_source.html"><span class="icondoc"></span></a><b>KShortestPaths.h</b></td><td class="desc"></td></tr>
 <tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="TwoStage_8h_source.html"><span class="icondoc"></span></a><b>TwoStage.h</b></td><td class="desc"></td></tr>
 <tr id="row_1_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span id="img_1_" class="iconfopen" onclick="toggleFolder('1_')">&#160;</span><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html" target="_self">core</a></td><td class="desc"></td></tr>
-<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="core_2Definitions_8h_source.html"><span class="icondoc"></span></a><b>Definitions.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="DetectionSequence_8h_source.html"><span class="icondoc"></span></a><b>DetectionSequence.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectData_8h_source.html"><span class="icondoc"></span></a><b>ObjectData.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectData3D_8h_source.html"><span class="icondoc"></span></a><b>ObjectData3D.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectDataAngular_8h_source.html"><span class="icondoc"></span></a><b>ObjectDataAngular.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectDataMap_8h_source.html"><span class="icondoc"></span></a><b>ObjectDataMap.h</b></td><td class="desc"></td></tr>
-<tr id="row_1_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Tracklet_8h_source.html"><span class="icondoc"></span></a><b>Tracklet.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span id="img_2_" class="iconfopen" onclick="toggleFolder('2_')">&#160;</span><a class="el" href="dir_23ec12649285f9fabf3a6b7380226c28.html" target="_self">util</a></td><td class="desc"></td></tr>
-<tr id="row_2_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="FileIO_8h_source.html"><span class="icondoc"></span></a><b>FileIO.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Logger_8h_source.html"><span class="icondoc"></span></a><b>Logger.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="MyMath_8h_source.html"><span class="icondoc"></span></a><b>MyMath.h</b></td><td class="desc"></td></tr>
-<tr id="row_2_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Parser_8h_source.html"><span class="icondoc"></span></a><b>Parser.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="DetectionSequence_8h_source.html"><span class="icondoc"></span></a><b>DetectionSequence.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectData_8h_source.html"><span class="icondoc"></span></a><b>ObjectData.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectData3D_8h_source.html"><span class="icondoc"></span></a><b>ObjectData3D.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_3_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectDataAngular_8h_source.html"><span class="icondoc"></span></a><b>ObjectDataAngular.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="ObjectDataMap_8h_source.html"><span class="icondoc"></span></a><b>ObjectDataMap.h</b></td><td class="desc"></td></tr>
+<tr id="row_1_5_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Tracklet_8h_source.html"><span class="icondoc"></span></a><b>Tracklet.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span id="img_2_" class="iconfopen" onclick="toggleFolder('2_')">&#160;</span><a class="el" href="dir_23ec12649285f9fabf3a6b7380226c28.html" target="_self">util</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="FileIO_8h_source.html"><span class="icondoc"></span></a><b>FileIO.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Logger_8h_source.html"><span class="icondoc"></span></a><b>Logger.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="MyMath_8h_source.html"><span class="icondoc"></span></a><b>MyMath.h</b></td><td class="desc"></td></tr>
+<tr id="row_2_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="Parser_8h_source.html"><span class="icondoc"></span></a><b>Parser.h</b></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->

+ 28 - 6
Documentation/html/functions.html

@@ -83,13 +83,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
       <li><a href="#index_f"><span>f</span></a></li>
       <li><a href="#index_g"><span>g</span></a></li>
       <li><a href="#index_i"><span>i</span></a></li>
+      <li><a href="#index_k"><span>k</span></a></li>
       <li><a href="#index_l"><span>l</span></a></li>
       <li><a href="#index_o"><span>o</span></a></li>
       <li><a href="#index_p"><span>p</span></a></li>
       <li><a href="#index_r"><span>r</span></a></li>
       <li><a href="#index_s"><span>s</span></a></li>
       <li><a href="#index_t"><span>t</span></a></li>
-      <li class="current"><a href="#index_v"><span>v</span></a></li>
+      <li><a href="#index_v"><span>v</span></a></li>
+      <li class="current"><a href="#index_w"><span>w</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -135,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classcore_1_1Tracklet.html#a0357f2fa173941800571432dcbc96dc2">core::Tracklet</a>
 </li>
 <li>CreateObjectGraph()
-: <a class="el" href="classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11">algo::TwoStage</a>
+: <a class="el" href="classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a">algo::TwoStage</a>
 </li>
 <li>CreateTrackletGraph()
 : <a class="el" href="classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837">algo::TwoStage</a>
@@ -251,10 +253,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 </ul>
 
 
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KShortestPaths()
+: <a class="el" href="classalgo_1_1KShortestPaths.html#a2805f56b9abb112f10c752d125d623d8">algo::KShortestPaths</a>
+</li>
+</ul>
+
+
 <h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
 <li>Lerp()
 : <a class="el" href="classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1">util::MyMath</a>
 </li>
+<li>ListFiles()
+: <a class="el" href="classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa">util::FileIO</a>
+</li>
 <li>LogDebug()
 : <a class="el" href="classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee">util::Logger</a>
 </li>
@@ -295,13 +307,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
 <li>ParseObjectData3D()
-: <a class="el" href="classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298">util::Parser</a>
 </li>
 <li>ParseObjectDataAngular()
-: <a class="el" href="classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c">util::Parser</a>
 </li>
 <li>ParseObjectDataMap()
-: <a class="el" href="classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#a25a262843b391df324db620205a13156">util::Parser</a>
 </li>
 <li>Put()
 : <a class="el" href="classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5">core::ObjectDataMap</a>
@@ -311,7 +323,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
 <li>ReadCSV()
-: <a class="el" href="classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4">util::FileIO</a>
+: <a class="el" href="classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677">util::FileIO</a>
+</li>
+<li>Run()
+: <a class="el" href="classalgo_1_1KShortestPaths.html#ae77137136462303e951f631ba7db6adf">algo::KShortestPaths</a>
 </li>
 </ul>
 
@@ -360,6 +375,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classcore_1_1Tracklet.html#a85f92a4059bf89f24a83f28935675181">core::Tracklet</a>
 </li>
 </ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>WriteCSVMatlab()
+: <a class="el" href="classutil_1_1FileIO.html#a862586aced240e732ecd35773b57c267">util::FileIO</a>
+</li>
+</ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>

+ 28 - 6
Documentation/html/functions_func.html

@@ -83,13 +83,15 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
       <li><a href="#index_f"><span>f</span></a></li>
       <li><a href="#index_g"><span>g</span></a></li>
       <li><a href="#index_i"><span>i</span></a></li>
+      <li><a href="#index_k"><span>k</span></a></li>
       <li><a href="#index_l"><span>l</span></a></li>
       <li><a href="#index_o"><span>o</span></a></li>
       <li><a href="#index_p"><span>p</span></a></li>
       <li><a href="#index_r"><span>r</span></a></li>
       <li><a href="#index_s"><span>s</span></a></li>
       <li><a href="#index_t"><span>t</span></a></li>
-      <li class="current"><a href="#index_v"><span>v</span></a></li>
+      <li><a href="#index_v"><span>v</span></a></li>
+      <li class="current"><a href="#index_w"><span>w</span></a></li>
     </ul>
   </div>
 </div><!-- top -->
@@ -135,7 +137,7 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classcore_1_1Tracklet.html#a0357f2fa173941800571432dcbc96dc2">core::Tracklet</a>
 </li>
 <li>CreateObjectGraph()
-: <a class="el" href="classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11">algo::TwoStage</a>
+: <a class="el" href="classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a">algo::TwoStage</a>
 </li>
 <li>CreateTrackletGraph()
 : <a class="el" href="classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837">algo::TwoStage</a>
@@ -251,10 +253,20 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 </ul>
 
 
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KShortestPaths()
+: <a class="el" href="classalgo_1_1KShortestPaths.html#a2805f56b9abb112f10c752d125d623d8">algo::KShortestPaths</a>
+</li>
+</ul>
+
+
 <h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
 <li>Lerp()
 : <a class="el" href="classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1">util::MyMath</a>
 </li>
+<li>ListFiles()
+: <a class="el" href="classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa">util::FileIO</a>
+</li>
 <li>LogDebug()
 : <a class="el" href="classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee">util::Logger</a>
 </li>
@@ -291,13 +303,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
 <li>ParseObjectData3D()
-: <a class="el" href="classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298">util::Parser</a>
 </li>
 <li>ParseObjectDataAngular()
-: <a class="el" href="classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c">util::Parser</a>
 </li>
 <li>ParseObjectDataMap()
-: <a class="el" href="classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a">util::Parser</a>
+: <a class="el" href="classutil_1_1Parser.html#a25a262843b391df324db620205a13156">util::Parser</a>
 </li>
 <li>Put()
 : <a class="el" href="classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5">core::ObjectDataMap</a>
@@ -307,7 +319,10 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 
 <h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
 <li>ReadCSV()
-: <a class="el" href="classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4">util::FileIO</a>
+: <a class="el" href="classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677">util::FileIO</a>
+</li>
+<li>Run()
+: <a class="el" href="classalgo_1_1KShortestPaths.html#ae77137136462303e951f631ba7db6adf">algo::KShortestPaths</a>
 </li>
 </ul>
 
@@ -356,6 +371,13 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 , <a class="el" href="classcore_1_1Tracklet.html#a85f92a4059bf89f24a83f28935675181">core::Tracklet</a>
 </li>
 </ul>
+
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>WriteCSVMatlab()
+: <a class="el" href="classutil_1_1FileIO.html#a862586aced240e732ecd35773b57c267">util::FileIO</a>
+</li>
+</ul>
 </div><!-- contents -->
 <!-- start footer part -->
 <hr class="footer"/><address class="footer"><small>

+ 10 - 9
Documentation/html/hierarchy.html

@@ -91,15 +91,16 @@ var searchBox = new SearchBox("searchBox", "search",false,'Search');
 <div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span>]</div><table class="directory">
 <tr id="row_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1DetectionSequence.html" target="_self">core::DetectionSequence</a></td><td class="desc"></td></tr>
 <tr id="row_1_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1FileIO.html" target="_self">util::FileIO</a></td><td class="desc"></td></tr>
-<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Logger.html" target="_self">util::Logger</a></td><td class="desc"></td></tr>
-<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1MyMath.html" target="_self">util::MyMath</a></td><td class="desc"></td></tr>
-<tr id="row_4_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_4_" class="arrow" onclick="toggleFolder('4_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData.html" target="_self">core::ObjectData</a></td><td class="desc"></td></tr>
-<tr id="row_4_0_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_4_0_" class="arrow" onclick="toggleFolder('4_0_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData3D.html" target="_self">core::ObjectData3D</a></td><td class="desc"></td></tr>
-<tr id="row_4_0_0_" class="even"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataAngular.html" target="_self">core::ObjectDataAngular</a></td><td class="desc"></td></tr>
-<tr id="row_4_1_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataMap.html" target="_self">core::ObjectDataMap</a></td><td class="desc"></td></tr>
-<tr id="row_4_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1Tracklet.html" target="_self">core::Tracklet</a></td><td class="desc"></td></tr>
-<tr id="row_5_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Parser.html" target="_self">util::Parser</a></td><td class="desc"></td></tr>
-<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1TwoStage.html" target="_self">algo::TwoStage</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1KShortestPaths.html" target="_self">algo::KShortestPaths</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Logger.html" target="_self">util::Logger</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1MyMath.html" target="_self">util::MyMath</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_5_" class="arrow" onclick="toggleFolder('5_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData.html" target="_self">core::ObjectData</a></td><td class="desc"></td></tr>
+<tr id="row_5_0_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span id="arr_5_0_" class="arrow" onclick="toggleFolder('5_0_')">&#9660;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectData3D.html" target="_self">core::ObjectData3D</a></td><td class="desc"></td></tr>
+<tr id="row_5_0_0_"><td class="entry"><span style="width:48px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataAngular.html" target="_self">core::ObjectDataAngular</a></td><td class="desc"></td></tr>
+<tr id="row_5_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1ObjectDataMap.html" target="_self">core::ObjectDataMap</a></td><td class="desc"></td></tr>
+<tr id="row_5_2_"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classcore_1_1Tracklet.html" target="_self">core::Tracklet</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classutil_1_1Parser.html" target="_self">util::Parser</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><span style="width:16px;display:inline-block;">&#160;</span><span class="icona"><span class="icon">C</span></span><a class="el" href="classalgo_1_1TwoStage.html" target="_self">algo::TwoStage</a></td><td class="desc"></td></tr>
 </table>
 </div><!-- directory -->
 </div><!-- contents -->

+ 1 - 1
Documentation/html/search/all_1.js

@@ -3,6 +3,6 @@ var searchData=
   ['clamp',['Clamp',['../classutil_1_1MyMath.html#a367a261dc52a85cc97ba376799ed13a3',1,'util::MyMath']]],
   ['clear',['Clear',['../classcore_1_1DetectionSequence.html#ab62569a3e51d58457057deba12ef6892',1,'core::DetectionSequence']]],
   ['compareto',['CompareTo',['../classcore_1_1ObjectData.html#afbf7a1e87235f1b204d4d2eb8a37a9a6',1,'core::ObjectData::CompareTo()'],['../classcore_1_1ObjectData3D.html#abef3e4e7a0dc121d8a403d91964be576',1,'core::ObjectData3D::CompareTo()'],['../classcore_1_1ObjectDataAngular.html#a2932240c6c082b76f2c04723cdf3e4f9',1,'core::ObjectDataAngular::CompareTo()'],['../classcore_1_1ObjectDataMap.html#a7fcc9ef5b684f14d33711348610d9b74',1,'core::ObjectDataMap::CompareTo()'],['../classcore_1_1Tracklet.html#a0357f2fa173941800571432dcbc96dc2',1,'core::Tracklet::CompareTo()']]],
-  ['createobjectgraph',['CreateObjectGraph',['../classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11',1,'algo::TwoStage']]],
+  ['createobjectgraph',['CreateObjectGraph',['../classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a',1,'algo::TwoStage']]],
   ['createtrackletgraph',['CreateTrackletGraph',['../classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837',1,'algo::TwoStage']]]
 ];

+ 2 - 6
Documentation/html/search/all_7.js

@@ -1,9 +1,5 @@
 var searchData=
 [
-  ['lerp',['Lerp',['../classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1',1,'util::MyMath']]],
-  ['logdebug',['LogDebug',['../classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee',1,'util::Logger']]],
-  ['logerror',['LogError',['../classutil_1_1Logger.html#a01ad6e5349f51964724f96a598c6d2a8',1,'util::Logger']]],
-  ['logger',['Logger',['../classutil_1_1Logger.html',1,'util']]],
-  ['logger',['Logger',['../classutil_1_1Logger.html#a83d4f38e648b39fa61a2b9b3172bda12',1,'util::Logger']]],
-  ['loginfo',['LogInfo',['../classutil_1_1Logger.html#a37504d39ec90bebffc3d02d61d47afea',1,'util::Logger']]]
+  ['kshortestpaths',['KShortestPaths',['../classalgo_1_1KShortestPaths.html',1,'algo']]],
+  ['kshortestpaths',['KShortestPaths',['../classalgo_1_1KShortestPaths.html#a2805f56b9abb112f10c752d125d623d8',1,'algo::KShortestPaths']]]
 ];

+ 7 - 1
Documentation/html/search/all_8.js

@@ -1,4 +1,10 @@
 var searchData=
 [
-  ['mymath',['MyMath',['../classutil_1_1MyMath.html',1,'util']]]
+  ['lerp',['Lerp',['../classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1',1,'util::MyMath']]],
+  ['listfiles',['ListFiles',['../classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa',1,'util::FileIO']]],
+  ['logdebug',['LogDebug',['../classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee',1,'util::Logger']]],
+  ['logerror',['LogError',['../classutil_1_1Logger.html#a01ad6e5349f51964724f96a598c6d2a8',1,'util::Logger']]],
+  ['logger',['Logger',['../classutil_1_1Logger.html',1,'util']]],
+  ['logger',['Logger',['../classutil_1_1Logger.html#a83d4f38e648b39fa61a2b9b3172bda12',1,'util::Logger']]],
+  ['loginfo',['LogInfo',['../classutil_1_1Logger.html#a37504d39ec90bebffc3d02d61d47afea',1,'util::Logger']]]
 ];

+ 1 - 10
Documentation/html/search/all_9.js

@@ -1,13 +1,4 @@
 var searchData=
 [
-  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html',1,'core']]],
-  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html#a7f47a396a3b9e8c12a1557c8156b8ff9',1,'core::ObjectData::ObjectData()'],['../classcore_1_1ObjectData.html#af4333a52b012841a6ba73b25aeaae71b',1,'core::ObjectData::ObjectData(std::size_t frame_index)']]],
-  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html',1,'core']]],
-  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html#a47c967cffcbd109f1366069958a71699',1,'core::ObjectData3D']]],
-  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html#acc9d75397b5e4aa43a05f2366b00ccfa',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle)'],['../classcore_1_1ObjectDataAngular.html#ae2c40f53f5dc630d610cf513bf4cd767',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle, double temporal_weight, double spatial_weight, double angular_weight)']]],
-  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html',1,'core']]],
-  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html',1,'core']]],
-  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html#ac6df34682a715db6845667f7dda1c795',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index)'],['../classcore_1_1ObjectDataMap.html#a573add8d73646e6c5f183a9a0c159596',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list)'],['../classcore_1_1ObjectDataMap.html#a5727c237d73f3f16c94a748c1b9b0c74',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list, std::vector&lt; double &gt; weight_list)'],['../classcore_1_1ObjectDataMap.html#ad2af0de7438ed72be68348ac992568b6',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; std::pair&lt; double, double &gt;&gt; value_weight_list)']]],
-  ['operator_3c_3c',['operator&lt;&lt;',['../classcore_1_1DetectionSequence.html#a557132cfbb170daf47f5a890a0c5bac0',1,'core::DetectionSequence::operator&lt;&lt;()'],['../classcore_1_1ObjectData.html#a56fc9b6184428bf4d80826bbb9fe4c6f',1,'core::ObjectData::operator&lt;&lt;()']]],
-  ['operator_3d',['operator=',['../classutil_1_1Logger.html#a4e9e8b8d0e75058265037976d9b256de',1,'util::Logger']]]
+  ['mymath',['MyMath',['../classutil_1_1MyMath.html',1,'util']]]
 ];

+ 10 - 5
Documentation/html/search/all_a.js

@@ -1,8 +1,13 @@
 var searchData=
 [
-  ['parseobjectdata3d',['ParseObjectData3D',['../classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92',1,'util::Parser']]],
-  ['parseobjectdataangular',['ParseObjectDataAngular',['../classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a',1,'util::Parser::ParseObjectDataAngular(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence)'],['../classutil_1_1Parser.html#a5a4c53339551dbf67bd351fd0fe2c087',1,'util::Parser::ParseObjectDataAngular(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)']]],
-  ['parseobjectdatamap',['ParseObjectDataMap',['../classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a',1,'util::Parser']]],
-  ['parser',['Parser',['../classutil_1_1Parser.html',1,'util']]],
-  ['put',['Put',['../classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5',1,'core::ObjectDataMap::Put(std::string key, double value, double weight)'],['../classcore_1_1ObjectDataMap.html#a5cdd71b9124b5ca41419a0049fbbdaa1',1,'core::ObjectDataMap::Put(std::string key, std::pair&lt; double, double &gt; value_weight)']]]
+  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html',1,'core']]],
+  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html#a7f47a396a3b9e8c12a1557c8156b8ff9',1,'core::ObjectData::ObjectData()'],['../classcore_1_1ObjectData.html#af4333a52b012841a6ba73b25aeaae71b',1,'core::ObjectData::ObjectData(std::size_t frame_index)']]],
+  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html',1,'core']]],
+  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html#a47c967cffcbd109f1366069958a71699',1,'core::ObjectData3D']]],
+  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html#acc9d75397b5e4aa43a05f2366b00ccfa',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle)'],['../classcore_1_1ObjectDataAngular.html#ae2c40f53f5dc630d610cf513bf4cd767',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle, double temporal_weight, double spatial_weight, double angular_weight)']]],
+  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html',1,'core']]],
+  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html',1,'core']]],
+  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html#ac6df34682a715db6845667f7dda1c795',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index)'],['../classcore_1_1ObjectDataMap.html#a573add8d73646e6c5f183a9a0c159596',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list)'],['../classcore_1_1ObjectDataMap.html#a5727c237d73f3f16c94a748c1b9b0c74',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list, std::vector&lt; double &gt; weight_list)'],['../classcore_1_1ObjectDataMap.html#ad2af0de7438ed72be68348ac992568b6',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; std::pair&lt; double, double &gt;&gt; value_weight_list)']]],
+  ['operator_3c_3c',['operator&lt;&lt;',['../classcore_1_1DetectionSequence.html#a557132cfbb170daf47f5a890a0c5bac0',1,'core::DetectionSequence::operator&lt;&lt;()'],['../classcore_1_1ObjectData.html#a56fc9b6184428bf4d80826bbb9fe4c6f',1,'core::ObjectData::operator&lt;&lt;()']]],
+  ['operator_3d',['operator=',['../classutil_1_1Logger.html#a4e9e8b8d0e75058265037976d9b256de',1,'util::Logger']]]
 ];

+ 5 - 1
Documentation/html/search/all_b.js

@@ -1,4 +1,8 @@
 var searchData=
 [
-  ['readcsv',['ReadCSV',['../classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4',1,'util::FileIO::ReadCSV(core::Vector3d &amp;values, const std::string &amp;filename, const char &amp;delimiter=&apos;;&apos;)'],['../classutil_1_1FileIO.html#a5d145cb872989165f76d00c343170bc5',1,'util::FileIO::ReadCSV(core::Vector2d &amp;values, const std::string &amp;filename, const char &amp;delimiter=&apos;;&apos;)']]]
+  ['parseobjectdata3d',['ParseObjectData3D',['../classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298',1,'util::Parser']]],
+  ['parseobjectdataangular',['ParseObjectDataAngular',['../classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c',1,'util::Parser::ParseObjectDataAngular(const Vector3d &amp;values, core::DetectionSequence &amp;sequence)'],['../classutil_1_1Parser.html#a0f2ad399b88036840fa206704253cb56',1,'util::Parser::ParseObjectDataAngular(const Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)']]],
+  ['parseobjectdatamap',['ParseObjectDataMap',['../classutil_1_1Parser.html#a25a262843b391df324db620205a13156',1,'util::Parser']]],
+  ['parser',['Parser',['../classutil_1_1Parser.html',1,'util']]],
+  ['put',['Put',['../classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5',1,'core::ObjectDataMap::Put(std::string key, double value, double weight)'],['../classcore_1_1ObjectDataMap.html#a5cdd71b9124b5ca41419a0049fbbdaa1',1,'core::ObjectDataMap::Put(std::string key, std::pair&lt; double, double &gt; value_weight)']]]
 ];

+ 2 - 7
Documentation/html/search/all_c.js

@@ -1,10 +1,5 @@
 var searchData=
 [
-  ['setangularweight',['SetAngularWeight',['../classcore_1_1ObjectDataAngular.html#af6772caef2337f3c12a3f52049c4d853',1,'core::ObjectDataAngular']]],
-  ['setdebug',['SetDebug',['../classutil_1_1Logger.html#ac7b9bc580a6d459c212c46b137742869',1,'util::Logger']]],
-  ['setdetectionscore',['SetDetectionScore',['../classcore_1_1ObjectData.html#a737216c2689aefa216c1c842922d7dd8',1,'core::ObjectData']]],
-  ['setframeindex',['SetFrameIndex',['../classcore_1_1ObjectData.html#aedfe00fa37d5ac7ef554bda746931148',1,'core::ObjectData']]],
-  ['setinfo',['SetInfo',['../classutil_1_1Logger.html#a3965358e412007989f90798e295d4b41',1,'util::Logger']]],
-  ['setspatialweight',['SetSpatialWeight',['../classcore_1_1ObjectData3D.html#a94d4c0d90d4e0999eb2b339d37069cd6',1,'core::ObjectData3D']]],
-  ['settemporalweight',['SetTemporalWeight',['../classcore_1_1ObjectData3D.html#a05eafbd4d963ef14b1068ab5a3818597',1,'core::ObjectData3D']]]
+  ['readcsv',['ReadCSV',['../classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677',1,'util::FileIO::ReadCSV(Vector3d &amp;values, const std::string &amp;filename, char delimiter=&apos;;&apos;)'],['../classutil_1_1FileIO.html#a264c9b694fd7218635c8a783956d2c1e',1,'util::FileIO::ReadCSV(Vector2d &amp;values, const std::string &amp;filename, char delimiter=&apos;;&apos;)']]],
+  ['run',['Run',['../classalgo_1_1KShortestPaths.html#ae77137136462303e951f631ba7db6adf',1,'algo::KShortestPaths']]]
 ];

+ 7 - 4
Documentation/html/search/all_d.js

@@ -1,7 +1,10 @@
 var searchData=
 [
-  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html',1,'core']]],
-  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html#aedf59b5a9a068a28bb7570f2a031d4e7',1,'core::Tracklet']]],
-  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7',1,'algo::TwoStage']]],
-  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html',1,'algo']]]
+  ['setangularweight',['SetAngularWeight',['../classcore_1_1ObjectDataAngular.html#af6772caef2337f3c12a3f52049c4d853',1,'core::ObjectDataAngular']]],
+  ['setdebug',['SetDebug',['../classutil_1_1Logger.html#ac7b9bc580a6d459c212c46b137742869',1,'util::Logger']]],
+  ['setdetectionscore',['SetDetectionScore',['../classcore_1_1ObjectData.html#a737216c2689aefa216c1c842922d7dd8',1,'core::ObjectData']]],
+  ['setframeindex',['SetFrameIndex',['../classcore_1_1ObjectData.html#aedfe00fa37d5ac7ef554bda746931148',1,'core::ObjectData']]],
+  ['setinfo',['SetInfo',['../classutil_1_1Logger.html#a3965358e412007989f90798e295d4b41',1,'util::Logger']]],
+  ['setspatialweight',['SetSpatialWeight',['../classcore_1_1ObjectData3D.html#a94d4c0d90d4e0999eb2b339d37069cd6',1,'core::ObjectData3D']]],
+  ['settemporalweight',['SetTemporalWeight',['../classcore_1_1ObjectData3D.html#a05eafbd4d963ef14b1068ab5a3818597',1,'core::ObjectData3D']]]
 ];

+ 4 - 1
Documentation/html/search/all_e.js

@@ -1,4 +1,7 @@
 var searchData=
 [
-  ['visualize',['Visualize',['../classcore_1_1ObjectData.html#aae2c4fceddc529570dbe8909309f9961',1,'core::ObjectData::Visualize()'],['../classcore_1_1ObjectData3D.html#a86216fae3dc86f1107eb1b4530b574d2',1,'core::ObjectData3D::Visualize()'],['../classcore_1_1ObjectDataAngular.html#acb4265f6de511238460df118148bc85c',1,'core::ObjectDataAngular::Visualize()'],['../classcore_1_1ObjectDataMap.html#a8a0f71318dd58e0d527a63b904c6afac',1,'core::ObjectDataMap::Visualize()'],['../classcore_1_1Tracklet.html#a85f92a4059bf89f24a83f28935675181',1,'core::Tracklet::Visualize(cv::Mat &amp;image, cv::Scalar &amp;color) const override'],['../classcore_1_1Tracklet.html#a3a2b241939559e47aef701d2e2c4d4bd',1,'core::Tracklet::Visualize(cv::Mat &amp;image, cv::Scalar &amp;color, size_t frame, size_t predecessor_count, size_t successor_count) const']]]
+  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html',1,'core']]],
+  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html#aedf59b5a9a068a28bb7570f2a031d4e7',1,'core::Tracklet']]],
+  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7',1,'algo::TwoStage']]],
+  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html',1,'algo']]]
 ];

+ 1 - 1
Documentation/html/search/classes_2.js

@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['logger',['Logger',['../classutil_1_1Logger.html',1,'util']]]
+  ['kshortestpaths',['KShortestPaths',['../classalgo_1_1KShortestPaths.html',1,'algo']]]
 ];

+ 1 - 1
Documentation/html/search/classes_3.js

@@ -1,4 +1,4 @@
 var searchData=
 [
-  ['mymath',['MyMath',['../classutil_1_1MyMath.html',1,'util']]]
+  ['logger',['Logger',['../classutil_1_1Logger.html',1,'util']]]
 ];

+ 1 - 4
Documentation/html/search/classes_4.js

@@ -1,7 +1,4 @@
 var searchData=
 [
-  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html',1,'core']]],
-  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html',1,'core']]],
-  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html',1,'core']]],
-  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html',1,'core']]]
+  ['mymath',['MyMath',['../classutil_1_1MyMath.html',1,'util']]]
 ];

+ 4 - 1
Documentation/html/search/classes_5.js

@@ -1,4 +1,7 @@
 var searchData=
 [
-  ['parser',['Parser',['../classutil_1_1Parser.html',1,'util']]]
+  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html',1,'core']]],
+  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html',1,'core']]],
+  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html',1,'core']]],
+  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html',1,'core']]]
 ];

+ 1 - 2
Documentation/html/search/classes_6.js

@@ -1,5 +1,4 @@
 var searchData=
 [
-  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html',1,'core']]],
-  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html',1,'algo']]]
+  ['parser',['Parser',['../classutil_1_1Parser.html',1,'util']]]
 ];

+ 1 - 1
Documentation/html/search/functions_1.js

@@ -3,6 +3,6 @@ var searchData=
   ['clamp',['Clamp',['../classutil_1_1MyMath.html#a367a261dc52a85cc97ba376799ed13a3',1,'util::MyMath']]],
   ['clear',['Clear',['../classcore_1_1DetectionSequence.html#ab62569a3e51d58457057deba12ef6892',1,'core::DetectionSequence']]],
   ['compareto',['CompareTo',['../classcore_1_1ObjectData.html#afbf7a1e87235f1b204d4d2eb8a37a9a6',1,'core::ObjectData::CompareTo()'],['../classcore_1_1ObjectData3D.html#abef3e4e7a0dc121d8a403d91964be576',1,'core::ObjectData3D::CompareTo()'],['../classcore_1_1ObjectDataAngular.html#a2932240c6c082b76f2c04723cdf3e4f9',1,'core::ObjectDataAngular::CompareTo()'],['../classcore_1_1ObjectDataMap.html#a7fcc9ef5b684f14d33711348610d9b74',1,'core::ObjectDataMap::CompareTo()'],['../classcore_1_1Tracklet.html#a0357f2fa173941800571432dcbc96dc2',1,'core::Tracklet::CompareTo()']]],
-  ['createobjectgraph',['CreateObjectGraph',['../classalgo_1_1TwoStage.html#aa2b03f5bc30427ec5d0a7ca703e25e11',1,'algo::TwoStage']]],
+  ['createobjectgraph',['CreateObjectGraph',['../classalgo_1_1TwoStage.html#a02dfe4e3fb244ecad13f676ce53d689a',1,'algo::TwoStage']]],
   ['createtrackletgraph',['CreateTrackletGraph',['../classalgo_1_1TwoStage.html#ae14cf79859b4275c862d6750b6bc6837',1,'algo::TwoStage']]]
 ];

+ 1 - 5
Documentation/html/search/functions_7.js

@@ -1,8 +1,4 @@
 var searchData=
 [
-  ['lerp',['Lerp',['../classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1',1,'util::MyMath']]],
-  ['logdebug',['LogDebug',['../classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee',1,'util::Logger']]],
-  ['logerror',['LogError',['../classutil_1_1Logger.html#a01ad6e5349f51964724f96a598c6d2a8',1,'util::Logger']]],
-  ['logger',['Logger',['../classutil_1_1Logger.html#a83d4f38e648b39fa61a2b9b3172bda12',1,'util::Logger']]],
-  ['loginfo',['LogInfo',['../classutil_1_1Logger.html#a37504d39ec90bebffc3d02d61d47afea',1,'util::Logger']]]
+  ['kshortestpaths',['KShortestPaths',['../classalgo_1_1KShortestPaths.html#a2805f56b9abb112f10c752d125d623d8',1,'algo::KShortestPaths']]]
 ];

+ 6 - 5
Documentation/html/search/functions_8.js

@@ -1,8 +1,9 @@
 var searchData=
 [
-  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html#a7f47a396a3b9e8c12a1557c8156b8ff9',1,'core::ObjectData::ObjectData()'],['../classcore_1_1ObjectData.html#af4333a52b012841a6ba73b25aeaae71b',1,'core::ObjectData::ObjectData(std::size_t frame_index)']]],
-  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html#a47c967cffcbd109f1366069958a71699',1,'core::ObjectData3D']]],
-  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html#acc9d75397b5e4aa43a05f2366b00ccfa',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle)'],['../classcore_1_1ObjectDataAngular.html#ae2c40f53f5dc630d610cf513bf4cd767',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle, double temporal_weight, double spatial_weight, double angular_weight)']]],
-  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html#ac6df34682a715db6845667f7dda1c795',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index)'],['../classcore_1_1ObjectDataMap.html#a573add8d73646e6c5f183a9a0c159596',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list)'],['../classcore_1_1ObjectDataMap.html#a5727c237d73f3f16c94a748c1b9b0c74',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list, std::vector&lt; double &gt; weight_list)'],['../classcore_1_1ObjectDataMap.html#ad2af0de7438ed72be68348ac992568b6',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; std::pair&lt; double, double &gt;&gt; value_weight_list)']]],
-  ['operator_3d',['operator=',['../classutil_1_1Logger.html#a4e9e8b8d0e75058265037976d9b256de',1,'util::Logger']]]
+  ['lerp',['Lerp',['../classutil_1_1MyMath.html#ae68f361889a9929767b0c85ad7a010f1',1,'util::MyMath']]],
+  ['listfiles',['ListFiles',['../classutil_1_1FileIO.html#a6e290e22083d49619b757bfca96a51fa',1,'util::FileIO']]],
+  ['logdebug',['LogDebug',['../classutil_1_1Logger.html#a9c6a0ebe97ecf3ca24aff8a908a491ee',1,'util::Logger']]],
+  ['logerror',['LogError',['../classutil_1_1Logger.html#a01ad6e5349f51964724f96a598c6d2a8',1,'util::Logger']]],
+  ['logger',['Logger',['../classutil_1_1Logger.html#a83d4f38e648b39fa61a2b9b3172bda12',1,'util::Logger']]],
+  ['loginfo',['LogInfo',['../classutil_1_1Logger.html#a37504d39ec90bebffc3d02d61d47afea',1,'util::Logger']]]
 ];

+ 5 - 4
Documentation/html/search/functions_9.js

@@ -1,7 +1,8 @@
 var searchData=
 [
-  ['parseobjectdata3d',['ParseObjectData3D',['../classutil_1_1Parser.html#afbc0421d8672a418284efb5a9b6cec92',1,'util::Parser']]],
-  ['parseobjectdataangular',['ParseObjectDataAngular',['../classutil_1_1Parser.html#a314cfd3ebd16ab18cd132e7d8dd4c04a',1,'util::Parser::ParseObjectDataAngular(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence)'],['../classutil_1_1Parser.html#a5a4c53339551dbf67bd351fd0fe2c087',1,'util::Parser::ParseObjectDataAngular(const core::Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)']]],
-  ['parseobjectdatamap',['ParseObjectDataMap',['../classutil_1_1Parser.html#ac2095e8699706079dde135098f30de0a',1,'util::Parser']]],
-  ['put',['Put',['../classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5',1,'core::ObjectDataMap::Put(std::string key, double value, double weight)'],['../classcore_1_1ObjectDataMap.html#a5cdd71b9124b5ca41419a0049fbbdaa1',1,'core::ObjectDataMap::Put(std::string key, std::pair&lt; double, double &gt; value_weight)']]]
+  ['objectdata',['ObjectData',['../classcore_1_1ObjectData.html#a7f47a396a3b9e8c12a1557c8156b8ff9',1,'core::ObjectData::ObjectData()'],['../classcore_1_1ObjectData.html#af4333a52b012841a6ba73b25aeaae71b',1,'core::ObjectData::ObjectData(std::size_t frame_index)']]],
+  ['objectdata3d',['ObjectData3D',['../classcore_1_1ObjectData3D.html#a47c967cffcbd109f1366069958a71699',1,'core::ObjectData3D']]],
+  ['objectdataangular',['ObjectDataAngular',['../classcore_1_1ObjectDataAngular.html#acc9d75397b5e4aa43a05f2366b00ccfa',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle)'],['../classcore_1_1ObjectDataAngular.html#ae2c40f53f5dc630d610cf513bf4cd767',1,'core::ObjectDataAngular::ObjectDataAngular(size_t frame_index, const cv::Point3d &amp;position, double angle, double temporal_weight, double spatial_weight, double angular_weight)']]],
+  ['objectdatamap',['ObjectDataMap',['../classcore_1_1ObjectDataMap.html#ac6df34682a715db6845667f7dda1c795',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index)'],['../classcore_1_1ObjectDataMap.html#a573add8d73646e6c5f183a9a0c159596',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list)'],['../classcore_1_1ObjectDataMap.html#a5727c237d73f3f16c94a748c1b9b0c74',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; double &gt; value_list, std::vector&lt; double &gt; weight_list)'],['../classcore_1_1ObjectDataMap.html#ad2af0de7438ed72be68348ac992568b6',1,'core::ObjectDataMap::ObjectDataMap(size_t frame_index, std::vector&lt; std::string &gt; keys, std::vector&lt; std::pair&lt; double, double &gt;&gt; value_weight_list)']]],
+  ['operator_3d',['operator=',['../classutil_1_1Logger.html#a4e9e8b8d0e75058265037976d9b256de',1,'util::Logger']]]
 ];

+ 4 - 1
Documentation/html/search/functions_a.js

@@ -1,4 +1,7 @@
 var searchData=
 [
-  ['readcsv',['ReadCSV',['../classutil_1_1FileIO.html#acfce3977f435f2b024984da05408dfb4',1,'util::FileIO::ReadCSV(core::Vector3d &amp;values, const std::string &amp;filename, const char &amp;delimiter=&apos;;&apos;)'],['../classutil_1_1FileIO.html#a5d145cb872989165f76d00c343170bc5',1,'util::FileIO::ReadCSV(core::Vector2d &amp;values, const std::string &amp;filename, const char &amp;delimiter=&apos;;&apos;)']]]
+  ['parseobjectdata3d',['ParseObjectData3D',['../classutil_1_1Parser.html#a4372acb257c7c0292439f1c863287298',1,'util::Parser']]],
+  ['parseobjectdataangular',['ParseObjectDataAngular',['../classutil_1_1Parser.html#acad67e4a565fb4a008a2d85fa9ea215c',1,'util::Parser::ParseObjectDataAngular(const Vector3d &amp;values, core::DetectionSequence &amp;sequence)'],['../classutil_1_1Parser.html#a0f2ad399b88036840fa206704253cb56',1,'util::Parser::ParseObjectDataAngular(const Vector3d &amp;values, core::DetectionSequence &amp;sequence, double temporal_weight, double spatial_weight, double angular_weight)']]],
+  ['parseobjectdatamap',['ParseObjectDataMap',['../classutil_1_1Parser.html#a25a262843b391df324db620205a13156',1,'util::Parser']]],
+  ['put',['Put',['../classcore_1_1ObjectDataMap.html#a2d104f34385edf8c3fdfda7390c28bf5',1,'core::ObjectDataMap::Put(std::string key, double value, double weight)'],['../classcore_1_1ObjectDataMap.html#a5cdd71b9124b5ca41419a0049fbbdaa1',1,'core::ObjectDataMap::Put(std::string key, std::pair&lt; double, double &gt; value_weight)']]]
 ];

+ 2 - 7
Documentation/html/search/functions_b.js

@@ -1,10 +1,5 @@
 var searchData=
 [
-  ['setangularweight',['SetAngularWeight',['../classcore_1_1ObjectDataAngular.html#af6772caef2337f3c12a3f52049c4d853',1,'core::ObjectDataAngular']]],
-  ['setdebug',['SetDebug',['../classutil_1_1Logger.html#ac7b9bc580a6d459c212c46b137742869',1,'util::Logger']]],
-  ['setdetectionscore',['SetDetectionScore',['../classcore_1_1ObjectData.html#a737216c2689aefa216c1c842922d7dd8',1,'core::ObjectData']]],
-  ['setframeindex',['SetFrameIndex',['../classcore_1_1ObjectData.html#aedfe00fa37d5ac7ef554bda746931148',1,'core::ObjectData']]],
-  ['setinfo',['SetInfo',['../classutil_1_1Logger.html#a3965358e412007989f90798e295d4b41',1,'util::Logger']]],
-  ['setspatialweight',['SetSpatialWeight',['../classcore_1_1ObjectData3D.html#a94d4c0d90d4e0999eb2b339d37069cd6',1,'core::ObjectData3D']]],
-  ['settemporalweight',['SetTemporalWeight',['../classcore_1_1ObjectData3D.html#a05eafbd4d963ef14b1068ab5a3818597',1,'core::ObjectData3D']]]
+  ['readcsv',['ReadCSV',['../classutil_1_1FileIO.html#af42c183525923014e142a10a626d3677',1,'util::FileIO::ReadCSV(Vector3d &amp;values, const std::string &amp;filename, char delimiter=&apos;;&apos;)'],['../classutil_1_1FileIO.html#a264c9b694fd7218635c8a783956d2c1e',1,'util::FileIO::ReadCSV(Vector2d &amp;values, const std::string &amp;filename, char delimiter=&apos;;&apos;)']]],
+  ['run',['Run',['../classalgo_1_1KShortestPaths.html#ae77137136462303e951f631ba7db6adf',1,'algo::KShortestPaths']]]
 ];

+ 7 - 2
Documentation/html/search/functions_c.js

@@ -1,5 +1,10 @@
 var searchData=
 [
-  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html#aedf59b5a9a068a28bb7570f2a031d4e7',1,'core::Tracklet']]],
-  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7',1,'algo::TwoStage']]]
+  ['setangularweight',['SetAngularWeight',['../classcore_1_1ObjectDataAngular.html#af6772caef2337f3c12a3f52049c4d853',1,'core::ObjectDataAngular']]],
+  ['setdebug',['SetDebug',['../classutil_1_1Logger.html#ac7b9bc580a6d459c212c46b137742869',1,'util::Logger']]],
+  ['setdetectionscore',['SetDetectionScore',['../classcore_1_1ObjectData.html#a737216c2689aefa216c1c842922d7dd8',1,'core::ObjectData']]],
+  ['setframeindex',['SetFrameIndex',['../classcore_1_1ObjectData.html#aedfe00fa37d5ac7ef554bda746931148',1,'core::ObjectData']]],
+  ['setinfo',['SetInfo',['../classutil_1_1Logger.html#a3965358e412007989f90798e295d4b41',1,'util::Logger']]],
+  ['setspatialweight',['SetSpatialWeight',['../classcore_1_1ObjectData3D.html#a94d4c0d90d4e0999eb2b339d37069cd6',1,'core::ObjectData3D']]],
+  ['settemporalweight',['SetTemporalWeight',['../classcore_1_1ObjectData3D.html#a05eafbd4d963ef14b1068ab5a3818597',1,'core::ObjectData3D']]]
 ];

+ 2 - 1
Documentation/html/search/functions_d.js

@@ -1,4 +1,5 @@
 var searchData=
 [
-  ['visualize',['Visualize',['../classcore_1_1ObjectData.html#aae2c4fceddc529570dbe8909309f9961',1,'core::ObjectData::Visualize()'],['../classcore_1_1ObjectData3D.html#a86216fae3dc86f1107eb1b4530b574d2',1,'core::ObjectData3D::Visualize()'],['../classcore_1_1ObjectDataAngular.html#acb4265f6de511238460df118148bc85c',1,'core::ObjectDataAngular::Visualize()'],['../classcore_1_1ObjectDataMap.html#a8a0f71318dd58e0d527a63b904c6afac',1,'core::ObjectDataMap::Visualize()'],['../classcore_1_1Tracklet.html#a85f92a4059bf89f24a83f28935675181',1,'core::Tracklet::Visualize(cv::Mat &amp;image, cv::Scalar &amp;color) const override'],['../classcore_1_1Tracklet.html#a3a2b241939559e47aef701d2e2c4d4bd',1,'core::Tracklet::Visualize(cv::Mat &amp;image, cv::Scalar &amp;color, size_t frame, size_t predecessor_count, size_t successor_count) const']]]
+  ['tracklet',['Tracklet',['../classcore_1_1Tracklet.html#aedf59b5a9a068a28bb7570f2a031d4e7',1,'core::Tracklet']]],
+  ['twostage',['TwoStage',['../classalgo_1_1TwoStage.html#ae302f9ea93d56155a9dbd0be060500f7',1,'algo::TwoStage']]]
 ];

+ 3 - 3
Documentation/html/search/searchdata.js

@@ -1,8 +1,8 @@
 var indexSectionsWithContent =
 {
-  0: "acdefgilmoprstv",
-  1: "dflmopt",
-  2: "acdefgiloprstv",
+  0: "acdefgiklmoprstvw",
+  1: "dfklmopt",
+  2: "acdefgikloprstvw",
   3: "o"
 };
 

+ 1 - 0
Documentation/latex/annotated.tex

@@ -2,6 +2,7 @@
 Here are the classes, structs, unions and interfaces with brief descriptions\+:\begin{DoxyCompactList}
 \item\contentsline{section}{\hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} }{\pageref{classcore_1_1DetectionSequence}}{}
 \item\contentsline{section}{\hyperlink{classutil_1_1FileIO}{util\+::\+File\+IO} }{\pageref{classutil_1_1FileIO}}{}
+\item\contentsline{section}{\hyperlink{classalgo_1_1KShortestPaths}{algo\+::\+K\+Shortest\+Paths} }{\pageref{classalgo_1_1KShortestPaths}}{}
 \item\contentsline{section}{\hyperlink{classutil_1_1Logger}{util\+::\+Logger} }{\pageref{classutil_1_1Logger}}{}
 \item\contentsline{section}{\hyperlink{classutil_1_1MyMath}{util\+::\+My\+Math} }{\pageref{classutil_1_1MyMath}}{}
 \item\contentsline{section}{\hyperlink{classcore_1_1ObjectData}{core\+::\+Object\+Data} }{\pageref{classcore_1_1ObjectData}}{}

+ 4 - 4
Documentation/latex/classalgo_1_1TwoStage.tex

@@ -9,7 +9,7 @@
 \item 
 \hyperlink{classalgo_1_1TwoStage_ae302f9ea93d56155a9dbd0be060500f7}{Two\+Stage} (size\+\_\+t max\+\_\+frame\+\_\+skip, double penalty\+\_\+value, size\+\_\+t max\+\_\+tracklet\+\_\+count)
 \item 
-void \hyperlink{classalgo_1_1TwoStage_aa2b03f5bc30427ec5d0a7ca703e25e11}{Create\+Object\+Graph} (Directed\+Graph \&graph, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&detections)
+void \hyperlink{classalgo_1_1TwoStage_a02dfe4e3fb244ecad13f676ce53d689a}{Create\+Object\+Graph} (Directed\+Graph \&graph, const \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&detections)
 \item 
 void \hyperlink{classalgo_1_1TwoStage_ae14cf79859b4275c862d6750b6bc6837}{Create\+Tracklet\+Graph} (Directed\+Graph \&obj\+\_\+graph, Directed\+Graph \&tlt\+\_\+graph, size\+\_\+t frame\+\_\+count)
 \item 
@@ -44,12 +44,12 @@ Initializes the algorithm wih the given values.
 \subsection{Member Function Documentation}
 \index{algo\+::\+Two\+Stage@{algo\+::\+Two\+Stage}!Create\+Object\+Graph@{Create\+Object\+Graph}}
 \index{Create\+Object\+Graph@{Create\+Object\+Graph}!algo\+::\+Two\+Stage@{algo\+::\+Two\+Stage}}
-\subsubsection[{\texorpdfstring{Create\+Object\+Graph(\+Directed\+Graph \&graph, core\+::\+Detection\+Sequence \&detections)}{CreateObjectGraph(DirectedGraph \&graph, core::DetectionSequence \&detections)}}]{\setlength{\rightskip}{0pt plus 5cm}void algo\+::\+Two\+Stage\+::\+Create\+Object\+Graph (
+\subsubsection[{\texorpdfstring{Create\+Object\+Graph(\+Directed\+Graph \&graph, const core\+::\+Detection\+Sequence \&detections)}{CreateObjectGraph(DirectedGraph \&graph, const core::DetectionSequence \&detections)}}]{\setlength{\rightskip}{0pt plus 5cm}void algo\+::\+Two\+Stage\+::\+Create\+Object\+Graph (
 \begin{DoxyParamCaption}
 \item[{Directed\+Graph \&}]{graph, }
-\item[{{\bf core\+::\+Detection\+Sequence} \&}]{detections}
+\item[{const {\bf core\+::\+Detection\+Sequence} \&}]{detections}
 \end{DoxyParamCaption}
-)}\hypertarget{classalgo_1_1TwoStage_aa2b03f5bc30427ec5d0a7ca703e25e11}{}\label{classalgo_1_1TwoStage_aa2b03f5bc30427ec5d0a7ca703e25e11}
+)}\hypertarget{classalgo_1_1TwoStage_a02dfe4e3fb244ecad13f676ce53d689a}{}\label{classalgo_1_1TwoStage_a02dfe4e3fb244ecad13f676ce53d689a}
 Creates a graph with vertices for every detected object 
 \begin{DoxyParams}{Parameters}
 {\em graph} & The graph to write into \\

BIN
Documentation/latex/classcore_1_1ObjectData.pdf


BIN
Documentation/latex/classcore_1_1ObjectData3D.pdf


BIN
Documentation/latex/classcore_1_1ObjectDataAngular.pdf


BIN
Documentation/latex/classcore_1_1ObjectDataMap.pdf


BIN
Documentation/latex/classcore_1_1Tracklet.pdf


+ 50 - 10
Documentation/latex/classutil_1_1FileIO.tex

@@ -7,9 +7,13 @@
 \subsection*{Static Public Member Functions}
 \begin{DoxyCompactItemize}
 \item 
-static void \hyperlink{classutil_1_1FileIO_acfce3977f435f2b024984da05408dfb4}{Read\+C\+SV} (core\+::\+Vector3d \&values, const std\+::string \&filename, const char \&delimiter=\textquotesingle{};\textquotesingle{})
+static void \hyperlink{classutil_1_1FileIO_af42c183525923014e142a10a626d3677}{Read\+C\+SV} (Vector3d \&values, const std\+::string \&filename, char delimiter=\textquotesingle{};\textquotesingle{})
 \item 
-static void \hyperlink{classutil_1_1FileIO_a5d145cb872989165f76d00c343170bc5}{Read\+C\+SV} (core\+::\+Vector2d \&values, const std\+::string \&filename, const char \&delimiter=\textquotesingle{};\textquotesingle{})
+static void \hyperlink{classutil_1_1FileIO_a264c9b694fd7218635c8a783956d2c1e}{Read\+C\+SV} (Vector2d \&values, const std\+::string \&filename, char delimiter=\textquotesingle{};\textquotesingle{})
+\item 
+static void \hyperlink{classutil_1_1FileIO_a6e290e22083d49619b757bfca96a51fa}{List\+Files} (const std\+::string \&folder, std\+::vector$<$ std\+::string $>$ \&file\+\_\+names, bool sort=true)
+\item 
+static void \hyperlink{classutil_1_1FileIO_a862586aced240e732ecd35773b57c267}{Write\+C\+S\+V\+Matlab} (Directed\+Graph \&graph, const std\+::string \&file\+\_\+name, char delimiter=\textquotesingle{};\textquotesingle{})
 \end{DoxyCompactItemize}
 
 
@@ -17,15 +21,33 @@ static void \hyperlink{classutil_1_1FileIO_a5d145cb872989165f76d00c343170bc5}{Re
 Utility class for file in-\/ and output. 
 
 \subsection{Member Function Documentation}
+\index{util\+::\+File\+IO@{util\+::\+File\+IO}!List\+Files@{List\+Files}}
+\index{List\+Files@{List\+Files}!util\+::\+File\+IO@{util\+::\+File\+IO}}
+\subsubsection[{\texorpdfstring{List\+Files(const std\+::string \&folder, std\+::vector$<$ std\+::string $>$ \&file\+\_\+names, bool sort=true)}{ListFiles(const std::string \&folder, std::vector< std::string > \&file\_names, bool sort=true)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+List\+Files (
+\begin{DoxyParamCaption}
+\item[{const std\+::string \&}]{folder, }
+\item[{std\+::vector$<$ std\+::string $>$ \&}]{file\+\_\+names, }
+\item[{bool}]{sort = {\ttfamily true}}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_a6e290e22083d49619b757bfca96a51fa}{}\label{classutil_1_1FileIO_a6e290e22083d49619b757bfca96a51fa}
+Lists all file names in the given folder. 
+\begin{DoxyParams}{Parameters}
+{\em folder} & The folder to look into \\
+\hline
+{\em file\+\_\+names} & The vector to store the file names into \\
+\hline
+{\em sort} & True, if the files should be sorted alphabetically \\
+\hline
+\end{DoxyParams}
 \index{util\+::\+File\+IO@{util\+::\+File\+IO}!Read\+C\+SV@{Read\+C\+SV}}
 \index{Read\+C\+SV@{Read\+C\+SV}!util\+::\+File\+IO@{util\+::\+File\+IO}}
-\subsubsection[{\texorpdfstring{Read\+C\+S\+V(core\+::\+Vector3d \&values, const std\+::string \&filename, const char \&delimiter=\textquotesingle{};\textquotesingle{})}{ReadCSV(core::Vector3d \&values, const std::string \&filename, const char \&delimiter=';')}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+Read\+C\+SV (
+\subsubsection[{\texorpdfstring{Read\+C\+S\+V(\+Vector3d \&values, const std\+::string \&filename, char delimiter=\textquotesingle{};\textquotesingle{})}{ReadCSV(Vector3d \&values, const std::string \&filename, char delimiter=';')}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+Read\+C\+SV (
 \begin{DoxyParamCaption}
-\item[{core\+::\+Vector3d \&}]{values, }
+\item[{Vector3d \&}]{values, }
 \item[{const std\+::string \&}]{filename, }
-\item[{const char \&}]{delimiter = {\ttfamily \textquotesingle{};\textquotesingle{}}}
+\item[{char}]{delimiter = {\ttfamily \textquotesingle{};\textquotesingle{}}}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_acfce3977f435f2b024984da05408dfb4}{}\label{classutil_1_1FileIO_acfce3977f435f2b024984da05408dfb4}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_af42c183525923014e142a10a626d3677}{}\label{classutil_1_1FileIO_af42c183525923014e142a10a626d3677}
 Reads a C\+SV file and stores the values in a 3D array. The first dimension is the first value of each row, used as a index to bundle multiple rows with the same first value into a single vector. The second dimension is the row in the row bundle. The third dimension is the value in that row. 
 \begin{DoxyParams}{Parameters}
 {\em values} & The 3D array of values to store the read values in \\
@@ -37,13 +59,13 @@ Reads a C\+SV file and stores the values in a 3D array. The first dimension is t
 \end{DoxyParams}
 \index{util\+::\+File\+IO@{util\+::\+File\+IO}!Read\+C\+SV@{Read\+C\+SV}}
 \index{Read\+C\+SV@{Read\+C\+SV}!util\+::\+File\+IO@{util\+::\+File\+IO}}
-\subsubsection[{\texorpdfstring{Read\+C\+S\+V(core\+::\+Vector2d \&values, const std\+::string \&filename, const char \&delimiter=\textquotesingle{};\textquotesingle{})}{ReadCSV(core::Vector2d \&values, const std::string \&filename, const char \&delimiter=';')}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+Read\+C\+SV (
+\subsubsection[{\texorpdfstring{Read\+C\+S\+V(\+Vector2d \&values, const std\+::string \&filename, char delimiter=\textquotesingle{};\textquotesingle{})}{ReadCSV(Vector2d \&values, const std::string \&filename, char delimiter=';')}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+Read\+C\+SV (
 \begin{DoxyParamCaption}
-\item[{core\+::\+Vector2d \&}]{values, }
+\item[{Vector2d \&}]{values, }
 \item[{const std\+::string \&}]{filename, }
-\item[{const char \&}]{delimiter = {\ttfamily \textquotesingle{};\textquotesingle{}}}
+\item[{char}]{delimiter = {\ttfamily \textquotesingle{};\textquotesingle{}}}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_a5d145cb872989165f76d00c343170bc5}{}\label{classutil_1_1FileIO_a5d145cb872989165f76d00c343170bc5}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_a264c9b694fd7218635c8a783956d2c1e}{}\label{classutil_1_1FileIO_a264c9b694fd7218635c8a783956d2c1e}
 Reads a C\+SV file and stores the values in a 2D array. The first dimension is the row and the second the value in that row. 
 \begin{DoxyParams}{Parameters}
 {\em values} & The 2D array of values to store the read values in \\
@@ -53,6 +75,24 @@ Reads a C\+SV file and stores the values in a 2D array. The first dimension is t
 {\em delimiter} & The delimiter used to separate the values in the file \\
 \hline
 \end{DoxyParams}
+\index{util\+::\+File\+IO@{util\+::\+File\+IO}!Write\+C\+S\+V\+Matlab@{Write\+C\+S\+V\+Matlab}}
+\index{Write\+C\+S\+V\+Matlab@{Write\+C\+S\+V\+Matlab}!util\+::\+File\+IO@{util\+::\+File\+IO}}
+\subsubsection[{\texorpdfstring{Write\+C\+S\+V\+Matlab(\+Directed\+Graph \&graph, const std\+::string \&file\+\_\+name, char delimiter=\textquotesingle{};\textquotesingle{})}{WriteCSVMatlab(DirectedGraph \&graph, const std::string \&file\_name, char delimiter=';')}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+File\+I\+O\+::\+Write\+C\+S\+V\+Matlab (
+\begin{DoxyParamCaption}
+\item[{Directed\+Graph \&}]{graph, }
+\item[{const std\+::string \&}]{file\+\_\+name, }
+\item[{char}]{delimiter = {\ttfamily \textquotesingle{};\textquotesingle{}}}
+\end{DoxyParamCaption}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1FileIO_a862586aced240e732ecd35773b57c267}{}\label{classutil_1_1FileIO_a862586aced240e732ecd35773b57c267}
+Writes the given graph into a C\+SV file with an format readable by Matlab. 
+\begin{DoxyParams}{Parameters}
+{\em graph} & The graph to write \\
+\hline
+{\em file\+\_\+name} & The name of the file to write into \\
+\hline
+{\em delimiter} & The delimiter to use \\
+\hline
+\end{DoxyParams}
 
 
 The documentation for this class was generated from the following files\+:\begin{DoxyCompactItemize}

+ 16 - 16
Documentation/latex/classutil_1_1Parser.tex

@@ -7,13 +7,13 @@
 \subsection*{Static Public Member Functions}
 \begin{DoxyCompactItemize}
 \item 
-static void \hyperlink{classutil_1_1Parser_ac2095e8699706079dde135098f30de0a}{Parse\+Object\+Data\+Map} (const std\+::vector$<$ std\+::string $>$ \&keys, const core\+::\+Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
+static void \hyperlink{classutil_1_1Parser_a25a262843b391df324db620205a13156}{Parse\+Object\+Data\+Map} (const std\+::vector$<$ std\+::string $>$ \&keys, const Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
 \item 
-static void \hyperlink{classutil_1_1Parser_afbc0421d8672a418284efb5a9b6cec92}{Parse\+Object\+Data3D} (const core\+::\+Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
+static void \hyperlink{classutil_1_1Parser_a4372acb257c7c0292439f1c863287298}{Parse\+Object\+Data3D} (const Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
 \item 
-static void \hyperlink{classutil_1_1Parser_a314cfd3ebd16ab18cd132e7d8dd4c04a}{Parse\+Object\+Data\+Angular} (const core\+::\+Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
+static void \hyperlink{classutil_1_1Parser_acad67e4a565fb4a008a2d85fa9ea215c}{Parse\+Object\+Data\+Angular} (const Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence)
 \item 
-static void \hyperlink{classutil_1_1Parser_a5a4c53339551dbf67bd351fd0fe2c087}{Parse\+Object\+Data\+Angular} (const core\+::\+Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence, double temporal\+\_\+weight, double spatial\+\_\+weight, double angular\+\_\+weight)
+static void \hyperlink{classutil_1_1Parser_a0f2ad399b88036840fa206704253cb56}{Parse\+Object\+Data\+Angular} (const Vector3d \&values, \hyperlink{classcore_1_1DetectionSequence}{core\+::\+Detection\+Sequence} \&sequence, double temporal\+\_\+weight, double spatial\+\_\+weight, double angular\+\_\+weight)
 \end{DoxyCompactItemize}
 
 
@@ -23,12 +23,12 @@ Utility class for parsing diverse objects.
 \subsection{Member Function Documentation}
 \index{util\+::\+Parser@{util\+::\+Parser}!Parse\+Object\+Data3D@{Parse\+Object\+Data3D}}
 \index{Parse\+Object\+Data3D@{Parse\+Object\+Data3D}!util\+::\+Parser@{util\+::\+Parser}}
-\subsubsection[{\texorpdfstring{Parse\+Object\+Data3\+D(const core\+::\+Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectData3D(const core::Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data3D (
+\subsubsection[{\texorpdfstring{Parse\+Object\+Data3\+D(const Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectData3D(const Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data3D (
 \begin{DoxyParamCaption}
-\item[{const core\+::\+Vector3d \&}]{values, }
+\item[{const Vector3d \&}]{values, }
 \item[{{\bf core\+::\+Detection\+Sequence} \&}]{sequence}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_afbc0421d8672a418284efb5a9b6cec92}{}\label{classutil_1_1Parser_afbc0421d8672a418284efb5a9b6cec92}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_a4372acb257c7c0292439f1c863287298}{}\label{classutil_1_1Parser_a4372acb257c7c0292439f1c863287298}
 Parses the values into a Detection\+Sequence of Object\+Data3D 
 \begin{DoxyParams}{Parameters}
 {\em values} & A 3D vector of values \\
@@ -38,12 +38,12 @@ Parses the values into a Detection\+Sequence of Object\+Data3D
 \end{DoxyParams}
 \index{util\+::\+Parser@{util\+::\+Parser}!Parse\+Object\+Data\+Angular@{Parse\+Object\+Data\+Angular}}
 \index{Parse\+Object\+Data\+Angular@{Parse\+Object\+Data\+Angular}!util\+::\+Parser@{util\+::\+Parser}}
-\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Angular(const core\+::\+Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectDataAngular(const core::Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Angular (
+\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Angular(const Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectDataAngular(const Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Angular (
 \begin{DoxyParamCaption}
-\item[{const core\+::\+Vector3d \&}]{values, }
+\item[{const Vector3d \&}]{values, }
 \item[{{\bf core\+::\+Detection\+Sequence} \&}]{sequence}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_a314cfd3ebd16ab18cd132e7d8dd4c04a}{}\label{classutil_1_1Parser_a314cfd3ebd16ab18cd132e7d8dd4c04a}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_acad67e4a565fb4a008a2d85fa9ea215c}{}\label{classutil_1_1Parser_acad67e4a565fb4a008a2d85fa9ea215c}
 Parses the values into a Detection\+Sequence of Object\+Data\+Angular objects. 
 \begin{DoxyParams}{Parameters}
 {\em values} & A 3D vector of values \\
@@ -53,15 +53,15 @@ Parses the values into a Detection\+Sequence of Object\+Data\+Angular objects.
 \end{DoxyParams}
 \index{util\+::\+Parser@{util\+::\+Parser}!Parse\+Object\+Data\+Angular@{Parse\+Object\+Data\+Angular}}
 \index{Parse\+Object\+Data\+Angular@{Parse\+Object\+Data\+Angular}!util\+::\+Parser@{util\+::\+Parser}}
-\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Angular(const core\+::\+Vector3d \&values, core\+::\+Detection\+Sequence \&sequence, double temporal\+\_\+weight, double spatial\+\_\+weight, double angular\+\_\+weight)}{ParseObjectDataAngular(const core::Vector3d \&values, core::DetectionSequence \&sequence, double temporal\_weight, double spatial\_weight, double angular\_weight)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Angular (
+\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Angular(const Vector3d \&values, core\+::\+Detection\+Sequence \&sequence, double temporal\+\_\+weight, double spatial\+\_\+weight, double angular\+\_\+weight)}{ParseObjectDataAngular(const Vector3d \&values, core::DetectionSequence \&sequence, double temporal\_weight, double spatial\_weight, double angular\_weight)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Angular (
 \begin{DoxyParamCaption}
-\item[{const core\+::\+Vector3d \&}]{values, }
+\item[{const Vector3d \&}]{values, }
 \item[{{\bf core\+::\+Detection\+Sequence} \&}]{sequence, }
 \item[{double}]{temporal\+\_\+weight, }
 \item[{double}]{spatial\+\_\+weight, }
 \item[{double}]{angular\+\_\+weight}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_a5a4c53339551dbf67bd351fd0fe2c087}{}\label{classutil_1_1Parser_a5a4c53339551dbf67bd351fd0fe2c087}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_a0f2ad399b88036840fa206704253cb56}{}\label{classutil_1_1Parser_a0f2ad399b88036840fa206704253cb56}
 Parses the values into a Detection\+Sequence of Object\+Data\+Angular objects. The keys are used for the third dimension in the values list. 
 \begin{DoxyParams}{Parameters}
 {\em values} & A 3D vector of values \\
@@ -77,13 +77,13 @@ Parses the values into a Detection\+Sequence of Object\+Data\+Angular objects. T
 \end{DoxyParams}
 \index{util\+::\+Parser@{util\+::\+Parser}!Parse\+Object\+Data\+Map@{Parse\+Object\+Data\+Map}}
 \index{Parse\+Object\+Data\+Map@{Parse\+Object\+Data\+Map}!util\+::\+Parser@{util\+::\+Parser}}
-\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Map(const std\+::vector$<$ std\+::string $>$ \&keys, const core\+::\+Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectDataMap(const std::vector< std::string > \&keys, const core::Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Map (
+\subsubsection[{\texorpdfstring{Parse\+Object\+Data\+Map(const std\+::vector$<$ std\+::string $>$ \&keys, const Vector3d \&values, core\+::\+Detection\+Sequence \&sequence)}{ParseObjectDataMap(const std::vector< std::string > \&keys, const Vector3d \&values, core::DetectionSequence \&sequence)}}]{\setlength{\rightskip}{0pt plus 5cm}void util\+::\+Parser\+::\+Parse\+Object\+Data\+Map (
 \begin{DoxyParamCaption}
 \item[{const std\+::vector$<$ std\+::string $>$ \&}]{keys, }
-\item[{const core\+::\+Vector3d \&}]{values, }
+\item[{const Vector3d \&}]{values, }
 \item[{{\bf core\+::\+Detection\+Sequence} \&}]{sequence}
 \end{DoxyParamCaption}
-)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_ac2095e8699706079dde135098f30de0a}{}\label{classutil_1_1Parser_ac2095e8699706079dde135098f30de0a}
+)\hspace{0.3cm}{\ttfamily [static]}}\hypertarget{classutil_1_1Parser_a25a262843b391df324db620205a13156}{}\label{classutil_1_1Parser_a25a262843b391df324db620205a13156}
 Parses the keys and values into a Detection\+Sequence of Object\+Data\+Map objects. The keys are used for the third dimension in the values list. 
 \begin{DoxyParams}{Parameters}
 {\em keys} & A 1D vector of keys \\

+ 1 - 0
Documentation/latex/hierarchy.tex

@@ -2,6 +2,7 @@
 This inheritance list is sorted roughly, but not completely, alphabetically\+:\begin{DoxyCompactList}
 \item \contentsline{section}{core\+:\+:Detection\+Sequence}{\pageref{classcore_1_1DetectionSequence}}{}
 \item \contentsline{section}{util\+:\+:File\+IO}{\pageref{classutil_1_1FileIO}}{}
+\item \contentsline{section}{algo\+:\+:K\+Shortest\+Paths}{\pageref{classalgo_1_1KShortestPaths}}{}
 \item \contentsline{section}{util\+:\+:Logger}{\pageref{classutil_1_1Logger}}{}
 \item \contentsline{section}{util\+:\+:My\+Math}{\pageref{classutil_1_1MyMath}}{}
 \item \contentsline{section}{core\+:\+:Object\+Data}{\pageref{classcore_1_1ObjectData}}{}

+ 1 - 0
Documentation/latex/refman.tex

@@ -145,6 +145,7 @@
 \chapter{Class Documentation}
 \input{classcore_1_1DetectionSequence}
 \input{classutil_1_1FileIO}
+\input{classalgo_1_1KShortestPaths}
 \input{classutil_1_1Logger}
 \input{classutil_1_1MyMath}
 \input{classcore_1_1ObjectData}

+ 0 - 36
algo/Definitions.h

@@ -1,36 +0,0 @@
-//
-// Created by wrede on 25.04.16.
-//
-
-#ifndef GBMOT_DEFINITIONS_H
-#define GBMOT_DEFINITIONS_H
-
-
-#include <boost/graph/properties.hpp>
-#include <boost/graph/graph_traits.hpp>
-#include <boost/graph/adjacency_list.hpp>
-#include "../core/Definitions.h"
-#include "../core/ObjectData.h"
-#include "../core/Tracklet.h"
-
-namespace algo
-{
-    //TODO read minimal example
-    typedef boost::property<boost::edge_weight_t, double> EdgeProp;
-    typedef boost::property<boost::vertex_name_t, core::ObjectDataPtr>
-            VertexProp;
-    typedef boost::adjacency_list<
-            boost::listS, boost::vecS, boost::directedS, VertexProp, EdgeProp>
-            DirectedGraph;
-    typedef boost::graph_traits<DirectedGraph>::vertex_descriptor Vertex;
-    typedef boost::property_map<DirectedGraph, boost::vertex_index_t>::type
-            VertexIndexMap;
-    typedef boost::property_map<DirectedGraph, boost::vertex_name_t >::type
-            VertexValueMap;
-    typedef boost::iterator_property_map<Vertex*, VertexIndexMap, Vertex, Vertex&>
-            PredecessorMap;
-    typedef boost::iterator_property_map<double*, VertexIndexMap, double, double&>
-            DistanceMap;
-};
-
-#endif //GBMOT_DEFINITIONS_H

+ 336 - 0
algo/KShortestPaths.cpp

@@ -0,0 +1,336 @@
+//
+// Created by wrede on 25.05.16.
+//
+
+#include "KShortestPaths.h"
+#include "../util/Logger.h"
+#include "../util/FileIO.h"
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <boost/graph/bellman_ford_shortest_paths.hpp>
+#include <boost/graph/copy.hpp>
+
+namespace algo
+{
+    KShortestPaths::KShortestPaths(DirectedGraph graph, Vertex source, Vertex sink)
+            : original_graph_(graph), source_(source), sink_(sink)
+    {
+    }
+
+    MultiPredecessorMap KShortestPaths::Run(size_t max_path_count)
+    {
+        util::Logger::LogInfo("Running k-shortest-paths");
+
+        // Clear all data from previous runs
+        i_shortest_paths_.clear();
+
+        util::Logger::LogDebug("find shortest path #1");
+
+        FindAndAugmentPath(1, true);
+
+        // Find the k shortest paths
+        for (size_t i = 1; i < max_path_count; ++i)
+        {
+            util::Logger::LogDebug("find shortest path #" + std::to_string(i + 1));
+
+            if (i != 1)
+            {
+                //If the costs are increasing, no further shortest paths will be found
+                if (OverallCosts(i) > OverallCosts(i - 1))
+                {
+                    return i_shortest_paths_[i];
+                }
+            }
+
+            // Create a copy of the original graph which is used
+            // for the graph and edge transformations
+            CopyOriginalGraph();
+            //util::FileIO::WriteCSVMatlab(copied_graph_, "/home/wrede/Dokumente/graph_copy.csv");
+
+            // Extend the graph (has negative and positive edge weights)
+            ExtendGraph(i);
+            //util::FileIO::WriteCSVMatlab(copied_graph_, "/home/wrede/Dokumente/graph_copy_extended.csv");
+
+            //TODO (optional) Transform the edge weights (positive edge weights) and use dijkstra
+
+            // Finds the next path and adds it to the found paths
+            FindAndAugmentPath(i + 1, false);
+
+            // Removes the duplicate edges to make the paths node-disjoint
+            Interlace(i + 1);
+        }
+
+        // All k shortest paths have been found
+        return i_shortest_paths_[max_path_count];
+    }
+
+    void KShortestPaths::ExtendGraph(size_t i)
+    {
+        boost::graph_traits<DirectedGraph>::out_edge_iterator oei, oei_end;
+        boost::graph_traits<DirectedGraph>::vertex_iterator vi, vi_end;
+        VertexValueMap graph_values = boost::get(boost::vertex_name, copied_graph_);
+
+        // Split all vertices within the paths
+        for (boost::tie(vi, vi_end) = boost::vertices(original_graph_); vi != vi_end; ++vi)
+        {
+            Vertex v_original = (*vi);
+
+            // Ignore vertices off the paths, the source and the sink
+            if (i_shortest_paths_[i].count(v_original) == 0 || v_original == source_ || v_original == sink_)
+            {
+                continue;
+            }
+
+            Vertex v_in = original_to_copy_[v_original];
+            Vertex v_out = boost::add_vertex(graph_values[v_in], copied_graph_);
+            copy_to_original_[v_out] = v_original;
+
+            // Copy outgoing edges to v_out
+            for (boost::tie(oei, oei_end) = boost::out_edges(v_in, copied_graph_); oei != oei_end; ++oei)
+            {
+                QueueAddEdge(v_out, boost::target(*oei, copied_graph_),
+                             boost::get(boost::edge_weight, copied_graph_, *oei));
+            }
+
+            // Remove outgoing edges from vertex
+            for (boost::tie(oei, oei_end) = boost::out_edges(v_in, copied_graph_); oei != oei_end; ++oei)
+            {
+                QueueRemoveEdge(v_in, boost::target(*oei, copied_graph_));
+            }
+
+            // Create auxiliary edge
+            QueueAddEdge(v_in, v_out, 0.0);
+        }
+
+        UpdateEdges();
+
+        // Iterate all vertices within the copied graph
+        for (boost::tie(vi, vi_end) = boost::vertices(copied_graph_); vi != vi_end; ++vi)
+        {
+            Vertex v_copy = (*vi);
+            Vertex v_original = copy_to_original_[v_copy];
+
+            // Ignore vertices off the paths
+            if (i_shortest_paths_[i].count(v_original) == 0)
+            {
+                continue;
+            }
+
+            // Iterate all outgoing edges at the current vertex
+            for (boost::tie(oei, oei_end) = boost::out_edges(v_copy, copied_graph_); oei != oei_end; ++oei)
+            {
+                Vertex t_copy = boost::target(*oei, copied_graph_);
+                Vertex t_original = copy_to_original_[t_copy];
+
+                // Ignore edges off the paths
+                if (i_shortest_paths_[i].count(t_original) == 0)
+                {
+                    continue;
+                }
+
+                // Invert the edge direction and weight
+                double weight = boost::get(boost::edge_weight, copied_graph_,
+                                           *oei);
+                QueueAddEdge(t_copy, v_copy, -weight);
+                QueueRemoveEdge(v_copy, t_copy);
+            }
+        }
+
+        UpdateEdges();
+    }
+
+    double KShortestPaths::OverallCosts(size_t i)
+    {
+        EdgeWeightMap weights = boost::get(boost::edge_weight, original_graph_);
+        boost::graph_traits<DirectedGraph>::edge_iterator ei, ei_end;
+        double value = 0.0;
+
+        for (boost::tie(ei, ei_end) = boost::edges(original_graph_);
+             ei != ei_end; ++ei)
+        {
+            Vertex source = boost::source(*ei, original_graph_);
+            Vertex target = boost::target(*ei, original_graph_);
+
+            // Is edge within paths?
+            if (i_shortest_paths_[i].count(target) > 0 && i_shortest_paths_[i][target].count(source) > 0)
+            {
+                value += weights[*ei];
+            }
+        }
+
+        return value;
+    }
+
+    void KShortestPaths::CopyOriginalGraph()
+    {
+        // Clear all previous data
+        copied_graph_.clear();
+        original_to_copy_.clear();
+        copy_to_original_.clear();
+
+        // Copy the graph and store the vertex map temporarily
+        std::vector<Vertex> original_to_copy_vector(boost::num_vertices(original_graph_));
+        VertexVertexMap temp_map(original_to_copy_vector.begin());
+        boost::copy_graph(original_graph_,
+                          copied_graph_,
+                          boost::orig_to_copy(temp_map));
+
+        // Copy the vertex map into the two persistent maps, one for each
+        // mapping direction
+        boost::graph_traits<DirectedGraph>::vertex_iterator vi, vi_end;
+        for (boost::tie(vi, vi_end) = boost::vertices(original_graph_);
+             vi != vi_end; ++vi)
+        {
+            Vertex v_original = (*vi);
+            Vertex v_copy = temp_map[v_original];
+
+            original_to_copy_[v_original] = v_copy;
+            copy_to_original_[v_copy] = v_original;
+        }
+    }
+
+    void KShortestPaths::Interlace(size_t i)
+    {
+        boost::graph_traits<DirectedGraph>::edge_iterator ei, ei_end;
+        for (boost::tie(ei, ei_end) = boost::edges(original_graph_);
+             ei != ei_end; ++ei)
+        {
+            Vertex source = boost::source(*ei, original_graph_);
+            Vertex target = boost::target(*ei, original_graph_);
+
+            // Ignore source and sink
+            if (source == source_ || target == sink_)
+            {
+                continue;
+            }
+
+            // Is edge within paths?
+            if (i_shortest_paths_[i].count(target) > 0 && i_shortest_paths_[i][target].count(source) > 0)
+            {
+                // Is edge duplicate?
+                if (i_shortest_paths_[i].count(source) > 0 && i_shortest_paths_[i][source].count(target) > 0)
+                {
+                    i_shortest_paths_[i][target].erase(source);
+                    i_shortest_paths_[i][source].erase(target);
+                }
+            }
+        }
+    }
+
+    void KShortestPaths::FindAndAugmentPath(size_t i, bool original)
+    {
+        // Add new path maps until the needed iteration is reached
+        while (i_shortest_paths_.size() < (i + 1))
+        {
+            i_shortest_paths_.push_back(MultiPredecessorMap());
+        }
+
+        // Only copy old paths if old paths exist
+        if (i > 0)
+        {
+            // Copy the old paths
+            for (auto it = i_shortest_paths_[i - 1].begin();
+                 it != i_shortest_paths_[i - 1].end(); ++it)
+            {
+                i_shortest_paths_[i][(*it).first] = (*it).second;
+            }
+        }
+
+        if (original)
+        {
+            // Prepare variables for path finding
+            size_t graph_size = boost::num_vertices(original_graph_);
+            std::vector<Vertex> pred_list(graph_size);
+            std::vector<double> dist_list(graph_size);
+            VertexIndexMap graph_indices = boost::get(boost::vertex_index,
+                                                      original_graph_);
+            PredecessorMap pred_map(&pred_list[0], graph_indices);
+            DistanceMap dist_map(&dist_list[0], graph_indices);
+
+            // Find the shortest path
+            boost::dijkstra_shortest_paths(original_graph_,
+                                           source_,
+                                           boost::predecessor_map(pred_map)
+                                                   .distance_map(dist_map));
+
+            // Add the new path
+            for (Vertex u = sink_, v = pred_map[u];
+                 u != v; u = v, v = pred_map[v])
+            {
+                i_shortest_paths_[i][u].insert(v);
+            }
+        }
+        else
+        {
+            // Prepare variables for path finding
+            size_t graph_size = boost::num_vertices(copied_graph_);
+            Vertex root_vertex = original_to_copy_[source_];
+            std::vector<Vertex> pred_list(graph_size);
+            std::vector<double> dist_list(graph_size);
+            VertexIndexMap graph_indices = boost::get(boost::vertex_index,
+                                                      copied_graph_);
+            EdgeWeightMap weight_map = boost::get(boost::edge_weight,
+                                                     copied_graph_);
+            PredecessorMap pred_map(&pred_list[0], graph_indices);
+            DistanceMap dist_map(&dist_list[0], graph_indices);
+
+            // Find the shortest path
+            boost::bellman_ford_shortest_paths(copied_graph_,
+                                               graph_size,
+                                               boost::root_vertex(root_vertex)
+                                                       .weight_map(weight_map)
+                                                       .predecessor_map(pred_map)
+                                                       .distance_map(dist_map));
+
+            // Add the new path (the given path is in the copied graph, so the
+            // vertices need to be mapped to the original graph)
+            Vertex sink_copy = original_to_copy_[sink_];
+            for (Vertex u_copy = sink_copy, v_copy = pred_map[u_copy];
+                 u_copy != v_copy; u_copy = v_copy, v_copy = pred_map[v_copy])
+            {
+                Vertex u_original = copy_to_original_[u_copy];
+                Vertex v_original = copy_to_original_[v_copy];
+
+                // Ignore loops
+                if (u_original == v_original)
+                {
+                    continue;
+                }
+
+                i_shortest_paths_[i][u_original].insert(v_original);
+            }
+        }
+    }
+
+    void KShortestPaths::UpdateEdges()
+    {
+        // Remove the old edges, needs to be done without any iterator since
+        // the removal invalidates any iterators
+        for (auto edge : edges_to_remove_)
+        {
+            boost::remove_edge(edge.first, edge.second, copied_graph_);
+        }
+        edges_to_remove_.clear();
+
+        // Add the new edges, needs to be done without any iterator since
+        // the addition invalidates any iterators
+        for (auto edge : edges_to_add_)
+        {
+            boost::add_edge(edge.first.first, edge.first.second,
+                            edge.second, copied_graph_);
+        }
+        edges_to_add_.clear();
+    }
+
+    void KShortestPaths::QueueAddEdge(Vertex source, Vertex target, double weight)
+    {
+        edges_to_add_.push_back(
+                std::pair<std::pair<Vertex, Vertex>, double>(
+                        std::pair<Vertex, Vertex>(source, target), weight));
+    }
+
+    void KShortestPaths::QueueRemoveEdge(Vertex source, Vertex target)
+    {
+        edges_to_remove_.push_back(std::pair<Vertex, Vertex>(source, target));
+    }
+}
+

+ 156 - 0
algo/KShortestPaths.h

@@ -0,0 +1,156 @@
+//
+// Created by wrede on 25.05.16.
+//
+
+#ifndef GBMOT_KSHORTESTPATHS_H
+#define GBMOT_KSHORTESTPATHS_H
+
+#include "../graph/Definitions.h"
+#include "../core/ObjectData.h"
+#include "../core/Tracklet.h"
+
+namespace algo
+{
+    /**
+     * Class providing a k-shortest-paths algorithm implementation.
+     */
+    class KShortestPaths
+    {
+    private:
+        /**
+         * The original graph, will not be altered.
+         */
+        DirectedGraph original_graph_;
+
+        /**
+         * The current copy of the original graph, will be transformed.
+         */
+        DirectedGraph copied_graph_;
+
+        /**
+         * The starting vertex for the next algorithm run.
+         * Corresponds to the original graph.
+         */
+        const Vertex source_;
+
+        /**
+         * The target vertex for the next algorithm run.
+         * Corresponds to the original graph.
+         */
+        const Vertex sink_;
+
+        /**
+         * Maps the vertices in the original graph to the vertices in the copied
+         * graph.
+         */
+        std::unordered_map<Vertex, Vertex> original_to_copy_;
+
+        /**
+         * Maps the vertices in the copied graph to the vertices in the original
+         * graph.
+         */
+        std::unordered_map<Vertex, Vertex> copy_to_original_;
+
+        /**
+         * All found paths for every iteration of the current run.
+         * Corresponds to the original graph.
+         */
+        std::vector<MultiPredecessorMap> i_shortest_paths_;
+
+        /**
+         * Creates a copy of the original graph and updates all corresponding
+         * maps.
+         */
+        void CopyOriginalGraph();
+
+        /**
+         * Extends the current copied graph.
+         * Splits the vertices along all paths at the given iteration into two
+         * vertices, one for incoming edges and one for outgoing edges. Connects
+         * the two vertices with an auxiliary edge.
+         * @param i The targeted shortest paths iteration
+         */
+        void ExtendGraph(size_t i);
+
+        /**
+         * Calculates the path costs of every path at the iteration given.
+         * @param i The targeted shortest paths iteration
+         */
+        double OverallCosts(size_t i);
+
+        /**
+         * Interlaces all paths in the given iterations.
+         * Removes duplicate edges and produces node-disjoint paths.
+         * @param i The targeted shortest paths iteration
+         */
+        void Interlace(size_t i);
+
+        /**
+         * Finds the shortest path in either the original or the copied graph.
+         * Adds the path to the given iteration of the i_shortest_paths map.
+         * @param i The targeted shortest paths iteration
+         * @param original If true, the original graph will be used, else the
+         *                 current copied graph will be used.
+         */
+        void FindAndAugmentPath(size_t i, bool original);
+
+        /**
+         * Utility variable. Simulates a queue for the edges to add in the next
+         * edge update call. All edges and vertices correspond to the copied
+         * graph.
+         */
+        std::vector<std::pair<std::pair<Vertex, Vertex>, double>> edges_to_add_;
+
+        /**
+         * Utility variable. Simulates a queue for the edges to remove in the
+         * next edge update call. All edges and vertices correspond to the
+         * copied graph.
+         */
+        std::vector<std::pair<Vertex, Vertex>> edges_to_remove_;
+
+        /**
+         * Queues the edge between the given two vertices.
+         * In the next update edges call the edge will be removed.
+         * @param source The source vertex
+         * @param target The target vertex
+         */
+        void QueueRemoveEdge(Vertex source, Vertex target);
+
+        /**
+         * Queues the edge between the given two vertices.
+         * In the next update edges call the edge will be added with the given
+         * weight.
+         * @param source The source vertex
+         * @param target The target vertex
+         * @param weight The weight of the edge
+         */
+        void QueueAddEdge(Vertex source, Vertex target, double weight);
+
+        /**
+         * Updates the copied graph with all queued edges.
+         * First removes the queued edges then adds the queued edges.
+         */
+        void UpdateEdges();
+    public:
+        /**
+         * Initializes the k-shortest-paths algorithm for the given graph.
+         * Uses the source vertex as starting and the sink vertex as target
+         * vertex.
+         * @param graph The graph to work with
+         * @param source The starting vertex
+         * @param sink The target vertex
+         */
+        KShortestPaths(DirectedGraph graph, Vertex source, Vertex sink);
+
+        /**
+         * Runs the algorithm to find the given number of shortest paths.
+         * The actual number of paths found is the number of entries in the
+         * MultiPredecessorMap with the sink vertex as the key.
+         * @param max_path_count The maximum number of paths to find
+         */
+        MultiPredecessorMap Run(size_t max_path_count);
+    };
+}
+
+
+#endif //GBMOT_KSHORTESTPATHS_H

+ 12 - 11
algo/TwoStage.cpp

@@ -4,19 +4,19 @@
 
 #include "TwoStage.h"
 #include "../util/Logger.h"
+#include <boost/graph/dijkstra_shortest_paths.hpp>
 
 namespace algo
 {
     TwoStage::TwoStage(size_t max_frame_skip, double penalty_value,
                        size_t max_tracklet_count)
+        : max_frame_skip_(max_frame_skip), penalty_value_(penalty_value),
+          max_tracklet_count_(max_tracklet_count)
     {
-        max_frame_skip_ = max_frame_skip;
-        penalty_value_ = penalty_value;
-        max_tracklet_count_ = max_tracklet_count;
     }
 
     void TwoStage::CreateObjectGraph(DirectedGraph& graph,
-                                     core::DetectionSequence& detections)
+                                     const core::DetectionSequence& detections)
     {
         util::Logger::LogInfo("Creating object graph");
 
@@ -98,7 +98,7 @@ namespace algo
         Vertex tlt_src = boost::add_vertex(
                 core::ObjectDataPtr(new core::ObjectData()), tlt_graph);
 
-        // Prepare parameter for dijkstra
+        // Prepare variables for dijkstra
         size_t obj_graph_size = boost::num_vertices(obj_graph);
         std::vector<Vertex> obj_pred_list(obj_graph_size);
         std::vector<double> obj_dist_list(obj_graph_size);
@@ -131,9 +131,6 @@ namespace algo
             {
                 tracklet->AddPathObject(obj_values[u]);
 
-//                util::Logger::LogDebug(std::to_string(tracklet->GetFirstFrameIndex())
-//                                       + "," + std::to_string(tracklet->GetLastFrameIndex()));
-
                 // Leave source and sink untouched
                 if (!obj_values[u]->IsVirtual())
                 {
@@ -159,7 +156,9 @@ namespace algo
         }
 
         // Add sink to tracklet graph
-        Vertex tlt_snk = boost::add_vertex(core::ObjectDataPtr(new core::ObjectData()), tlt_graph);
+        Vertex tlt_snk =
+                boost::add_vertex(core::ObjectDataPtr(new core::ObjectData()),
+                                  tlt_graph);
 
         // Create edges
         size_t tlt_graph_size = boost::num_vertices(tlt_graph);
@@ -170,7 +169,8 @@ namespace algo
         for (size_t i = 1; i < tlt_graph_size - 1; ++i)
         {
             Vertex u = tlt_indices[i];
-            core::TrackletPtr u_ptr = std::static_pointer_cast<core::Tracklet>(tlt_values[u]);
+            core::TrackletPtr u_ptr =
+                    std::static_pointer_cast<core::Tracklet>(tlt_values[u]);
             size_t u_first_frame = u_ptr->GetFirstFrameIndex();
             size_t u_last_frame = u_ptr->GetLastFrameIndex();
 
@@ -180,7 +180,8 @@ namespace algo
                 if (i != j)
                 {
                     Vertex v = tlt_indices[j];
-                    core::TrackletPtr v_ptr = std::static_pointer_cast<core::Tracklet>(tlt_values[v]);
+                    core::TrackletPtr v_ptr =
+                            std::static_pointer_cast<core::Tracklet>(tlt_values[v]);
                     size_t v_first_frame = v_ptr->GetFirstFrameIndex();
 
                     if (u_last_frame < v_first_frame)

+ 9 - 8
algo/TwoStage.h

@@ -5,10 +5,9 @@
 #ifndef GBMOT_KOERNERTRACKING_H
 #define GBMOT_KOERNERTRACKING_H
 
-#include "Definitions.h"
 #include "../core/DetectionSequence.h"
 #include "../core/Tracklet.h"
-#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include "../graph/Definitions.h"
 
 namespace algo
 {
@@ -21,17 +20,17 @@ namespace algo
         /**
          * Maximum edge length to link object
          */
-        size_t max_frame_skip_;
+        const size_t max_frame_skip_;
 
         /**
          * Edge value to link to source and sink
          */
-        double penalty_value_;
+        const double penalty_value_;
 
         /**
          * Maximum dijkstra iterations / number of tracklets to create
          */
-        size_t max_tracklet_count_;
+        const size_t max_tracklet_count_;
     public:
         /**
          * Initializes the algorithm wih the given values.
@@ -48,7 +47,7 @@ namespace algo
          * @param detections The objects to use for the graph
          */
         void CreateObjectGraph(DirectedGraph& graph,
-                               core::DetectionSequence& detections);
+                               const core::DetectionSequence& detections);
 
         /**
          * Reduces the object graph into linked tracklets.
@@ -57,7 +56,8 @@ namespace algo
          * @param frame_count The frame count of the object graph
          */
         void CreateTrackletGraph(DirectedGraph& obj_graph,
-                                 DirectedGraph& tlt_graph, size_t frame_count);
+                                 DirectedGraph& tlt_graph,
+                                 size_t frame_count);
 
         /**
          * Extracts the finished tracks from the given tracklet graph.
@@ -65,7 +65,8 @@ namespace algo
          * @param depth The depth to flatten the tracklets to
          * @param tracks The vector to write the extracted tracks in
          */
-        void ExtractTracks(DirectedGraph& tlt_graph, size_t depth,
+        void ExtractTracks(DirectedGraph& tlt_graph,
+                           size_t depth,
                            std::vector<core::TrackletPtr>& tracks);
     };
 }

+ 0 - 28
core/Definitions.h

@@ -1,28 +0,0 @@
-//
-// Created by wrede on 22.04.16.
-//
-
-#ifndef GBMOT_CONSTANTS_H
-#define GBMOT_CONSTANTS_H
-
-#include <vector>
-#include <memory>
-
-namespace core
-{
-    class ObjectData;
-    class ObjectData3D;
-    class ObjectDataMap;
-    class ObjectDataAngular;
-    class Tracklet;
-
-    typedef std::vector<std::vector<std::vector<double>>> Vector3d;
-    typedef std::vector<std::vector<double>> Vector2d;
-    typedef std::shared_ptr<ObjectData> ObjectDataPtr;
-    typedef std::shared_ptr<ObjectData3D> ObjectData3DPtr;
-    typedef std::shared_ptr<ObjectDataMap> ObjectDataMapPtr;
-    typedef std::shared_ptr<ObjectDataAngular> ObjectDataAngularPtr;
-    typedef std::shared_ptr<Tracklet> TrackletPtr;
-}
-
-#endif //GBMOT_CONSTANTS_H

+ 0 - 1
core/DetectionSequence.h

@@ -6,7 +6,6 @@
 #define GBMOT_DETECTIONSEQUENCE_H
 
 
-#include "Definitions.h"
 #include <string>
 #include "ObjectData.h"
 #include "ObjectDataMap.h"

+ 4 - 1
core/ObjectData.h

@@ -6,14 +6,17 @@
 #define GBMOT_NODEDATA_H
 
 
-#include "Definitions.h"
 #include <string>
 #include <unordered_map>
 #include <iostream>
 #include <opencv2/core/core.hpp>
+#include <memory>
 
 namespace core
 {
+    class ObjectData;
+    typedef std::shared_ptr<ObjectData> ObjectDataPtr;
+
     //TODO RENAME ObjectDataBase / ObjectBase / DataBase / AObject / DetectionBase ...
     /**
      * Base class for all detected objects.

+ 2 - 2
core/ObjectData3D.cpp

@@ -10,8 +10,8 @@ namespace core
     ObjectData3D::ObjectData3D(size_t frame_index, cv::Point3d position)
             : ObjectData(frame_index),
               position_(position),
-              temporal_weight_(0.5),
-              spatial_weight_(0.5)
+              temporal_weight_(1.0),
+              spatial_weight_(1.0)
     {
     }
 

+ 3 - 0
core/ObjectData3D.h

@@ -10,6 +10,9 @@
 
 namespace core
 {
+    class ObjectData3D;
+    typedef std::shared_ptr<ObjectData3D> ObjectData3DPtr;
+
     /**
      * Class for storing a detection in three dimensional space.
      */

+ 1 - 3
core/ObjectDataAngular.cpp

@@ -10,10 +10,8 @@ namespace core
     ObjectDataAngular::ObjectDataAngular(size_t frame_index,
                                          const cv::Point3d& position,
                                          double angle)
-            : ObjectData3D(frame_index, position), angle_(angle), angular_weight_(1.0 / 3.0)
+            : ObjectData3D(frame_index, position), angle_(angle), angular_weight_(1.0)
     {
-        SetSpatialWeight(1.0 / 3.0);
-        SetTemporalWeight(1.0 / 3.0);
     }
 
     void ObjectDataAngular::SetAngularWeight(double weight)

+ 3 - 0
core/ObjectDataAngular.h

@@ -9,6 +9,9 @@
 
 namespace core
 {
+    class ObjectDataAngular;
+    typedef std::shared_ptr<ObjectDataAngular> ObjectDataAngularPtr;
+
     /**
      * Class for storing a detection in three dimensional space with an rotation
      * angle in radians.

+ 3 - 0
core/ObjectDataMap.h

@@ -13,6 +13,9 @@
 
 namespace core
 {
+    class ObjectDataMap;
+    typedef std::shared_ptr<ObjectDataMap> ObjectDataMapPtr;
+
     //TODO RENAME
     /**
      * Stores a map of key-value-weight pairs.

+ 3 - 0
core/Tracklet.h

@@ -11,6 +11,9 @@
 
 namespace core
 {
+    class Tracklet;
+    typedef std::shared_ptr<Tracklet> TrackletPtr;
+
     /**
      * A class for storing multiple object data objects.
      * The object data objects are handled as a path.

+ 39 - 0
graph/Definitions.h

@@ -0,0 +1,39 @@
+//
+// Created by wrede on 27.05.16.
+//
+
+#ifndef GBMOT_DEFINITIONS_H
+#define GBMOT_DEFINITIONS_H
+
+#include "../core/ObjectData.h"
+#include "../../../../../usr/include/boost/graph/properties.hpp"
+#include "../../../../../usr/include/boost/pending/property.hpp"
+#include "../../../../../usr/include/boost/graph/adjacency_list.hpp"
+#include "../../../../../usr/include/boost/graph/graph_selectors.hpp"
+#include "../../../../../usr/include/boost/graph/graph_traits.hpp"
+#include "../../../../../usr/include/boost/property_map/property_map.hpp"
+
+typedef boost::property<boost::edge_weight_t, double> EdgeProp;
+typedef boost::property <boost::vertex_name_t, core::ObjectDataPtr>
+        VertexProp;
+typedef boost::adjacency_list <
+        boost::listS, boost::vecS, boost::directedS, VertexProp, EdgeProp>
+        DirectedGraph;
+typedef boost::graph_traits<DirectedGraph>::edge_descriptor Edge;
+typedef boost::graph_traits<DirectedGraph>::vertex_descriptor Vertex;
+typedef boost::property_map<DirectedGraph, boost::edge_weight_t>::type
+        EdgeWeightMap;
+typedef boost::property_map<DirectedGraph, boost::vertex_index_t>::type
+        VertexIndexMap;
+typedef boost::property_map<DirectedGraph, boost::vertex_name_t>::type
+        VertexValueMap;
+typedef boost::iterator_property_map<Vertex*, VertexIndexMap, Vertex, Vertex&>
+        PredecessorMap;
+typedef std::map<Vertex, std::set<Vertex>> MultiPredecessorMap;
+typedef boost::iterator_property_map<double*, VertexIndexMap, double, double&>
+        DistanceMap;
+typedef boost::iterator_property_map<
+        std::vector<Vertex>::iterator, VertexIndexMap, Vertex, Vertex&>
+        VertexVertexMap;
+
+#endif //GBMOT_DEFINITIONS_H

+ 127 - 12
main/main.cpp

@@ -1,11 +1,11 @@
 //
 // Created by wrede on 19.04.16.
 //
-#include "../core/Definitions.h"
 #include "../core/DetectionSequence.h"
 #include "../util/FileIO.h"
 #include "../util/Parser.h"
 #include "../algo/TwoStage.h"
+#include "../algo/KShortestPaths.h"
 #include "../visual/Visualizer.h"
 #include "../util/Logger.h"
 #include "../core/ObjectDataAngular.h"
@@ -16,7 +16,7 @@ void ReadInput(const std::string& input_file, core::DetectionSequence& sequence,
 {
     util::Logger::LogInfo("Reading input");
 
-    core::Vector3d values;
+    util::Vector3d values;
     util::FileIO::ReadCSV(values, input_file);
     util::Parser::ParseObjectDataAngular(values, sequence,
                                          temporal_weight,
@@ -36,6 +36,7 @@ void ReadInput(const std::string& input_file, core::DetectionSequence& sequence,
 
 struct
 {
+    size_t iterations;
     size_t max_frame_skip;
     size_t max_tracklet_count;
     double penalty_value;
@@ -51,14 +52,39 @@ void RunTwoStage(core::DetectionSequence& sequence, const std::string& output_fi
                              two_stage_params.max_tracklet_count);
 
     // Running the two stage graph algorithm
-    algo::DirectedGraph obj_graph;
+    DirectedGraph obj_graph;
     two_stage.CreateObjectGraph(obj_graph, sequence);
-    algo::DirectedGraph tlt_graph_1;
-    two_stage.CreateTrackletGraph(obj_graph, tlt_graph_1, sequence.GetFrameCount());
-    algo::DirectedGraph tlt_graph_2;
-    two_stage.CreateTrackletGraph(tlt_graph_1, tlt_graph_2, sequence.GetFrameCount());
+
+    // Run the tracklet creation at least once
+    DirectedGraph tlt_graph_1, tlt_graph_2;
+    two_stage.CreateTrackletGraph(obj_graph, tlt_graph_1,
+                                  sequence.GetFrameCount());
+
+    // Run the tracklet creation iteratively
+    for (size_t i = 1; i < two_stage_params.iterations; ++i)
+    {
+        if (i % 2 == 0)
+        {
+            two_stage.CreateTrackletGraph(tlt_graph_2, tlt_graph_1,
+                                          sequence.GetFrameCount());
+        }
+        else
+        {
+            two_stage.CreateTrackletGraph(tlt_graph_1, tlt_graph_2,
+                                          sequence.GetFrameCount());
+        }
+    }
+
+    // Extract tracklets and flatten tracklets
     std::vector<core::TrackletPtr> tracks;
-    two_stage.ExtractTracks(tlt_graph_2, 1, tracks);
+    if (two_stage_params.iterations % 2 == 0)
+    {
+        two_stage.ExtractTracks(tlt_graph_2, two_stage_params.iterations - 1, tracks);
+    }
+    else
+    {
+        two_stage.ExtractTracks(tlt_graph_1, two_stage_params.iterations - 1, tracks);
+    }
 
     // Interpolate tracks
     for (auto track : tracks)
@@ -109,9 +135,13 @@ void Run(int argc, char** argv)
             ("images-folder,f",
              boost::program_options::value<std::string>(&images_folder),
              "set images folder path")
+            ("iterations",
+             boost::program_options::value<size_t>(&two_stage_params.iterations)->default_value((2)),
+             "(two-stage) number of tracklet extraction iterations")
             ("max-frame-skip",
              boost::program_options::value<size_t>(&two_stage_params.max_frame_skip)->default_value(1),
-             "(two stage) set the maximum number of frames a track can skip between two detections")
+             "(two stage) set the maximum number of frames a track can skip between two detections,"
+                     " if set to less or equal than zero all frames are linked")
             ("max-tracklet-count",
              boost::program_options::value<size_t>(&two_stage_params.max_tracklet_count)->default_value(1),
              "(two stage) set the maximum number of tracklets to be extracted")
@@ -119,13 +149,13 @@ void Run(int argc, char** argv)
              boost::program_options::value<double>(&two_stage_params.penalty_value)->default_value(0.0),
              "(two stage) set the penalty value for edges from and to source and sink")
             ("temporal-weight",
-             boost::program_options::value<double>(&temporal_weight)->default_value(0.3),
+             boost::program_options::value<double>(&temporal_weight)->default_value(1.0),
              "temporal weight for difference calculations between two detections")
             ("spatial-weight",
-             boost::program_options::value<double>(&spatial_weight)->default_value(0.3),
+             boost::program_options::value<double>(&spatial_weight)->default_value(1.0),
              "spatial weight for difference calculations between two detections")
             ("angular-weight",
-             boost::program_options::value<double>(&angular_weight)->default_value(0.3),
+             boost::program_options::value<double>(&angular_weight)->default_value(1.0),
              "angular weight for difference calculations between two detections");
 
     boost::program_options::variables_map opt_var_map;
@@ -170,11 +200,96 @@ void Run(int argc, char** argv)
     }
 }
 
+void CreateTestGraph(DirectedGraph& graph, Vertex& source, Vertex& sink)
+{
+    // Create test graph (suurballe wikipedia example)
+//    std::vector<Vertex> vertices;
+//    for (size_t i = 0; i < 6; ++i)
+//    {
+//        vertices.push_back(
+//                boost::add_vertex(
+//                        core::ObjectDataPtr(new core::ObjectData(i)),graph));
+//    }
+//
+//    // AB
+//    boost::add_edge(vertices[0], vertices[1], 1.0, graph);
+//
+//    // AC
+//    boost::add_edge(vertices[0], vertices[2], 2.0, graph);
+//
+//    // BD
+//    boost::add_edge(vertices[1], vertices[3], 1.0, graph);
+//
+//    // BE
+//    boost::add_edge(vertices[1], vertices[4], 2.0, graph);
+//
+//    // CD
+//    boost::add_edge(vertices[2], vertices[3], 2.0, graph);
+//
+//    // DF
+//    boost::add_edge(vertices[3], vertices[5], 1.0, graph);
+//
+//    // EF
+//    boost::add_edge(vertices[4], vertices[5], 2.0, graph);
+//
+//    source = vertices[0];
+//    sink = vertices[5];
+
+    // Create test graph (disjoint path finding example)
+    std::vector<Vertex> vertices;
+    for (size_t i = 0; i < 8; ++i)
+    {
+        vertices.push_back(
+                boost::add_vertex(
+                        core::ObjectDataPtr(new core::ObjectData(i)),graph));
+    }
+
+    boost::add_edge(vertices[0], vertices[1], 1.0, graph);
+    boost::add_edge(vertices[0], vertices[4], 1.0, graph);
+    boost::add_edge(vertices[1], vertices[2], 1.0, graph);
+    boost::add_edge(vertices[2], vertices[3], 1.0, graph);
+    boost::add_edge(vertices[3], vertices[7], 1.0, graph);
+    boost::add_edge(vertices[4], vertices[3], 1.0, graph);
+    boost::add_edge(vertices[4], vertices[5], 3.0, graph);
+    boost::add_edge(vertices[5], vertices[6], 1.0, graph);
+    boost::add_edge(vertices[5], vertices[3], 1.0, graph);
+    boost::add_edge(vertices[6], vertices[7], 1.0, graph);
+
+    source = vertices[0];
+    sink = vertices[7];
+}
+
 int main(int argc, char** argv)
 {
     Run(argc, argv);
 
     //TestTracklet();
 
+//    Vertex source, sink;
+//    DirectedGraph graph;
+//
+//    util::Logger::SetDebug(true);
+//    util::Logger::SetInfo(true);
+//
+//    CreateTestGraph(graph, source, sink);
+//
+//    algo::KShortestPaths ksp(graph, source, sink);
+//    MultiPredecessorMap paths = ksp.Run(3);
+//
+//    util::Logger::LogDebug("found paths:");
+//    for (Vertex first : paths[sink])
+//    {
+//        std::string path;
+//        path += std::to_string(sink) + "->" + std::to_string(first);
+//
+//        for (Vertex u = first, v = (*paths[u].begin());
+//             u != v; u = v, v = (*paths[v].begin()))
+//        {
+//            path += "->" + std::to_string(v);
+//        }
+//
+//        util::Logger::LogDebug(path);
+//    }
+
     return 0;
 }

+ 1 - 1
main/preview.cpp

@@ -274,7 +274,7 @@ if (iLayers + 100 >= vertices.size())
 
                         // edge weight
                         //std::cout << " x" << params.maxLinkDistance << "," << params.maxAngularDistance << "; " << distPosition << "," << distAngular << "," << iOffset << " = " << 0.1 * (distPosition + 0.5 * distAngular) * double(iOffset) << std::endl;
-                        if (false || (distPosition < params.maxLinkDistance && distAngular < params.maxAngularDistance)) {
+                        if (distPosition < params.maxLinkDistance && distAngular < params.maxAngularDistance) {
                             // if we discard one layer, the edge weight should be higher!
                             boost::add_edge(vP, vQ, 0.1 * (distPosition + 0.5 * distAngular) * double(iOffset), g);
                             //boost::add_edge(vP, vQ, 0.001 * Weight((1.0 + 0.33 * distPosition) * (1.0 + distAngular) * Weight(1.0 + iOffset)), g);

+ 68 - 4
util/FileIO.cpp

@@ -2,13 +2,16 @@
 // Created by wrede on 19.04.16.
 //
 
+#include <algorithm>
 #include "FileIO.h"
 #include "Logger.h"
+#include "dirent.h"
 
 namespace util
 {
-    void FileIO::ReadCSV(core::Vector3d& values, const std::string& filename,
-                         const char& delimiter)
+    void FileIO::ReadCSV(Vector3d& values,
+                         const std::string& filename,
+                         char delimiter)
     {
         Logger::LogInfo("Reading CSV file");
 
@@ -50,8 +53,9 @@ namespace util
         Logger::LogDebug("frame count " + std::to_string(values.size()));
     }
 
-    void FileIO::ReadCSV(core::Vector2d& values, const std::string& filename,
-                         const char& delimiter)
+    void FileIO::ReadCSV(Vector2d& values,
+                         const std::string& filename,
+                         char delimiter)
     {
         Logger::LogInfo("Reading CSV file");
 
@@ -89,5 +93,65 @@ namespace util
 
         Logger::LogDebug("line count " + std::to_string(values.size()));
     }
+
+    void FileIO::ListFiles(const std::string& folder,
+                           std::vector<std::string>& file_names,
+                           bool sort)
+    {
+        Logger::LogInfo("Listing files in folder");
+
+        DIR* dir;
+        struct dirent *ent;
+        if ((dir = opendir(folder.c_str())) != NULL)
+        {
+            int offset = 2;
+            while ((ent = readdir(dir)) != NULL)
+            {
+                if (offset <= 0)
+                {
+                    file_names.push_back(ent->d_name);
+                }
+                offset--;
+            }
+            closedir(dir);
+
+            if (sort)
+            {
+                std::sort(file_names.begin(), file_names.end());
+            }
+
+            Logger::LogDebug("file count " + std::to_string(file_names.size()));
+        }
+        else
+        {
+            Logger::LogError("Could not open folder");
+        }
+    }
+
+    void FileIO::WriteCSVMatlab(DirectedGraph& graph,
+                                const std::string& file_name,
+                                char delimiter)
+    {
+        std::ofstream out(file_name, std::ofstream::out);
+
+        // Iterate all outgoing edges of every vertex
+        EdgeWeightMap weights = boost::get(boost::edge_weight, graph);
+        VertexIndexMap indices = boost::get(boost::vertex_index, graph);
+        boost::graph_traits<DirectedGraph>::vertex_iterator vi, vi_end;
+        boost::graph_traits<DirectedGraph>::out_edge_iterator oei, oei_end;
+        for (boost::tie(vi, vi_end) = boost::vertices(graph); vi != vi_end; ++vi)
+        {
+            for (boost::tie(oei, oei_end) = boost::out_edges(*vi, graph);
+                 oei != oei_end; ++oei)
+            {
+                // Write the edge to file
+                out << indices[boost::source(*oei, graph)] << delimiter
+                    << indices[boost::target(*oei, graph)] << delimiter
+                    << weights[*oei] << std::endl;
+            }
+        }
+
+        out.close();
+    }
 }
 

+ 33 - 5
util/FileIO.h

@@ -5,12 +5,17 @@
 #ifndef GBMOT_FILEIO_H
 #define GBMOT_FILEIO_H
 
-#include "../core/Definitions.h"
 #include <string>
 #include <fstream>
+#include <vector>
+#include "../core/ObjectData.h"
+#include "../graph/Definitions.h"
 
 namespace util
 {
+    typedef std::vector<std::vector<std::vector<double>>> Vector3d;
+    typedef std::vector<std::vector<double>> Vector2d;
+
     /**
      * Utility class for file in- and output.
      */
@@ -28,8 +33,9 @@ namespace util
          * @param filename The filename to read from
          * @param delimiter The delimiter used to separate the values in the file
          */
-        static void ReadCSV(core::Vector3d& values, const std::string& filename,
-                            const char& delimiter = ';');
+        static void ReadCSV(Vector3d& values,
+                            const std::string& filename,
+                            char delimiter = ';');
 
         /**
          * Reads a CSV file and stores the values in a 2D array.
@@ -38,8 +44,30 @@ namespace util
          * @param filename The filename to read from
          * @param delimiter The delimiter used to separate the values in the file
          */
-        static void ReadCSV(core::Vector2d& values, const std::string& filename,
-                            const char& delimiter = ';');
+        static void ReadCSV(Vector2d& values,
+                            const std::string& filename,
+                            char delimiter = ';');
+
+        /**
+         * Lists all file names in the given folder.
+         * @param folder The folder to look into
+         * @param file_names The vector to store the file names into
+         * @param sort True, if the files should be sorted alphabetically
+         */
+        static void ListFiles(const std::string& folder,
+                              std::vector<std::string>& file_names,
+                              bool sort = true);
+
+        /**
+         * Writes the given graph into a CSV file with an format readable by
+         * Matlab.
+         * @param graph The graph to write
+         * @param file_name The name of the file to write into
+         * @param delimiter The delimiter to use
+         */
+        static void WriteCSVMatlab(DirectedGraph& graph,
+                                   const std::string& file_name,
+                                   char delimiter = ';');
     };
 }
 

+ 6 - 7
util/Parser.cpp

@@ -9,10 +9,9 @@
 
 namespace util
 {
-    void Parser::ParseObjectDataMap(
-            const std::vector<std::string>& keys,
-            const core::Vector3d& values,
-            core::DetectionSequence& sequence)
+    void Parser::ParseObjectDataMap(const std::vector<std::string>& keys,
+                                    const Vector3d& values,
+                                    core::DetectionSequence& sequence)
     {
         util::Logger::LogInfo("Parsing ObjectDataMap");
 
@@ -30,7 +29,7 @@ namespace util
         }
     }
 
-    void Parser::ParseObjectData3D(const core::Vector3d& values,
+    void Parser::ParseObjectData3D(const Vector3d& values,
                                    core::DetectionSequence& sequence)
     {
         util::Logger::LogInfo("Parsing ObjectData3D");
@@ -76,7 +75,7 @@ namespace util
         }
     }
 
-    void Parser::ParseObjectDataAngular(const core::Vector3d& values,
+    void Parser::ParseObjectDataAngular(const Vector3d& values,
                                         core::DetectionSequence& sequence)
     {
         util::Logger::LogInfo("Parsing ObjectDataAngular");
@@ -123,7 +122,7 @@ namespace util
         }
     }
 
-    void Parser::ParseObjectDataAngular(const core::Vector3d& values,
+    void Parser::ParseObjectDataAngular(const Vector3d& values,
                                         core::DetectionSequence& sequence,
                                         double temporal_weight,
                                         double spatial_weight,

+ 11 - 12
util/Parser.h

@@ -5,7 +5,6 @@
 #ifndef GBMOT_PARSE_H
 #define GBMOT_PARSE_H
 
-#include "../core/Definitions.h"
 #include "../core/DetectionSequence.h"
 #include "../core/ObjectData.h"
 #include "../core/ObjectDataMap.h"
@@ -14,6 +13,9 @@
 
 namespace util
 {
+    typedef std::vector<std::vector<std::vector<double>>> Vector3d;
+    typedef std::vector<std::vector<double>> Vector2d;
+
     /**
      * Utility class for parsing diverse objects.
      */
@@ -29,28 +31,25 @@ namespace util
          * @param values A 3D vector of values
          * @param sequence The sequence to store the created objects in
          */
-        static void ParseObjectDataMap(
-                const std::vector<std::string>& keys,
-                const core::Vector3d& values,
-                core::DetectionSequence& sequence);
+        static void ParseObjectDataMap(const std::vector<std::string>& keys,
+                                       const Vector3d& values,
+                                       core::DetectionSequence& sequence);
 
         /**
          * Parses the values into a DetectionSequence of ObjectData3D
          * @param values A 3D vector of values
          * @param sequence The sequence to store the created objects in
          */
-        static void ParseObjectData3D(
-                const core::Vector3d& values,
-                core::DetectionSequence& sequence);
+        static void ParseObjectData3D(const Vector3d& values,
+                                      core::DetectionSequence& sequence);
 
         /**
          * Parses the values into a DetectionSequence of ObjectDataAngular objects.
          * @param values A 3D vector of values
          * @param sequence The sequence to store the created objects in
          */
-        static void ParseObjectDataAngular(
-                const core::Vector3d& values,
-                core::DetectionSequence& sequence);
+        static void ParseObjectDataAngular(const Vector3d& values,
+                                           core::DetectionSequence& sequence);
 
         /**
          * Parses the values into a DetectionSequence of ObjectDataAngular objects.
@@ -61,7 +60,7 @@ namespace util
          * @param spatial_weight The spatial weight
          * @param angular_weight The angular weight
          */
-        static void ParseObjectDataAngular(const core::Vector3d& values,
+        static void ParseObjectDataAngular(const Vector3d& values,
                                            core::DetectionSequence& sequence,
                                            double temporal_weight,
                                            double spatial_weight,

+ 3 - 28
visual/Visualizer.cpp

@@ -5,35 +5,10 @@
 #include "Visualizer.h"
 #include "../util/Logger.h"
 #include "../core/ObjectDataAngular.h"
+#include "../util/FileIO.h"
 
 namespace visual
 {
-    void Visualizer::LoadImages(std::string image_folder,
-                                std::vector<std::string>& image_files)
-    {
-        DIR* dir;
-        struct dirent *ent;
-        if ((dir = opendir(image_folder.c_str())) != NULL)
-        {
-            int offset = 2;
-            while ((ent = readdir(dir)) != NULL)
-            {
-                if (offset <= 0)
-                {
-                    image_files.push_back(ent->d_name);
-                }
-                offset--;
-            }
-            closedir(dir);
-
-            std::sort(image_files.begin(), image_files.end());
-        }
-        else
-        {
-            perror("Could not open image folder");
-        }
-    }
-
     void Visualizer::Display(core::DetectionSequence& sequence,
                              std::string image_folder,
                              std::string title, size_t first_frame,
@@ -43,7 +18,7 @@ namespace visual
 
         // Load images
         std::vector<std::string> image_files;
-        LoadImages(image_folder, image_files);
+        util::FileIO::ListFiles(image_folder, image_files);
 
         if (image_files.size() != sequence.GetFrameCount())
         {
@@ -148,7 +123,7 @@ namespace visual
 
         // Load images
         std::vector<std::string> image_files;
-        LoadImages(image_folder, image_files);
+        util::FileIO::ListFiles(image_folder, image_files);
 
         // Create window
         cv::namedWindow(title, CV_WINDOW_AUTOSIZE);

+ 0 - 10
visual/Visualizer.h

@@ -8,7 +8,6 @@
 #include <opencv2/core/core.hpp>
 #include <opencv2/opencv.hpp>
 #include "../core/DetectionSequence.h"
-#include "../core/Definitions.h"
 #include "../core/ObjectData3D.h"
 #include "../core/Tracklet.h"
 #include "dirent.h"
@@ -28,15 +27,6 @@ namespace visual
          * @return the current time in ms
          */
         int GetTime();
-
-        /**
-         * Loads the names of all files in the given folder into the given
-         * vector.
-         * @param image_folder The folder to read the files from
-         * @param image_files The vector to store the file names in
-         */
-        void LoadImages(std::string image_folder,
-                        std::vector<std::string>& image_files);
     public:
         /**
          * Displays the given sequence in an window.

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff