首页 > 解决方案 > 在android中使用Camera2进行实时处理应该采用什么图像格式?

问题描述

我正在开发一个处理 Camera2 预览帧并在纹理上显示处理帧的 android 应用程序。起初,我用 camera1 api 进行了测试,它可以很好地用于实时图像处理。

private class CameraPreviewCallback implements Camera.PreviewCallback {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
  processingRunnable.setNextFrame(data, camera);
}

}

然后,我更改了使用 camera2 api 的代码。为了获取预览帧,我将 ImageFormat 设置为 YUV_420_888

    mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 3);
            mImageReaderPreview.setOnImageAvailableListener(mOnPreviewAvailableListener, mBackgroundHandler);    

private final ImageReader.OnImageAvailableListener mOnPreviewAvailableListener = new ImageReader.OnImageAvailableListener() {
            @Override
            public void onImageAvailable(ImageReader reader) {
                Image mImage = reader.acquireLatestImage();
                if(mImage == null) {
                    return;
                }
           processingRunnable.setNextFrame(convertYUV420888ToNV21(mImage));
                mImage.close();
            }
        };

但是,它的工作速度比 camera1 慢。可能是因为从 YUV_420_888 到 NV21 的额外转换。由于 Camera1 可以直接从 Camera1 提供 NV21 帧。

标签: cameraandroid-cameraopencv3.0android-camera2

解决方案


转换可能很昂贵,具体取决于您如何实现它以及给定设备上 YUV_420_888 的布局是什么。

当然,如果它是用纯 Java 编写的,可能会很慢。

也就是说,如果您使用的设备处于 LEGACY 硬件级别,则 camera2 必须在传统模式下运行,接收 YUV 信息可能会很慢。对于这些设备,对于您的用例来说,停留在 API1 上可能更可取。


推荐阅读