将位图(RGB_565)转换为灰度(8位)Android
问题描述:
我正在为我的最后一年做脸部识别项目。我必须使用本地二进制模式(LBP)在Android上进行脸部识别。将位图(RGB_565)转换为灰度(8位)Android
我在网上搜索了很多在java中使用LBP进行人脸识别的代码,但在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();
}
}
问题:什么是“位图bm” - 像RGB_565或其他?和多少位。
之前压缩位图到jpeg我所说的RGB到灰度方法用下面的代码
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矩阵,但我该如何处理它...就像选择像素值上下的像素当前像素。 ??
答
的CameraPicture适用:
如果setPreviewFormat(INT)不会被调用,默认将是 YCbCr_420_SP(NV21)格式。 http://developer.android.com/reference/android/hardware/Camera.Parameters.html#setPreviewFormat%28int%29
的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
希望它有助于
谢谢你的信息。 – 2012-03-30 14:11:04