Point Cloud Library (PCL)  1.12.1-dev
face_detector_data_provider.h
1 /*
2  * face_detector_data_provider.h
3  *
4  * Created on: Sep 2, 2012
5  * Author: aitor
6  */
7 
8 #pragma once
9 
10 #include <pcl/memory.h>
11 #include <pcl/ml/dt/decision_tree_data_provider.h>
12 #include <pcl/recognition/face_detection/face_common.h>
13 
14 #include <boost/algorithm/string.hpp>
15 #include <boost/filesystem/operations.hpp>
16 
17 #include <fstream>
18 #include <string>
19 
20 
21 namespace bf = boost::filesystem;
22 
23 namespace pcl
24 {
25  namespace face_detection
26  {
27  template<class FeatureType, class DataSet, class LabelType, class ExampleIndex, class NodeType>
28  class FaceDetectorDataProvider: public pcl::DecisionTreeTrainerDataProvider<FeatureType, DataSet, LabelType, ExampleIndex, NodeType>
29  {
30  private:
31  int num_images_;
32  std::vector<std::string> image_files_;
33  bool USE_NORMALS_;
34  int w_size_;
35  int patches_per_image_;
36  int min_images_per_bin_;
37 
38  void getFilesInDirectory(bf::path & dir, std::string & rel_path_so_far, std::vector<std::string> & relative_paths, std::string & ext)
39  {
40  for (const auto& dir_entry : bf::directory_iterator(dir))
41  {
42  //check if its a directory, then get models in it
43  if (bf::is_directory (dir_entry))
44  {
45  std::string so_far = rel_path_so_far + (dir_entry.path ().filename ()).string () + "/";
46  bf::path curr_path = dir_entry.path ();
47  getFilesInDirectory (curr_path, so_far, relative_paths, ext);
48  } else
49  {
50  //check that it is a ply file and then add, otherwise ignore..
51  std::vector < std::string > strs;
52  std::string file = (dir_entry.path ().filename ()).string ();
53  boost::split (strs, file, boost::is_any_of ("."));
54  std::string extension = strs[strs.size () - 1];
55 
56  if (extension == ext)
57  {
58  std::string path = rel_path_so_far + (dir_entry.path ().filename ()).string ();
59  relative_paths.push_back (path);
60  }
61  }
62  }
63  }
64 
65  inline bool readMatrixFromFile(const std::string& file, Eigen::Matrix4f & matrix)
66  {
67 
68  std::ifstream in;
69  in.open (file.c_str (), std::ifstream::in);
70  if (!in.is_open ())
71  {
72  return false;
73  }
74 
75  char linebuf[1024];
76  in.getline (linebuf, 1024);
77  std::string line (linebuf);
78  std::vector < std::string > strs_2;
79  boost::split (strs_2, line, boost::is_any_of (" "));
80 
81  for (int i = 0; i < 16; i++)
82  {
83  matrix (i / 4, i % 4) = static_cast<float> (atof (strs_2[i].c_str ()));
84  }
85 
86  return true;
87  }
88 
89  bool check_inside(int col, int row, int min_col, int max_col, int min_row, int max_row)
90  {
91  return col >= min_col && col <= max_col && row >= min_row && row <= max_row;
92  }
93 
94  template<class PointInT>
95  void cropCloud(int min_col, int max_col, int min_row, int max_row, pcl::PointCloud<PointInT> & cloud_in, pcl::PointCloud<PointInT> & cloud_out)
96  {
97  cloud_out.width = max_col - min_col + 1;
98  cloud_out.height = max_row - min_row + 1;
99  cloud_out.resize (cloud_out.width * cloud_out.height);
100  for (unsigned int u = 0; u < cloud_out.width; u++)
101  {
102  for (unsigned int v = 0; v < cloud_out.height; v++)
103  {
104  cloud_out.at (u, v) = cloud_in.at (min_col + u, min_row + v);
105  }
106  }
107 
108  cloud_out.is_dense = cloud_in.is_dense;
109  }
110 
111  public:
112 
113  using Ptr = shared_ptr<FaceDetectorDataProvider<FeatureType, DataSet, LabelType, ExampleIndex, NodeType>>;
114  using ConstPtr = shared_ptr<const FaceDetectorDataProvider<FeatureType, DataSet, LabelType, ExampleIndex, NodeType>>;
115 
117  {
118  w_size_ = 80;
119  USE_NORMALS_ = false;
120  num_images_ = 10;
121  patches_per_image_ = 20;
122  min_images_per_bin_ = -1;
123  }
124 
125  void setPatchesPerImage(int n)
126  {
127  patches_per_image_ = n;
128  }
129 
130  void setMinImagesPerBin(int n)
131  {
132  min_images_per_bin_ = n;
133  }
134 
135  void setUseNormals(bool use)
136  {
137  USE_NORMALS_ = use;
138  }
139 
140  void setWSize(int size)
141  {
142  w_size_ = size;
143  }
144 
145  void setNumImages(int n)
146  {
147  num_images_ = n;
148  }
149 
150  void initialize(std::string & data_dir);
151 
152  //shuffle file and get the first num_images_ as requested by a tree
153  //extract positive and negative samples
154  //create training examples and labels
155  void getDatasetAndLabels(DataSet & data_set, std::vector<LabelType> & label_data, std::vector<ExampleIndex> & examples) override;
156  };
157  }
158 }
shared_ptr< const DecisionTreeTrainerDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > ConstPtr
shared_ptr< DecisionTreeTrainerDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > Ptr
const PointT & at(int column, int row) const
Obtain the point given by the (column, row) coordinates.
Definition: point_cloud.h:262
bool is_dense
True if no points are invalid (e.g., have NaN or Inf values in any of their floating point fields).
Definition: point_cloud.h:403
void resize(std::size_t count)
Resizes the container to contain count elements.
Definition: point_cloud.h:462
std::uint32_t width
The point cloud width (if organized as an image-structure).
Definition: point_cloud.h:398
std::uint32_t height
The point cloud height (if organized as an image-structure).
Definition: point_cloud.h:400
void initialize(std::string &data_dir)
void getDatasetAndLabels(DataSet &data_set, std::vector< LabelType > &label_data, std::vector< ExampleIndex > &examples) override
Virtual function called to obtain training examples and labels before training a specific tree.
Defines functions, macros and traits for allocating and using memory.