Mercurial Hosting > traffic-intelligence
comparison trajectorymanagement/src/TrajectoryWriter.h @ 1159:e1e7acef8eab
moved trajectory management library into Traffic Intelligence
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 22 Feb 2021 22:09:35 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1158:7eb972942f22 | 1159:e1e7acef8eab |
---|---|
1 #ifndef TRAJECTORYWRITER_H_ | |
2 #define TRAJECTORYWRITER_H_ | |
3 | |
4 #include <fstream> | |
5 | |
6 #include "Trajectory.h" | |
7 | |
8 /** | |
9 * TrajectoryWriter class. | |
10 * | |
11 * The TrajectoryWriter class allows to save trajectories in different formats like image files, Matlab, Scilab or FreeMat files. | |
12 */ | |
13 class TrajectoryWriter | |
14 { | |
15 public: | |
16 /** | |
17 * Save the trajectory in the image. | |
18 * | |
19 * @param[in] trajectory trajectory | |
20 * @param[in] color color of the trajectory | |
21 * @param[in] img image on which the trajectory should be saved | |
22 * @return image with the saved trajectory | |
23 */ | |
24 template<typename T> | |
25 void write(const Trajectory<T> &trajectory, CvScalar color, cv::Mat& img = cv::Mat::Mat()) | |
26 { | |
27 if (img.empty()) | |
28 { | |
29 img = createImg(trajectory); | |
30 } | |
31 | |
32 writeOnNotNullImg(trajectory, color, img); | |
33 } | |
34 | |
35 /** | |
36 * Save trajectories in the image. | |
37 * | |
38 * @param[in] img image on which the trajectory should be saved | |
39 * @param[in] trajectories trajectories | |
40 * @param[in] colors colors of trajectories | |
41 * @return image with saved trajectories | |
42 */ | |
43 template<typename T> | |
44 void saveInIplImage(cv::Mat& img, std::vector<Trajectory<T> > *trajectories, std::vector<CvScalar> *colors) | |
45 { | |
46 assert( !img.empty()); | |
47 assert( trajectories != NULL ); | |
48 assert( trajectories->size() > 0 ); | |
49 assert( colors != NULL ); | |
50 assert( colors->size() > 0 ); | |
51 | |
52 unsigned nbOfColors = colors->size(); | |
53 | |
54 for (unsigned i = 0; i < trajectories->size(); ++i) | |
55 { | |
56 Trajectory<T> trajectory = (*trajectories)[i]; | |
57 CvScalar color = (*colors)[i % nbOfColors]; | |
58 writeOnNotNullImg(trajectory, color, img); | |
59 } | |
60 } | |
61 | |
62 /** | |
63 * Save trajectories in the Matlab format file. | |
64 * | |
65 * @param[in] file name of the file | |
66 * @param[in] trajectories trajectories | |
67 * @param[in] writeWithVisualization information if functions to visualize data should be written into the file | |
68 * @param[in] plotCommand2D command to plot in 2D | |
69 * @param[in] plotCommand3D command to plot in 3D | |
70 */ | |
71 template<typename T> | |
72 void saveInMatlabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization = true, const char *plotCommand2D = "plot", const char *plotCommand3D = "plot3d") | |
73 { | |
74 saveInMatlabScilabFormat(file, trajectories, writeWithVisualization, plotCommand2D, plotCommand3D, true); | |
75 } | |
76 | |
77 /** | |
78 * Save trajectories in the Scilab format file. | |
79 * | |
80 * @param[in] file name of the file | |
81 * @param[in] trajectories trajectories | |
82 * @param[in] writeWithVisualization information if functions to visualize data should be written into the file | |
83 * @param[in] plotCommand2D command to plot in 2D | |
84 * @param[in] plotCommand3D command to plot in 3D | |
85 */ | |
86 template<typename T> | |
87 void saveInScilabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization = true, const char *plotCommand2D = "plot", const char *plotCommand3D = "plot3d") | |
88 { | |
89 saveInMatlabScilabFormat(file, trajectories, writeWithVisualization, plotCommand2D, plotCommand3D, false); | |
90 } | |
91 | |
92 private: | |
93 /** | |
94 * Create image on which the trajectory can be saved. | |
95 * | |
96 * @param[in] trajectory trajectory | |
97 * @return image | |
98 */ | |
99 template<typename T> | |
100 cv::Mat createImg(const Trajectory<cv::Point_<T> > &trajectory) | |
101 { | |
102 cv::Point_<T> _min = min(trajectory); | |
103 cv::Point_<T> _max = max(trajectory); | |
104 CvSize imgSize = cvSize(_max.x + 1, _max.y + 1); | |
105 cv::Mat img = cv::Mat::zeros(imgSize, CV_8UC3); | |
106 return img; | |
107 } | |
108 | |
109 /** | |
110 * Save the trajectory in the image. | |
111 * | |
112 * @param[in] trajectory trajectory | |
113 * @param[in] color color of the trajectory | |
114 * @param[in] img image on which the trajectory should be saved | |
115 * @return image with the saved trajectory | |
116 */ | |
117 template<typename T> | |
118 void writeOnNotNullImg(const Trajectory<T> &trajectory, CvScalar color, cv::Mat& img) | |
119 { | |
120 assert( !img.empty() ); | |
121 for (unsigned int i = 1; i < trajectory.size(); ++i) | |
122 { | |
123 const T p1 = trajectory.getPoint(i - 1); | |
124 const T p2 = trajectory.getPoint(i); | |
125 cv::line(img, p1, p2, color); | |
126 } | |
127 } | |
128 | |
129 /** | |
130 * Save trajectories in the Matlab or Scilab format file. | |
131 * | |
132 * @param[in] file name of the file | |
133 * @param[in] trajectories trajectories | |
134 * @param[in] writeWithVisualization information if functions to visualize data should be written into the file | |
135 * @param[in] plotCommand2D command to plot in 2D | |
136 * @param[in] plotCommand3D command to plot in 3D | |
137 * @param[in] matlab information whether trajectories should be saved in Matlab or Scilab format | |
138 */ | |
139 template<typename T> | |
140 void saveInMatlabScilabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization, const char *plotCommand2D, const char *plotCommand3D, bool matlab) | |
141 { | |
142 if (trajectories == NULL) | |
143 { | |
144 assert( false ); | |
145 } | |
146 | |
147 std::stringstream matlabFileSS; | |
148 | |
149 if (matlab) | |
150 { | |
151 matlabFileSS << "hold on;\n"; | |
152 } | |
153 | |
154 for (unsigned i = 0; i < trajectories->size(); ++i) | |
155 { | |
156 matlabFileSS << "T"; | |
157 matlabFileSS << i << "=["; | |
158 | |
159 for (unsigned j = 0; j < (*trajectories)[i].size(); ++j) | |
160 { | |
161 matlabFileSS << (*trajectories)[i].getPoint(j); | |
162 | |
163 if (j < (*trajectories)[i].size() - 1) | |
164 { | |
165 matlabFileSS << ";"; | |
166 } | |
167 } | |
168 | |
169 matlabFileSS << "];\n"; | |
170 | |
171 if (writeWithVisualization) | |
172 { | |
173 matlabFileSS << "if size(T" << i << ",2) == 2\n"; | |
174 matlabFileSS << "\t\t" << plotCommand2D << "( T" << i << "(:,1), T" << i << "(:,2) );\n"; | |
175 matlabFileSS << "end;\n"; | |
176 matlabFileSS << "if size(T" << i << ",2) == 3\n"; | |
177 matlabFileSS << "\t\t" << plotCommand3D << "( T" << i << "(:,1), T" << i << "(:,2), T" << i << "(:,3) );\n"; | |
178 matlabFileSS << "end;\n"; | |
179 } | |
180 } | |
181 | |
182 std::ofstream matlabFile; | |
183 matlabFile.open(file, std::ios::out); | |
184 matlabFile << matlabFileSS.str(); | |
185 matlabFile.flush(); | |
186 matlabFile.close(); | |
187 } | |
188 }; | |
189 | |
190 #endif /* TRAJECTORYWRITER_H_ */ |