Point Cloud Library (PCL)  1.11.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(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 
126  {
127 
128  }
129 
130  void setPatchesPerImage(int n)
131  {
132  patches_per_image_ = n;
133  }
134 
135  void setMinImagesPerBin(int n)
136  {
137  min_images_per_bin_ = n;
138  }
139 
140  void setUseNormals(bool use)
141  {
142  USE_NORMALS_ = use;
143  }
144 
145  void setWSize(int size)
146  {
147  w_size_ = size;
148  }
149 
150  void setNumImages(int n)
151  {
152  num_images_ = n;
153  }
154 
155  void initialize(std::string & data_dir);
156 
157  //shuffle file and get the first num_images_ as requested by a tree
158  //extract positive and negative samples
159  //create training examples and labels
160  void getDatasetAndLabels(DataSet & data_set, std::vector<LabelType> & label_data, std::vector<ExampleIndex> & examples) override;
161  };
162  }
163 }
pcl
Definition: convolution.h:46
pcl::PointCloud::height
std::uint32_t height
The point cloud height (if organized as an image-structure).
Definition: point_cloud.h:393
pcl::DecisionTreeTrainerDataProvider::ConstPtr
shared_ptr< const DecisionTreeTrainerDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > ConstPtr
Definition: decision_tree_data_provider.h:67
pcl::face_detection::FaceDetectorDataProvider::setUseNormals
void setUseNormals(bool use)
Definition: face_detector_data_provider.h:140
pcl::face_detection::FaceDetectorDataProvider::setMinImagesPerBin
void setMinImagesPerBin(int n)
Definition: face_detector_data_provider.h:135
pcl::face_detection::FaceDetectorDataProvider
Definition: face_detector_data_provider.h:28
pcl::PointCloud< PointInT >
pcl::PointCloud::at
const PointT & at(int column, int row) const
Obtain the point given by the (column, row) coordinates.
Definition: point_cloud.h:261
pcl::PointCloud::width
std::uint32_t width
The point cloud width (if organized as an image-structure).
Definition: point_cloud.h:391
pcl::DecisionTreeTrainerDataProvider
Definition: decision_tree_data_provider.h:50
pcl::face_detection::FaceDetectorDataProvider::FaceDetectorDataProvider
FaceDetectorDataProvider()
Definition: face_detector_data_provider.h:116
pcl::face_detection::FaceDetectorDataProvider::setPatchesPerImage
void setPatchesPerImage(int n)
Definition: face_detector_data_provider.h:130
pcl::face_detection::FaceDetectorDataProvider::initialize
void initialize(std::string &data_dir)
pcl::PointCloud::is_dense
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:396
pcl::PointCloud::resize
void resize(std::size_t count)
Resizes the container to contain count elements.
Definition: point_cloud.h:455
pcl::face_detection::FaceDetectorDataProvider::setWSize
void setWSize(int size)
Definition: face_detector_data_provider.h:145
pcl::DecisionTreeTrainerDataProvider::Ptr
shared_ptr< DecisionTreeTrainerDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > Ptr
Definition: decision_tree_data_provider.h:62
pcl::face_detection::FaceDetectorDataProvider::~FaceDetectorDataProvider
virtual ~FaceDetectorDataProvider()
Definition: face_detector_data_provider.h:125
pcl::face_detection::FaceDetectorDataProvider::setNumImages
void setNumImages(int n)
Definition: face_detector_data_provider.h:150
pcl::face_detection::FaceDetectorDataProvider::getDatasetAndLabels
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.
memory.h
Defines functions, macros and traits for allocating and using memory.