3

我正在使用 Android camera2 构建图像处理程序。由于每帧捕获的图像格式为YUV_420_888,因此我需要将其高效地转换为RGB进行图像处理。我google了很多,看了很多(尤其是下面两个链接),最后发现renderscript可能是解决方案。但是,我不知道如何在我的代码中使用 yuv2rgb 脚本。

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

将 android.media.Image (YUV_420_888) 转换为位图

目前,我使用 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)?谢谢。

4

1 回答 1

4

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

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

于 2017-02-08T21:26:54.360 回答