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