2012-03-14 27 views
1

私は最終年度に顔認識プロジェクトを行っています。私はローカルバイナリパターン(LBP)を使用してAndroidで顔認識を行う必要があります。ビットマップ(RGB_565)をグレースケール(8ビット)に変換する

JavaでLBPを使用して顔認識のコードをインターネットで検索しましたが、Androidで実装可能なものは見つかりませんでした。だから、私はすべてそれを書くことを余儀なくされており、私は画像処理だけでなく、アンドロイドの初心者の一種です。

カメラから画像をキャプチャする方法を見つけました。

public class CameraCapture extends Activity { 

protected boolean _taken = true; 
File sdImageMainDirectory; 

protected static final String PHOTO_TAKEN = "photo_taken"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 

    try { 

     super.onCreate(savedInstanceState);   
       File root = new File(Environment 
         .getExternalStorageDirectory() 
         + File.separator + "myDir" + File.separator); 
       root.mkdirs(); 
       sdImageMainDirectory = new File(root, "myPicName"); 


      startCameraActivity(); 
     } 
    catch (Exception e) { 
     finish(); 
     Toast.makeText(this, "Error occured. Please try again later.", 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

protected void startCameraActivity() { 

    Uri outputFileUri = Uri.fromFile(sdImageMainDirectory); 

    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 

    startActivityForResult(intent, 0); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (resultCode) { 
    case 0: 
     finish(); 
     break; 

    case -1: 

     try { 
      StoreImage(this, Uri.parse(data.toURI()), 
        sdImageMainDirectory); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     finish(); 
     startActivity(new Intent("com.piit.lbp.form.LBPFORMADD")); 

    } 

} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { 
     _taken = true; 
    } 
} 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); 
} 

    public static void StoreImage(Context mContext, Uri imageLoc, File imageDir) { 
    Bitmap bm = null; 

    try { 
     bm = Media.getBitmap(mContext.getContentResolver(), imageLoc); 
     bmGray = toGrayScale(bm); 
     FileOutputStream out = new FileOutputStream(imageDir); 
     bm.compress(Bitmap.CompressFormat.JPEG, 100, out); 
     bm.recycle(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

質問:「ビットマップbm」とは、RGB_565などとは何ですか?いくつのビットがありますか?私は次のコード

public static Bitmap toGrayscale(Bitmap bmpOriginal) 
{   
    int width, height; 
    height = bmpOriginal.getHeight(); 
    width = bmpOriginal.getWidth();  

    Bitmap bmpGrayscale = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
    Canvas c = new Canvas(bmpGrayscale); 
    Paint paint = new Paint(); 
    ColorMatrix cm = new ColorMatrix(); 
    cm.setSaturation(0); 
    ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); 
    paint.setColorFilter(f); 
    c.drawBitmap(bmpOriginal, 0, 0, paint); 
    return bmpGrayscale; 
} 

で階調法にRGBを呼び出します。そして、私はLBP演算子を適用するためのbmGrayを使用したいJPEG、ビットマップを圧縮する前に

。 質問:ColorMatrixを使用してグレースケールに変換すると、ピクセルあたり8ビットですか?

私はbmGrayをByte Arrayに変換したいので、一度に1バイトしか抽出しません。また、グレースケール画像を2次元のピクセル値行列に変換できるかどうかを知りたいのですが、すでにピクセル値の2次元行列であることがわかりますが、その上でピクセルを選択する方法現在のピクセル。 ??

答えて

1

CameraPictureため、これが適用されます。

setPreviewFormat(int型)が呼び出されない場合、デフォルトは YCbCr_420_SP(NV21)形式になります。私はこのような何かを発見したBMPデータにアクセスするための

Bitmap bmp = Bitmap.createBitmap(frameWidth, frameHeight, Bitmap.Config.ARGB_8888); //or RGB_565 if you prefer. 

http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewFormat%28int%29

ビットマップは、あなたは次のように設定することができ、BMP http://upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png

はそれが

+0

を役に立てば幸い情報をありがとうございました。 –

関連する問題