Point Cloud Library (PCL) 1.12.0
Loading...
Searching...
No Matches
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
21namespace bf = boost::filesystem;
22
23namespace 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
131 {
132 patches_per_image_ = n;
133 }
134
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}
PointCloud represents the base class in PCL for storing collections of 3D points.
bool is_dense
True if no points are invalid (e.g., have NaN or Inf values in any of their floating point fields).
void resize(std::size_t count)
Resizes the container to contain count elements.
const PointT & at(int column, int row) const
Obtain the point given by the (column, row) coordinates.
std::uint32_t width
The point cloud width (if organized as an image-structure).
std::uint32_t height
The point cloud height (if organized as an image-structure).
shared_ptr< FaceDetectorDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > Ptr
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.
shared_ptr< const FaceDetectorDataProvider< FeatureType, DataSet, LabelType, ExampleIndex, NodeType > > ConstPtr
Defines functions, macros and traits for allocating and using memory.