Android camera2 сравнивает временную метку изображения с CaptureResult SENSOR_TIMESTAMP - PullRequest
1 голос
/ 10 июля 2019

Я использую Camera2 API для захвата изображений в цикле. Когда я снимаю изображение, я получаю обратный вызов в методе onCaptureCompleted и там использую TotalCaptureResult для получения информации об изображении, такой как iso, экспозиция и метка времени. Затем я храню эту информацию на карте.

После этого я получаю изображение в OnImageAvailableListener ImageReader и использую метод getTimestamp изображения и ExifInterface для получения exif-данных, таких как ISO и выдержка.

Удивительно, но значения изо и экспозиции различаются для изображения и результата захвата в одно и то же время.

Это нормально?

Ссылочный код:

mSession.capture(captureRequest.build(), new CameraCaptureSession.CaptureCallback() {
            @Override
            public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
                int capturedISO = result.get(CaptureResult.SENSOR_SENSITIVITY);
                long timeStamp = result.get(CaptureResult.SENSOR_TIMESTAMP);
/// Save somewhere to be used later
                super.onCaptureCompleted(session, request, result);
            }
        }, backgroundHandler);

И в OnImageAvailableListener

public void onImageAvailable(ImageReader imageReader) {
    if (!isRecording) {
        return;
    }
    Image image = imageReader.acquireLatestImage();
    Long timestamp = image.getTimestamp();

    ByteBuffer buffer = image.getPlanes()[0].getBuffer();
    byte[] bytes = new byte[buffer.capacity()];
    buffer.get(bytes);

    OutputStream outputStream = null;
    try {
        outputStream = new FileOutputStream(file);
        outputStream.write(bytes);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    image.close();
try {
        ExifInterface exifInterface = new ExifInterface(file.getAbsolutePath());
        double value = exifInterface.getAttributeDouble(ExifInterface.TAG_ISO_SPEED_RATINGS, 0);

/// Compare the iso with the CaptureCallback's saved one for this timestamp. I got different values.
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Ответы [ 2 ]

0 голосов
/ 27 июля 2019

Предполагая, что устройство поддерживает функцию READ_SENSOR_SETTINGS, это будет ошибка для конкретного устройства, а не правильная. Если устройство не поддерживает эту возможность, то значения TotalCaptureResult, вероятно, вообще не верны, даже если они присутствуют.

К сожалению, в настоящее время нет теста на соответствие для проверки соответствия этой конкретной комбинации значений метаданных для захвата.

0 голосов
/ 19 июля 2019

Вам необходимо изменить значения поля BLACK_LEVEL_LOCK.

Независимо от того, зафиксирована ли компенсация уровня черного на ее текущих значениях или может свободно изменяться.

Если установлено значение true(ON), значения, используемые для компенсации уровня черного, не изменятся, пока не будет заблокированаустановлено на false (OFF).

Поскольку для изменения определенных параметров захвата (например, времени экспозиции) может потребоваться сброс компенсации уровня черного, устройство камеры должно сообщить, была ли успешной установка блокировки уровня черного в выходном результатеметаданные.

Устройство камеры будет поддерживать блокировку в максимально возможной степени, переопределяя блокировку на OFF, только если изменения других параметров запроса требуют пересчета или сброса уровня черного.

...