Преобразование растрового изображения (RGB_565) в оттенки серого (8 бит) для Android

1

Я делаю проект Face Recognition для моего последнего года. Мне нужно сделать Face Recognition на Android с помощью Local Binary Pattern (LBP).

Я много искал в Интернете коды для распознавания лиц с использованием LBP в java, но не смог найти ничего, что можно было бы реализовать на Android. Итак, теперь я вынужден писать все это, и я своего рода новичок в 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();
    }

}

Вопрос: Что такое "Bitmap bm" - как RGB_565 или что-то еще? и сколько бит.

Перед сжатием растрового изображения в jpeg я вызываю метод RGB в Grayscale со следующим кодом

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;
}

И затем я хочу использовать bmGray для применения LBP-оператора. Вопрос: Когда вы конвертируете в оттенки серого с помощью ColorMatrix, это 8 бит на пиксель?

Потому что я хочу преобразовать bmGray в Byte Array и хочу извлекать только 1 байт за раз. Кроме того, я хочу знать, может ли преобразовать изображение в оттенках серого в матрицу значений 2d, я знаю, что это уже 2d матрица значений пикселей, но как я могу работать над ней. Например, выбирая пиксель выше и ниже текущий пиксель. ??

Теги:
image-processing
bitmap
grayscale
android-camera

1 ответ

1
Лучший ответ

для CameraPicture это применимо:

Если setPreviewFormat (int) никогда не вызывается, по умолчанию будет формат YCbCr_420_SP (NV21). http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewFormat%28int%29

Bitmap bmp вы можете настроить как:

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

для доступа к данным bmp я нашел что-то вроде этого: http://upload.wikimedia.org/wikipedia/commons/c/c4/BMPfileFormat.png

Надеюсь, поможет

  • 0
    Спасибо Вам за информацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню