Code tutorial
authoredgarriba <edgar.riba@gmail.com>
Wed, 30 Jul 2014 10:57:18 +0000 (12:57 +0200)
committeredgarriba <edgar.riba@gmail.com>
Wed, 30 Jul 2014 10:57:18 +0000 (12:57 +0200)
samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/src/CsvReader.cpp [new file with mode: 0644]

diff --git a/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/src/CsvReader.cpp b/samples/cpp/tutorial_code/calib3d/real_time_pose_estimation/src/CsvReader.cpp
new file mode 100644 (file)
index 0000000..8061df6
--- /dev/null
@@ -0,0 +1,81 @@
+#include <boost/lexical_cast.hpp>
+#include "CsvReader.h"
+
+/** The default constructor of the CSV reader Class */
+CsvReader::CsvReader(const std::string &path, const char &separator){
+       _file.open(path.c_str(), ifstream::in);
+       _separator = separator;
+}
+
+/* Read a plane text file with .ply format */
+void CsvReader::readPLY(std::vector<cv::Point3f> &list_vertex, std::vector<std::vector<int> > &list_triangles)
+{
+std::string line, tmp_str, n;
+  int num_vertex, num_triangles;
+  int count = 0;
+  bool end_header = false;
+  bool end_vertex = false;
+
+  // Read the whole *.ply file
+  while (getline(_file, line)) {
+    stringstream liness(line);
+
+    // read header
+    if(!end_header)
+    {
+      getline(liness, tmp_str, _separator);
+      if( tmp_str == "element" )
+      {
+          getline(liness, tmp_str, _separator);
+          getline(liness, n);
+          if(tmp_str == "vertex") num_vertex = boost::lexical_cast< int >(n);
+          if(tmp_str == "face") num_triangles = boost::lexical_cast< int >(n);
+      }
+      if(tmp_str == "end_header") end_header = true;
+    }
+
+    // read file content
+    else if(end_header)
+    {
+      // read vertex and add into 'list_vertex'
+      if(!end_vertex && count < num_vertex)
+      {
+        string x, y, z;
+        getline(liness, x, _separator);
+        getline(liness, y, _separator);
+        getline(liness, z);
+
+        cv::Point3f tmp_p;
+        tmp_p.x = boost::lexical_cast< float >(x);
+        tmp_p.y = boost::lexical_cast< float >(y);
+        tmp_p.z = boost::lexical_cast< float >(z);
+        list_vertex.push_back(tmp_p);
+
+        count++;
+        if(count == num_vertex)
+        {
+          count = 0;
+          end_vertex = !end_vertex;
+        }
+      }
+      // read faces and add into 'list_triangles'
+      else if(end_vertex  && count < num_triangles)
+      {
+         std::string num_pts_per_face, id0, id1, id2;
+        getline(liness, num_pts_per_face, _separator);
+        getline(liness, id0, _separator);
+        getline(liness, id1, _separator);
+        getline(liness, id2);
+
+        std::vector<int> tmp_triangle(3);
+        tmp_triangle[0] = boost::lexical_cast< int >(id0);
+        tmp_triangle[1] = boost::lexical_cast< int >(id1);
+        tmp_triangle[2] = boost::lexical_cast< int >(id2);
+        list_triangles.push_back(tmp_triangle);
+
+        count++;
+      }
+    }
+  }
+}
+