GestureRecognitionToolkit  Version: 0.2.5
The Gesture Recognition Toolkit (GRT) is a cross-platform, open-source, c++ machine learning library for real-time gesture recognition.
DoubleMovingAverageFilter.cpp
Go to the documentation of this file.
1 
30 #define GRT_DLL_EXPORTS
32 
33 GRT_BEGIN_NAMESPACE
34 
35 //Define the string that will be used to identify the object
36 const std::string DoubleMovingAverageFilter::id = "DoubleMovingAverageFilter";
37 std::string DoubleMovingAverageFilter::getId() { return DoubleMovingAverageFilter::id; }
38 
39 //Register the DoubleMovingAverageFilter module with the PreProcessing base class
41 
43 {
44  init(filterSize,numDimensions);
45 }
46 
48 {
49  *this = rhs;
50 }
51 
53 
54 }
55 
57  if(this!=&rhs){
58  this->filterSize = rhs.filterSize;
59  this->filter1 = rhs.filter1;
60  this->filter2 = rhs.filter2;
61 
62  //Copy the base variables
64  }
65  return *this;
66 }
67 
69 
70  if( preProcessing == NULL ) return false;
71 
72  if( this->getId() == preProcessing->getId() ){
73 
74  const DoubleMovingAverageFilter *ptr = dynamic_cast<const DoubleMovingAverageFilter*>(preProcessing);
75 
76  //Clone the classLabelTimeoutFilter values
77  this->filterSize = ptr->filterSize;
78  this->filter1 = ptr->filter1;
79  this->filter2 = ptr->filter2;
80 
81  //Clone the preprocessing base variables
82  return copyBaseVariables( preProcessing );
83  }
84 
85  errorLog << "deepCopyFrom(const PreProcessing *preProcessing) - PreProcessing Types Do Not Match!" << std::endl;
86 
87  return false;
88 }
89 
90 
92 
93  if( !initialized ){
94  errorLog << "process(const VectorFloat &inputVector) - The filter has not been initialized!" << std::endl;
95  return false;
96  }
97 
98  if( inputVector.size() != numInputDimensions ){
99  errorLog << "process(const VectorFloat &inputVector) - The size of the inputVector (" << inputVector.getSize() << ") does not match that of the filter (" << numInputDimensions << ")!" << std::endl;
100  return false;
101  }
102 
103  processedData = filter( inputVector );
104 
105  if( processedData.size() == numOutputDimensions ) return true;
106  return false;
107 }
108 
110  if( initialized ) return init(filterSize,numInputDimensions);
111  return false;
112 }
113 
114 bool DoubleMovingAverageFilter::save(std::fstream &file) const{
115 
116  if( !file.is_open() ){
117  errorLog << "save(std::fstream &file) - The file is not open!" << std::endl;
118  return false;
119  }
120 
121  file << "GRT_DOUBLE_MOVING_AVERAGE_FILTER_FILE_V1.0" << std::endl;
122 
123  file << "NumInputDimensions: " << numInputDimensions << std::endl;
124  file << "NumOutputDimensions: " << numOutputDimensions << std::endl;
125  file << "FilterSize: " << filterSize << std::endl;
126 
127  return true;
128 }
129 
130 bool DoubleMovingAverageFilter::load( std::fstream &file ){
131 
132  if( !file.is_open() ){
133  errorLog << "load(std::fstream &file) - The file is not open!" << std::endl;
134  return false;
135  }
136 
137  std::string word;
138 
139  //Load the header
140  file >> word;
141 
142  if( word != "GRT_DOUBLE_MOVING_AVERAGE_FILTER_FILE_V1.0" ){
143  errorLog << "load(std::fstream &file) - Invalid file format!" << std::endl;
144  return false;
145  }
146 
147  //Load the number of input dimensions
148  file >> word;
149  if( word != "NumInputDimensions:" ){
150  errorLog << "load(std::fstream &file) - Failed to read NumInputDimensions header!" << std::endl;
151  return false;
152  }
153  file >> numInputDimensions;
154 
155  //Load the number of output dimensions
156  file >> word;
157  if( word != "NumOutputDimensions:" ){
158  errorLog << "load(std::fstream &file) - Failed to read NumOutputDimensions header!" << std::endl;
159  return false;
160  }
161  file >> numOutputDimensions;
162 
163  //Load the filter size
164  file >> word;
165  if( word != "FilterSize:" ){
166  errorLog << "load(std::fstream &file) - Failed to read FilterSize header!" << std::endl;
167  return false;
168  }
169  file >> filterSize;
170 
171  //Init the filter module to ensure everything is initialized correctly
172  return init(filterSize,numInputDimensions);
173 }
174 
175 bool DoubleMovingAverageFilter::init(const UINT filterSize,const UINT numDimensions){
176 
177  //Cleanup the old memory
178  initialized = false;
179 
180  if( filterSize == 0 ){
181  errorLog << "init(UINT filterSize,UINT numDimensions) - Filter size can not be zero!" << std::endl;
182  return false;
183  }
184 
185  if( numDimensions == 0 ){
186  errorLog << "init(UINT filterSize,UINT numDimensions) - The number of dimensions must be greater than zero!" << std::endl;
187  return false;
188  }
189 
190  //Resize the filter
191  this->filterSize = filterSize;
192  numInputDimensions = numDimensions;
193  numOutputDimensions = numDimensions;
194  processedData.clear();
195  processedData.resize(numDimensions,0 );
196 
197  if( !filter1.init(filterSize, numDimensions) ){
198  errorLog << "init(UINT filterSize,UINT numDimensions) - Failed to initialize filter 1!" << std::endl;
199  return false;
200  }
201 
202  if( !filter2.init(filterSize, numDimensions) ){
203  errorLog << "init(UINT filterSize,UINT numDimensions) - Failed to initialize filter 1!" << std::endl;
204  return false;
205  }
206 
207  //Flag that the filter has been initialized
208  initialized = true;
209 
210  return true;
211 }
212 
214 
215  //If the filter has not been initialised then return 0, otherwise filter x and return y
216  if( !initialized ){
217  errorLog << "filter(const Float x) - The filter has not been initialized!" << std::endl;
218  return 0;
219  }
220 
221  VectorFloat y = filter(VectorFloat(1,x));
222 
223  if( y.getSize() == 0 ) return 0;
224  return y[0];
225 }
226 
228 
229  //If the filter has not been initialised then return 0, otherwise filter x and return y
230  if( !initialized ){
231  errorLog << "filter(const VectorFloat &x) - The filter has not been initialized!" << std::endl;
232  return VectorFloat();
233  }
234 
235  if( x.getSize() != numInputDimensions ){
236  errorLog << "filter(const VectorFloat &x) - The size of the input vector (" << x.getSize() << ") does not match that of the number of dimensions of the filter (" << numInputDimensions << ")!" << std::endl;
237  return VectorFloat();
238  }
239 
240  //Perform the first filter
241  VectorFloat y = filter1.filter( x );
242 
243  if( y.size() == 0 ) return y;
244 
245  //Perform the second filter
246  VectorFloat yy = filter2.filter( y );
247 
248  if( yy.size() == 0 ) return y;
249 
250  //Account for the filter lag
251  const UINT N = y.getSize();
252  for(UINT i=0; i<N; i++){
253  yy[i] = y[i] + (y[i] - yy[i]);
254  processedData[i] = yy[i];
255  }
256 
257  return yy;
258 }
259 
261 
262 GRT_END_NAMESPACE
std::string getId() const
Definition: GRTBase.cpp:85
MovingAverageFilter filter2
The second moving average filter.
DoubleMovingAverageFilter & operator=(const DoubleMovingAverageFilter &rhs)
virtual bool resize(const unsigned int size)
Definition: Vector.h:133
DoubleMovingAverageFilter(const UINT filterSize=5, const UINT numDimensions=1)
UINT getSize() const
Definition: Vector.h:201
bool init(const UINT filterSize, const UINT numDimensions)
UINT filterSize
The size of the filter.
virtual bool save(std::fstream &file) const
Float filter(const Float x)
virtual bool load(std::fstream &file)
bool copyBaseVariables(const PreProcessing *preProcessingModule)
MovingAverageFilter filter1
The first moving average filter.
virtual bool deepCopyFrom(const PreProcessing *preProcessing)
The class implements a Float moving average filter.
virtual bool process(const VectorFloat &inputVector)