Revision 22 Gestures.h
| Gestures.h (revision 22) | ||
|---|---|---|
| 96 | 96 |
void trainWithSamples(vector<GestureSample> trainingSet, string gestureName) |
| 97 | 97 |
{
|
| 98 | 98 |
vector<vector<vector<double> > > trnsfTrain = transformSamples(trainingSet); |
| 99 |
//Use the first sample as the representative |
|
| 100 |
scale_filter filter = scale_filter(trnsfTrain[0][0]); |
|
| 101 |
//Ensure the training set is appropriately scaled |
|
| 102 |
vector<vector<vector<double> > > trnsfScaled = trnsfTrain; |
|
| 99 |
//Magical filter takes care of all preprocessing, and live processing of the incoming sample(s). |
|
| 100 |
multitouch_filter filter = multitouch_filter(trnsfTrain); |
|
| 101 |
|
|
| 102 |
//Ensure the training set is appropriately scaled for training the model. |
|
| 103 |
vector<vector<vector<double> > > filteredTraining = trnsfTrain; |
|
| 103 | 104 |
for(size_t i = 0; i < trnsfTrain.size(); i++) |
| 104 | 105 |
{
|
| 105 |
boost::copy(trnsfTrain[i] | boost::adaptors::transformed(filter),trnsfScaled[i].begin()); |
|
| 106 |
filter.reset_params_for(trnsfTrain[i]); |
|
| 107 |
boost::copy(trnsfTrain[i] | boost::adaptors::transformed(filter),filteredTraining[i].begin()); |
|
| 106 | 108 |
} |
| 107 |
cout << "Training With: " << trnsfScaled.size() << " samples" << endl; |
|
| 108 |
classifier.addGestureWithExamplesAndFilter(trnsfScaled, 11, filter); |
|
| 109 |
|
|
| 110 |
cout << "Training With: " << filteredTraining.size() << " samples" << endl; |
|
| 111 |
classifier.addGestureWithExamplesAndFilter(filteredTraining, 5, filter); |
|
| 109 | 112 |
gestureNameMap.insert(pair<int, string>(classifier.numGestures() - 1, gestureName)); |
| 110 |
cout << "Added: " << gestureName << " as gesture number: " << classifier.numGestures() - 1 << "\n"<<endl; |
|
| 113 |
cout << "\nAdded new gesture(" << classifier.numGestures() - 1 << "): " << gestureName << "\n"<<endl;
|
|
| 111 | 114 |
} |
| 112 | 115 |
|
| 113 | 116 |
string classify(GestureSample sample) |
| ... | ... | |
| 115 | 118 |
vector<vector<double> > transformed = sample.transform(); |
| 116 | 119 |
//printTransform(transformed); |
| 117 | 120 |
int classIndex = classifier.classify(transformed); |
| 118 |
if(classIndex >= 0 && ((unsigned int)classIndex) < gestureNameMap.size()) |
|
| 121 |
vector<long double> probs = classifier.probabilities(); |
|
| 122 |
|
|
| 123 |
bool allZero = true; |
|
| 124 |
for(unsigned int i = 0 ; i < probs.size(); i++) |
|
| 125 |
{
|
|
| 126 |
if(probs[i] > 0) |
|
| 127 |
allZero = false; |
|
| 128 |
cout << probs[i] << ", "; |
|
| 129 |
} |
|
| 130 |
cout << endl; |
|
| 131 |
|
|
| 132 |
if(!allZero && classIndex >= 0 && ((unsigned int)classIndex) < gestureNameMap.size()) |
|
| 119 | 133 |
return gestureNameMap[classIndex]; |
| 120 |
else //classIndex == -1 when sample doesn't match any filter-model pair |
|
| 134 |
else //classIndex == -1 || allZero probabilities when sample doesn't match any filter-model pair |
|
| 121 | 135 |
return "None"; |
| 122 | 136 |
} |
| 123 | 137 |
|
Also available in: Unified diff
