как передать информацию захвата в считыватель изображений camera2 - PullRequest
6 голосов
/ 06 июля 2019

Я использую 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 раза для 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.

...