需要形容
深度学习模型在 Android 挪动端部署的时候,对于采集到的的摄像头画面须要放弃宽高比的将 Bitmap 缩放到模型输出的大小,缩放后较指标尺寸像素缺失的局部采纳灰度填充形式, 以避免指标产生显著形变影响辨认成果。在本例中,深度模型是以 MobileNetV2 为 Backbone 网络的 YOLOv3,并基于 MNN 挪动端推理框架部署。其中模型输出图像的尺寸大小为 (320,320)。
实现
public static Bitmap scaleImage(Bitmap bm, int newWidth, int newHeight)
{if (bm == null) {return null;}
int width = bm.getWidth();
int height = bm.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 放弃宽高比缩放,以长边为主
float scaleRatio = Math.min(scaleHeight, scaleWidth);
Matrix matrix = new Matrix();
matrix.postScale(scaleRatio, scaleRatio);
Bitmap newBm = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);
// 创立指标大小 Bitmap
Bitmap scaledImage = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(scaledImage);
// 绘制背景色彩
Paint paint = new Paint();
paint.setColor(Color.GRAY);
paint.setStyle(Paint.Style.FILL);
canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
// 确定画面地位
float left = 0;
float top = 0;
if (width > height){top = (float)((newBm.getWidth() - newBm.getHeight()) / 2.0);
}
else{left = (float)((newBm.getHeight() - newBm.getWidth()) / 2.0);
}
canvas.drawBitmap(newBm, left , top, null);
if (!bm.isRecycled()){bm.recycle();
}
return scaledImage;
}
成果
摄像头捕捉到的原始画面 Bitmap:
放弃宽高比缩放后的画面 Bitmap: