在Android中使用Camera2进行实时处理应使用什么图像格式?

问题描述 投票:3回答:1

我正在开发一个Android应用程序,它处理Camera2预览帧并在纹理上显示处理过的帧。起初,我使用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帧。

camera android-camera opencv3.0 android-camera2
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.