【发布时间】:2020-02-28 13:57:10
【问题描述】:
所以我正在使用旧的 Camera API(据我所知)来获取 previewFrame 回调,然后运行我拥有的一些机器学习模型。我已经确认机器学习模型在我通过 onPictureTaken 回调拍照时解码位图时工作。现在在下面的示例中,我只是简单地在 ML Kit 的条形码扫描仪上进行测试,但我的自定义模型似乎也可以与 onPictureTaken 回调一起正常工作。
根据我收集到的信息,使用 onPreviewFrame 不一定是最好的方法,但为了获得快速的示例游戏(和学习经验),我决定走这条路。根据我从其他人那里尝试过的所有在线解决方案,我似乎无法让任何东西正常工作。下面的代码返回null:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// Log.d("onPreviewFrame bytes.length", String.valueOf(bytes.length));
// final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
// Log.d("onPreviewFrame bmp.getHeight()", String.valueOf(bmp.getHeight()));
Camera.Parameters parameters = camera.getParameters();
int width = parameters.getPreviewSize().width;
int height = parameters.getPreviewSize().height;
Log.d("onPreviewFrame - width", String.valueOf(width));
Log.d("onPreviewFrame - height", String.valueOf(height));
Log.d("onPreviewFrame - parameters.getPreviewFormat()", String.valueOf(parameters.getPreviewFormat()));
YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);
//
// byte[] bytes = out.toByteArray();
// final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
byte[] bytes = yuv.getYuvData();
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
extractBarcode(FirebaseVisionImage.fromBitmap(bitmap), bitmap);
}
这是我尝试过的其他方法:
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// Log.d("onPreviewFrame bytes.length", String.valueOf(bytes.length));
// final Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
// Log.d("onPreviewFrame bmp.getHeight()", String.valueOf(bmp.getHeight()));
Camera.Parameters parameters = camera.getParameters();
int width = parameters.getPreviewSize().width;
int height = parameters.getPreviewSize().height;
Log.d("onPreviewFrame - width", String.valueOf(width));
Log.d("onPreviewFrame - height", String.valueOf(height));
YuvImage yuv = new YuvImage(data, parameters.getPreviewFormat(), width, height, null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);
byte[] bytes = out.toByteArray();
final Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
extractBarcode(FirebaseVisionImage.fromBitmap(bitmap), bitmap);
}
不幸的是,我收到了这个错误:
ML Kit 检测到您似乎将相机帧作为位图对象传递给检测器。这是低效的。请使用 YUV_420_888 格式的 camera2 API 或 NV21 格式的 (legacy) camera API 并将字节数组直接传递给 ML Kit。
使用 parameters.getPreviewFormat() 返回 17,即 NV21。我也尝试简单地将其更改为 ImageFormat.YUV_420_888 但这导致以下非法参数异常:
目前仅支持 ImageFormat.NV21 和 ImageFormat.YUY2
【问题讨论】:
标签: java android android-camera