我正在使用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完成之后或在它之前调用,或者在最坏的情况下,对于2-3个图像,像我一样,在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侦听器的方法,以指示当前图像是否符合我指定的设置。 任何帮助表示赞赏。
PS:我还尝试保存TotalCaptureResult's SENSOR_TIMESTAMP
和image.getTimestamp
并进行比较,但有时可以确定带有时间戳的图像的参数与从totalCaptureResult捕获的参数不同。