/**
  * Performs hmm train for all training data set.<br>
  * First quantizes the feature vector against codebook, and then train baum-welch
  *
  * @return
  */
 public boolean trainHMM() {
   boolean operationSuccess = false;
   codebook = new Codebook();
   database.setMode(DBMode.TRAINDATA);
   Model[][] regModels = database.readAllDataofCurrentMode();
   String[] gestName = database.getRegisteredModelNames();
   int quantizedSeq[][];
   HiddenMarkov mkv = new HiddenMarkov(NUM_STATES, NUM_SYMBOLS);
   // for each gesture
   for (int i = 0; i < regModels.length; i++) {
     operationSuccess = false;
     // for each train sample of current gesture
     quantizedSeq = new int[regModels[i].length][];
     for (int j = 0; j < regModels[i].length; j++) {
       GestureFeature[] gf = getFeature((RawFeature) regModels[i][j]);
       Points[] pts = getPointsFromFeatureVector(gf);
       quantizedSeq[j] = codebook.quantize(pts);
     }
     mkv.setTrainSeq(quantizedSeq);
     mkv.train();
     mkv.save(gestName[i]);
     operationSuccess = true;
   }
   return operationSuccess;
 }
 public boolean saveCaptured(RawFeature rf, String gestName) {
   boolean operationSuccess = false;
   database.setMode(DBMode.TRAINDATA);
   database.saveModel(rf, gestName);
   operationSuccess = true;
   return operationSuccess;
 }
 /**
  * Generates codebook by clustering all features in training set raw data
  *
  * @return
  */
 public boolean generateCodeBook() {
   boolean operationSuccess = false;
   database.setMode(DBMode.TRAINDATA);
   Model[][] regModels = database.readAllDataofCurrentMode();
   int totalFrames = 0;
   allFeaturesList.clear();
   // extract single list of all features
   for (int i = 0; i < regModels.length; i++) {
     for (int j = 0; j < regModels[i].length; j++) {
       GestureFeature[] gf = getFeature((RawFeature) regModels[i][j]);
       for (int k = 0; k < gf.length; k++) {
         allFeaturesList.add(gf[k]);
         totalFrames++;
       }
     }
   } //
   // single array from list
   GestureFeature[] allFeaturesArr = new GestureFeature[totalFrames];
   allFeaturesArr = allFeaturesList.toArray(new GestureFeature[0]);
   // clustering is done automatically after callng constructor
   Codebook cbk = new Codebook(getPointsFromFeatureVector(allFeaturesArr));
   cbk.saveToFile();
   operationSuccess = true;
   return operationSuccess;
 }
 public String[] readTrainData1D() {
   database.setMode(DBMode.TRAINDATA);
   return (database.getRegisteredModelNames());
 }
 public String[] readRegGestureModels() {
   database.setMode(DBMode.HMM_MODEL);
   return (database.getRegisteredModelNames());
 }