Mercurial Hosting > traffic-intelligence
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/trajectorymanagement/src/TrajectoryWriter.h Mon Feb 22 22:09:35 2021 -0500 @@ -0,0 +1,190 @@ +#ifndef TRAJECTORYWRITER_H_ +#define TRAJECTORYWRITER_H_ + +#include <fstream> + +#include "Trajectory.h" + +/** + * TrajectoryWriter class. + * + * The TrajectoryWriter class allows to save trajectories in different formats like image files, Matlab, Scilab or FreeMat files. + */ +class TrajectoryWriter +{ +public: + /** + * Save the trajectory in the image. + * + * @param[in] trajectory trajectory + * @param[in] color color of the trajectory + * @param[in] img image on which the trajectory should be saved + * @return image with the saved trajectory + */ + template<typename T> + void write(const Trajectory<T> &trajectory, CvScalar color, cv::Mat& img = cv::Mat::Mat()) + { + if (img.empty()) + { + img = createImg(trajectory); + } + + writeOnNotNullImg(trajectory, color, img); + } + + /** + * Save trajectories in the image. + * + * @param[in] img image on which the trajectory should be saved + * @param[in] trajectories trajectories + * @param[in] colors colors of trajectories + * @return image with saved trajectories + */ + template<typename T> + void saveInIplImage(cv::Mat& img, std::vector<Trajectory<T> > *trajectories, std::vector<CvScalar> *colors) + { + assert( !img.empty()); + assert( trajectories != NULL ); + assert( trajectories->size() > 0 ); + assert( colors != NULL ); + assert( colors->size() > 0 ); + + unsigned nbOfColors = colors->size(); + + for (unsigned i = 0; i < trajectories->size(); ++i) + { + Trajectory<T> trajectory = (*trajectories)[i]; + CvScalar color = (*colors)[i % nbOfColors]; + writeOnNotNullImg(trajectory, color, img); + } + } + + /** + * Save trajectories in the Matlab format file. + * + * @param[in] file name of the file + * @param[in] trajectories trajectories + * @param[in] writeWithVisualization information if functions to visualize data should be written into the file + * @param[in] plotCommand2D command to plot in 2D + * @param[in] plotCommand3D command to plot in 3D + */ + template<typename T> + void saveInMatlabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization = true, const char *plotCommand2D = "plot", const char *plotCommand3D = "plot3d") + { + saveInMatlabScilabFormat(file, trajectories, writeWithVisualization, plotCommand2D, plotCommand3D, true); + } + + /** + * Save trajectories in the Scilab format file. + * + * @param[in] file name of the file + * @param[in] trajectories trajectories + * @param[in] writeWithVisualization information if functions to visualize data should be written into the file + * @param[in] plotCommand2D command to plot in 2D + * @param[in] plotCommand3D command to plot in 3D + */ + template<typename T> + void saveInScilabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization = true, const char *plotCommand2D = "plot", const char *plotCommand3D = "plot3d") + { + saveInMatlabScilabFormat(file, trajectories, writeWithVisualization, plotCommand2D, plotCommand3D, false); + } + +private: + /** + * Create image on which the trajectory can be saved. + * + * @param[in] trajectory trajectory + * @return image + */ + template<typename T> + cv::Mat createImg(const Trajectory<cv::Point_<T> > &trajectory) + { + cv::Point_<T> _min = min(trajectory); + cv::Point_<T> _max = max(trajectory); + CvSize imgSize = cvSize(_max.x + 1, _max.y + 1); + cv::Mat img = cv::Mat::zeros(imgSize, CV_8UC3); + return img; + } + + /** + * Save the trajectory in the image. + * + * @param[in] trajectory trajectory + * @param[in] color color of the trajectory + * @param[in] img image on which the trajectory should be saved + * @return image with the saved trajectory + */ + template<typename T> + void writeOnNotNullImg(const Trajectory<T> &trajectory, CvScalar color, cv::Mat& img) + { + assert( !img.empty() ); + for (unsigned int i = 1; i < trajectory.size(); ++i) + { + const T p1 = trajectory.getPoint(i - 1); + const T p2 = trajectory.getPoint(i); + cv::line(img, p1, p2, color); + } + } + + /** + * Save trajectories in the Matlab or Scilab format file. + * + * @param[in] file name of the file + * @param[in] trajectories trajectories + * @param[in] writeWithVisualization information if functions to visualize data should be written into the file + * @param[in] plotCommand2D command to plot in 2D + * @param[in] plotCommand3D command to plot in 3D + * @param[in] matlab information whether trajectories should be saved in Matlab or Scilab format + */ + template<typename T> + void saveInMatlabScilabFormat(const char *file, std::vector<Trajectory<T> > *trajectories, bool writeWithVisualization, const char *plotCommand2D, const char *plotCommand3D, bool matlab) + { + if (trajectories == NULL) + { + assert( false ); + } + + std::stringstream matlabFileSS; + + if (matlab) + { + matlabFileSS << "hold on;\n"; + } + + for (unsigned i = 0; i < trajectories->size(); ++i) + { + matlabFileSS << "T"; + matlabFileSS << i << "=["; + + for (unsigned j = 0; j < (*trajectories)[i].size(); ++j) + { + matlabFileSS << (*trajectories)[i].getPoint(j); + + if (j < (*trajectories)[i].size() - 1) + { + matlabFileSS << ";"; + } + } + + matlabFileSS << "];\n"; + + if (writeWithVisualization) + { + matlabFileSS << "if size(T" << i << ",2) == 2\n"; + matlabFileSS << "\t\t" << plotCommand2D << "( T" << i << "(:,1), T" << i << "(:,2) );\n"; + matlabFileSS << "end;\n"; + matlabFileSS << "if size(T" << i << ",2) == 3\n"; + matlabFileSS << "\t\t" << plotCommand3D << "( T" << i << "(:,1), T" << i << "(:,2), T" << i << "(:,3) );\n"; + matlabFileSS << "end;\n"; + } + } + + std::ofstream matlabFile; + matlabFile.open(file, std::ios::out); + matlabFile << matlabFileSS.str(); + matlabFile.flush(); + matlabFile.close(); + } +}; + +#endif /* TRAJECTORYWRITER_H_ */