我正在使用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);
这在大多数情况下是有效的,比如我拍摄100张照片,那么大约有70张是按照我指定的数值拍摄的,其余的30张会有不同的数值。
我尝试了什么。
我尝试了以下方法,当我捕获图像时,我检查onCaptureCompleted中的值,并创建一个队列,指示图像是否以正确的值被捕获。但是当我在imageReader中获取图像时,我不知道队列中的值是针对当前图像还是其他图像。这是因为我不知道imageReader的监听器何时会被调用。它可能在onCaptureCompleted完成后或之前被调用,或者在最坏的情况下,在onCaptureCompleted被调用2-3次后,因为我在循环中捕获图像。
基本上我需要一个标签来识别这种方式的图像,但我不知道如何做。
以下是同样的代码。
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);
所以我需要一种方法将信息传递给imageReader监听器,以表明当前图像是否符合我指定的设置。
希望得到任何帮助。