我正在使用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次,以获取2-3次图像,因为我是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
并进行比较,但有时我可以用某些时间戳确认图像没有与TotalCapturerSult捕获的参数相同的参数。
理想情况下,CaptureSult数据应与基于时间戳的相应图像匹配。如果不是这样,您是否可以检查您的设备是否支持PostrawSensitivityBoost,您可能还需要考虑设置此设置。