从移动视觉的人脸跟踪摄像头获取Bitmap
Get Bitmap from Mobile vision's face tracking camera
我正在尝试从移动视觉的面部跟踪摄像头获取位图,但在尝试了大约 5 个小时后,我有点卡住了。
我。首先,结果:带有
的空白图像
Bitmap image = mSurfaceView.getDrawingCache().
我已经在此处为 SetDrawingCache 设置了 true:
public CameraSourcePreview(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mStartRequested = false;
mSurfaceAvailable = false;
mSurfaceView = new SurfaceView(context);
mSurfaceView.getHolder().addCallback(new SurfaceCallback());
//HERE
mSurfaceView.setDrawingCacheEnabled(true);
addView(mSurfaceView);
}
二.之后我尝试了:截取 Graphic OVerlay 的屏幕截图,并从相机拍摄一张照片,然后合并这 2 个位图 -> 结果:可怕。凡是要对的都是错的。
如果有人能提出任何解决方案(即使是建议也可以),我将不胜感激。
权.
经过 8 小时的尝试。我得到了这个解决方法。
首先,我在面部跟踪相机中获得了带有 X 和 Y 的叠加屏幕截图:
overlay = screenShot(mGraphicOverlay);
final float overlayX = mGraphicOverlay.getX();
final float overlayY = mGraphicOverlay.getY();
然后我用相机拍照。调整叠加层的大小以适合来自相机的图片。之后,我将这 2 个合并为 1 个位图。并将其发送回 main activity.
mCameraSource.takePicture(null, new CameraSource.PictureCallback(){
@Override
public void onPictureTaken(byte[] bytes) {
//Bitmap loadedImage = null;
loaded = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bitmap rotatedBitmap = null;
Matrix rotateMatrix = new Matrix();
rotateMatrix.postRotate(90);
rotatedBitmap = Bitmap.createBitmap(loaded, 0, 0,
loaded.getWidth(), loaded.getHeight(),
rotateMatrix, false);
overlay = resize(overlay,rotatedBitmap.getWidth(), rotatedBitmap.getHeight());
merged = MergeBitmap(rotatedBitmap, overlay, overlayX, overlayY);
Intent myIntentA1A2 = new Intent(context, MainActivity.class);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
merged.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
//imgDecodableString = BitMapToString(GlobalResource.glass);
myIntentA1A2.putExtra("Image", encoded);
context.startActivity(myIntentA1A2);
我正在尝试从移动视觉的面部跟踪摄像头获取位图,但在尝试了大约 5 个小时后,我有点卡住了。
我。首先,结果:带有
的空白图像Bitmap image = mSurfaceView.getDrawingCache().
我已经在此处为 SetDrawingCache 设置了 true:
public CameraSourcePreview(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
mStartRequested = false;
mSurfaceAvailable = false;
mSurfaceView = new SurfaceView(context);
mSurfaceView.getHolder().addCallback(new SurfaceCallback());
//HERE
mSurfaceView.setDrawingCacheEnabled(true);
addView(mSurfaceView);
}
二.之后我尝试了:截取 Graphic OVerlay 的屏幕截图,并从相机拍摄一张照片,然后合并这 2 个位图 -> 结果:可怕。凡是要对的都是错的。
如果有人能提出任何解决方案(即使是建议也可以),我将不胜感激。
权.
经过 8 小时的尝试。我得到了这个解决方法。
首先,我在面部跟踪相机中获得了带有 X 和 Y 的叠加屏幕截图:
overlay = screenShot(mGraphicOverlay);
final float overlayX = mGraphicOverlay.getX();
final float overlayY = mGraphicOverlay.getY();
然后我用相机拍照。调整叠加层的大小以适合来自相机的图片。之后,我将这 2 个合并为 1 个位图。并将其发送回 main activity.
mCameraSource.takePicture(null, new CameraSource.PictureCallback(){
@Override
public void onPictureTaken(byte[] bytes) {
//Bitmap loadedImage = null;
loaded = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
Bitmap rotatedBitmap = null;
Matrix rotateMatrix = new Matrix();
rotateMatrix.postRotate(90);
rotatedBitmap = Bitmap.createBitmap(loaded, 0, 0,
loaded.getWidth(), loaded.getHeight(),
rotateMatrix, false);
overlay = resize(overlay,rotatedBitmap.getWidth(), rotatedBitmap.getHeight());
merged = MergeBitmap(rotatedBitmap, overlay, overlayX, overlayY);
Intent myIntentA1A2 = new Intent(context, MainActivity.class);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
merged.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
//imgDecodableString = BitMapToString(GlobalResource.glass);
myIntentA1A2.putExtra("Image", encoded);
context.startActivity(myIntentA1A2);