如何在Android camera2中有效地将每个YUV_420_888帧转换为RGB(例如,使用renders中的yuv2rgb.rs)?

时间:2017-02-07 04:24:53

标签: java android android-camera2 android-renderscript

我正在使用Android camera2构建图像处理程序。由于每个捕获帧的图像格式是YUV_420_888,我需要将其有效地转换为RGB以进行图像处理。我用Google搜索并阅读了很多内容(特别是以下两个链接),最后发现renderscript可能是解决方案。但是,我不知道如何在我的代码中使用yuv2rgb脚本。

http://werner-dittmann.blogspot.jp/2016/03/using-android-renderscript-to-convert.html

Convert android.media.Image (YUV_420_888) to Bitmap

目前,我使用TextureView表面来显示预览,并使用ImageReader捕获onImageAvailable函数中的每个YUV_420_888帧。

   protected void createCameraPreview() {
    try {
        SurfaceTexture texture = textureView.getSurfaceTexture();
        assert texture != null;
        texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
        Surface surface = new Surface(texture);
        Surface mImageSurface = mImageReader.getSurface();
        captureRequestBuilder =    cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
        captureRequestBuilder.addTarget(surface)
        List surfaces = new ArrayList<>();
        surfaces.add(surface);
        surfaces.add(mImageSurface);
        captureRequestBuilder.addTarget(mImageSurface);
     cameraCaptureSessions.setRepeatingRequest(captureRequestBuilder.build(), null, mBackgroundHandler);

        cameraDevice.createCaptureSession(surfaces, new CameraCaptureSession.StateCallback(){
                    @Override
                    public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
                        //The camera is already closed
                        if (null == cameraDevice) {
                            return;
                        }
                        // When the session is ready, we start displaying the preview.
                        cameraCaptureSessions = cameraCaptureSession;
                        updatePreview();
                    }
                    @Override
                    public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
                        Toast.makeText(MainActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
                    }
                }, null);
        } catch (CameraAccessException e) {
             e.printStackTrace();
        }
}


  private final ImageReader.OnImageAvailableListener mOnImageAvailableListener  = new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image img = null;
        img = reader.acquireNextImage(); // we got YUV_420_888 frame here
        // transform to RGB format here?
        // image processing
    }
};

如何更新我的代码以实现目标(例如,使用yuv2rgb.rs)?感谢。

1 个答案:

答案 0 :(得分:2)

使用RenderScript进行图像处理的camera2示例应用程序HdrViewfinder可能有助于如何连接相机和RenderScript:https://github.com/googlesamples/android-HdrViewfinder

它不进行YUV-> RGB转换,IIRC,我认为yuv2rgb.rs可能用于与相机产生的不同YUV色彩空间(由于向后兼容性问题 - 它存在于camera2之前)。但是它可以帮助您编写自己的RS脚本以应用于摄像机数据。