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

Java 如何在Android camera2中高效地将每个YUV_420_888帧转换为RGB(例如,使用renderscript yuv2rgb.rs)?,java,android,android-camera2,android-renderscript,Java,Android,Android Camera2,Android Renderscript,我正在使用Android camera2构建一个图像处理程序。由于每个捕获帧的图像格式都是YUV_420_888,因此我需要将其高效地转换为RGB进行图像处理。我在谷歌上搜索并阅读了很多内容(特别是下面的两个链接),最终发现renderscript可能是解决方案。但是,我不知道如何在代码中使用yuv2rgb脚本 目前,我使用TextureView曲面显示预览,并使用ImageReader在onImageAvailable函数中捕获每个YUV_420_888帧 protected voi

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

目前,我使用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
    }
};
protectedvoid createCameraPreview(){
试一试{
SurfaceTexture纹理=textureView.getSurfaceTexture();
断言纹理!=null;
setDefaultBufferSize(imageDimension.getWidth(),imageDimension.getHeight());
表面=新表面(纹理);
Surface mImageSurface=mImageReader.getSurface();
captureRequestBuilder=cameraDevice.createCaptureRequest(cameraDevice.TEMPLATE\u预览);
captureRequestBuilder.addTarget(曲面)
列表曲面=新的ArrayList();
表面。添加(表面);
表面。添加(mImageSurface);
captureRequestBuilder.addTarget(mImageSurface);
setRepeatingRequest(captureRequestBuilder.build(),null,mBackgroundHandler);
cameraDevice.createCaptureSession(曲面,新的CameraCaptureSession.StateCallback(){
@凌驾
未配置公共void(@NonNull CameraCaptureSession CameraCaptureSession){
//摄像机已经关上了
如果(null==cameraDevice){
返回;
}
//当会话准备就绪时,我们开始显示预览。
cameraCaptureSessions=cameraCaptureSession;
updatePreview();
}
@凌驾
已配置公用void onconfig(@NonNull CameraCaptureSession CameraCaptureSession){
Toast.makeText(MainActivity.this,“配置更改”,Toast.LENGTH_SHORT.show();
}
},空);
}捕获(CameraAccessE异常){
e、 printStackTrace();
}
}
私有最终ImageReader.OnImageAvailableListener mOnImageAvailableListener=新ImageReader.OnImageAvailableListener(){
@凌驾
公共图像可用(图像阅读器){
图像img=null;
img=reader.acquireNextImage();//我们在这里得到了YUV_420_888帧
//在这里转换为RGB格式?
//图像处理
}
};

如何更新代码以实现目标(例如,使用)?谢谢。

camera2示例应用程序HdrViewfinder使用RenderScript进行一些图像处理,它可能有助于连接相机和RenderScript:


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

谢谢。涡流我正在使用以下链接中的代码。我还在测试它。很快就会得到答案。