如何在图像读取器camera2中传递捕获信息

Shi*_*yal 7 android iso android-camera2

我正在使用camera2 API通过手动曝光和ISO捕获图像。但是有时拍摄的图像的ISO和曝光值不同于我指定的值。

有什么方法可以将在捕获请求中设置的值的信息传递给图像读取器侦听器,在捕获图像时回调会出现,以查看图像是否实际上具有我指定的值。

我正在捕获许多具有不同ISO值和每张图像曝光值的图像(比如说一个循环)。

这是我捕获图像的代码:

imageReader = ImageReader.newInstance(imageWidth, imageHeight, ImageFormat.JPEG, 1);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
        @Override
        public void onImageAvailable(ImageReader imageReader) {
            /// How to check the image is taken with correct values
        }
    }, backgroundHandler);

captureRequest = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequest.addTarget(preview);
captureRequest.addTarget(imageReader.getSurface());
captureRequest.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
captureRequest.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
captureRequest.set(CaptureRequest.SENSOR_SENSITIVITY, <MANUAL_ISO>);
captureRequest.set(CaptureRequest.SENSOR_EXPOSURE_TIME, <MANUAL_EXPOSURE>);
mSession.capture(captureRequest.build(), null, backgroundHandler);
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都有效,例如,如果我要拍摄100张照片,则使用我指定的值拍摄大约70张照片,其余30张将具有不同的值。

我试过的

我尝试了以下方法,当我捕获图像时,我检查onCaptureCompleted中的值并创建一个队列,该队列指示图像是否使用正确的值拍摄。但是当我在imageReader中获取图像时,我不知道队列中的值是用于当前图像还是其他图像。发生这种情况是因为我不知道什么时候会为图像调用imageReader侦听器:它可以在onCaptureCompleted完成之后或在它之前调用,或者在最坏的情况下,对于2-3张图像,我会被2-3次调用onCaptureCompleted两次循环捕获图像。

基本上,我需要一个标签来标识这种方法中的图像,但是我不知道该怎么做。

这是相同的代码:

class CapturedPicture {
    static Queue<Boolean> iso = new LinkedList<>();
} 
mSession.capture(captureRequest.build(), new CameraCaptureSession.CaptureCallback() {
            @Override
            public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                super.onCaptureCompleted(session, request, result);
                int capturedISO = result.get(CaptureResult.SENSOR_SENSITIVITY);
                CapturedPicture.iso.add(<MANUAL_ISO> == capturedISO);
            }
        }, backgroundHandler);
Run Code Online (Sandbox Code Playgroud)

因此,我需要一种将信息传递给imageReader侦听器的方法,以指示当前图像是否符合我指定的设置。任何帮助表示赞赏。

PS:我也尝试过保存TotalCaptureResult's SENSOR_TIMESTAMPimage.getTimestamp比较它们,但有时可以确认带有时间戳的图像的参数与从totalCaptureResult捕获的参数不同。

小智 0

理想情况下,captureResult 数据应根据时间戳与相应的图像匹配。如果不是,请检查您的设备是否支持 postRawSensitivityBoost,您可能还需要考虑设置它。