FirebaseVisionImageMetadata 的 ImageReader 格式兼容性(通过 Android 上的 Camera2 API)

ImageReader format compatibility for FirebaseVisionImageMetadata (via Camera2 API on Android)

我想使用 ImageReader 中的图像字节数组构造一个 FirebaseVisionImageMetadata 对象用于条形码扫描(作为支持帧预览的 ML Kit ). I'm using the Camera2 API and following this PR 的一部分。

Size sz = chooseOptimalSize();
mCallbackImageDataReader =
        ImageReader.newInstance(sz.getWidth(), sz.getHeight(), ImageFormat.YV12, 1);
    mCallbackImageDataReader.setOnImageAvailableListener(reader -> {
        byte[] data = getByteDataFromImageReader(reader);
        if (data != null) {
             //rotation compensation calculation not shown
            mCallback.onPreviewFrame(data, reader.getImageFormat(), reader.getWidth(), reader.getHeight(), rotationCompensation);
        }
    }, null);

@Nullable
private byte[] getByteDataFromImageReader(@NonNull ImageReader reader) {
    byte[] data = null;
    try (Image image = reader.acquireNextImage()) {
        Image.Plane[] planes = image.getPlanes();
        if (planes.length > 0) {
            ByteBuffer buffer = planes[0].getBuffer();
            data = new byte[buffer.remaining()];
            buffer.get(data);
        }
    }
    return data;
} 

但是,当我将生成的格式传递给 FirebaseVisionImageMetadata 构建器时,出现以下错误:

final FirebaseVisionImageMetadata meta = new FirebaseVisionImageMetadata.Builder()
        .setFormat(format) //exception thrown here
        .setWidth(width)
        .setHeight(height)
        .setRotation(rotation)
        .build();

java.lang.IllegalArgumentException
    at com.google.android.gms.common.internal.Preconditions.checkArgument(Unknown Source:5)
    at com.google.firebase.ml.vision.common.FirebaseVisionImageMetadata$Builder.setFormat(Unknown Source:13)

我传递给 ImageReader 的格式是 ImageReader.YV12,因为 FirebaseVisionImageMetadata 只接受 NV21YV12,但由于 ImageReader 不接受 NV21,我只剩下 YV12。当我使用这种格式时(如上所示),相机启动时出现黑屏。我也试过传入 ImageReader.YUV_420_888,但结果与 FirebaseVisionImageMetadata.

相同 IllegalArgumentException

我的猜测是我可能必须以不同的方式转换字节数组,或者转换为不同的格式 (?)。

如有任何帮助,我们将不胜感激。

来源:

  1. https://github.com/google/cameraview/pull/123/commits/f90580b1891c3edf91b4a254219d08b01110afce
  2. https://developer.android.com/reference/android/graphics/ImageFormat.html?hl=BG#YUV_420_888

我明白了。我需要使用 reader.acquireNextImage();

mCallbackImageDataReader.setOnImageAvailableListener(reader -> {
        try (Image image = reader.acquireNextImage())
        {
            if (image != null)
            {
                //compute rotationCompensation
                mCallback.onPreviewFrame(image, rotationCompensation);
            }
        }

    }, null);