gt: 	IplImage BitmapToIplImage(Bitmap bmp, int width, int height) {
context: /*
   * Copyright (C) 2014 Siddhanathan Shanmugam <siddhanathan@gmail.com>, Paritosh Gupta <paritosh.gupta@yahoo.co.uk>
   *
   * This program is free software: you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation, either version 3 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program.  If not, see <http://www.gnu.org/licenses/>
   */
  
  package org.opencv.javacv.facerecognition;
  
  import static  com.googlecode.javacv.cpp.opencv_highgui.*;
  import static  com.googlecode.javacv.cpp.opencv_core.*;
  
  import static  com.googlecode.javacv.cpp.opencv_imgproc.*;
  import static com.googlecode.javacv.cpp.opencv_contrib.*;
  
  import java.io.File;
  import java.io.FileOutputStream;
  import java.io.FilenameFilter;
  import java.util.ArrayList;
  
  import org.opencv.android.Utils;
  import org.opencv.core.Mat;
  
  import com.googlecode.javacv.cpp.opencv_imgproc;
  import com.googlecode.javacv.cpp.opencv_contrib.FaceRecognizer;
  import com.googlecode.javacv.cpp.opencv_core.IplImage;
  import com.googlecode.javacv.cpp.opencv_core.MatVector;
  
  import android.graphics.Bitmap;
  import android.os.Environment;
  import android.util.Log;
  import android.widget.Toast;
  
  public  class PersonRecognizer {
  	
  	public final static int MAXIMG = 100;
  	FaceRecognizer faceRecognizer;
  	String mPath;
  	int count=0;
  	labels labelsFile;
  
  	 static  final int WIDTH= 128;
  	 static  final int HEIGHT= 128;;
  	 private int mProb=999;
  	
  	 
      PersonRecognizer(String path)
      {
        faceRecognizer =  com.googlecode.javacv.cpp.opencv_contrib.createLBPHFaceRecognizer(2,8,8,8,200);
        //  faceRecognizer = com.googlecode.javacv.cpp.opencv_contrib.createEigenFaceRecognizer();
    	 // path=Environment.getExternalStorageDirectory()+"/facerecog/faces/";
       mPath=path;
       labelsFile= new labels(mPath);
       
    
      }
      
      void changeRecognizer(int nRec)
      {
      	switch(nRec) {
      	case 0: faceRecognizer = com.googlecode.javacv.cpp.opencv_contrib.createLBPHFaceRecognizer(1,8,8,8,100);
      			break;
      	case 1: faceRecognizer = com.googlecode.javacv.cpp.opencv_contrib.createFisherFaceRecognizer();
      			break;
      	case 2: faceRecognizer = com.googlecode.javacv.cpp.opencv_contrib.createEigenFaceRecognizer();
      			break;
      	}
      	train();
      	
      }
      
  	void add(Mat m, String description) {
  		Bitmap bmp= Bitmap.createBitmap(m.width(), m.height(), Bitmap.Config.ARGB_8888);
  		 
  		Utils.matToBitmap(m,bmp);
  		bmp= Bitmap.createScaledBitmap(bmp, WIDTH, HEIGHT, false);
  		
  		FileOutputStream f;
  		try {
  			f = new FileOutputStream(mPath+description+"-"+count+".jpg",true);
  			count++;
  			bmp.compress(Bitmap.CompressFormat.JPEG, 100, f);
  			f.close();
  
  		} catch (Exception e) {
  			Log.e("error",e.getCause()+" "+e.getMessage());
  			e.printStackTrace();
  			
  		}
  	}
  	
  	public boolean train() {
  	 	
  		File root = new File(mPath);
  
          FilenameFilter pngFilter = new FilenameFilter() {
              public boolean accept(File dir, String name) {
                  return name.toLowerCase().endsWith(".jpg");
              
          };
          };
  
          File[] imageFiles = root.listFiles(pngFilter);
  
          MatVector images = new MatVector(imageFiles.length);
  
          int[] labels = new int[imageFiles.length];
  
          int counter = 0;
          int label;
  
          IplImage img=null;
          IplImage grayImg;
  
          int i1=mPath.length();
         
     
          for (File image : imageFiles) {
          	String p = image.getAbsolutePath();
              img = cvLoadImage(p);
              
              if (img==null)
              	Log.e("Error","Error cVLoadImage");
              Log.i("image",p);
              
              int i2=p.lastIndexOf("-");
              int i3=p.lastIndexOf(".");
              int icount=Integer.parseInt(p.substring(i2+1,i3)); 
              if (count<icount) count++;
              
              String description=p.substring(i1,i2);
              
              if (labelsFile.get(description)<0)
              	labelsFile.add(description, labelsFile.max()+1);
              
              label = labelsFile.get(description);
  
              grayImg = IplImage.create(img.width(), img.height(), IPL_DEPTH_8U, 1);
  
              cvCvtColor(img, grayImg, CV_BGR2GRAY);
  
              images.put(counter, grayImg);
  
              labels[counter] = label;
  
              counter++;
          }
          if (counter>0)
          	if (labelsFile.max()>1)
          		faceRecognizer.train(images, labels);
          labelsFile.Save();
  	return true;
  	}
  	
  	public boolean canPredict()
  	{
  		if (labelsFile.max()>1)
  			return true;
  		else
  			return false;
  		
  	}
  	
  	public String predict(Mat m) {
  		if (!canPredict())
  			return "";
  		int n[] = new int[1];
  		double p[] = new double[1];
  		IplImage ipl = MatToIplImage(m,WIDTH, HEIGHT);
  //		IplImage ipl = MatToIplImage(m,-1, -1);
  		
  		faceRecognizer.predict(ipl, n, p);
  		
  		if (n[0]!=-1)
  		 mProb=(int)p[0];
  		else
  			mProb=-1;
  	//	if ((n[0] != -1)&&(p[0]<95))
  		if (n[0] != -1)
  			return labelsFile.get(n[0]);
  		else
  			return "Unkown";
  	}
  
  
  	
  
  	  IplImage MatToIplImage(Mat m,int width,int heigth)
  	  {
  		 
  		  
  		   Bitmap bmp=Bitmap.createBitmap(m.width(), m.height(), Bitmap.Config.ARGB_8888);
  		  
  		   
  		   Utils.matToBitmap(m, bmp);
  		   return BitmapToIplImage(bmp,width, heigth);
  			
  	  }
  
  