Android camera2 в изображение с неровным буфером кадра? - PullRequest
0 голосов
/ 29 мая 2020

Почему при рендеринге кадра камеры с помощью OpenGL (а затем его сохранении) создаются неровные изображения по сравнению с сохранением кадра камеры с помощью ImageReader (OpenGL - Ч / Б, ImageReader - Цвет)? Оба используют одинаковые размеры.

enter image description here

Предпосылки / подробности этого вопроса:

Я создание неблокирующей версии ImageReader с использованием Camera2 и GLES (до GLES31) с целью извлечения кадров неподвижных камер высокого разрешения без прерывания предварительного просмотра.

Установка использует TextureView для предварительного просмотра и GLSurfaceView для захвата кадров вне экрана. GLSurfaceView имеет простой рендерер и шейдер, который переносит aws GL_TEXTURE_EXTERNAL_OES в фреймбуфер, из которого могут быть извлечены необработанные данные изображения.

На моем тестовом устройстве размеры настроены следующим образом: Размер сенсора камеры равен 3264x2448 (получено через CameraCharacteristics)

GLSurfaceView имеет defaultBufferSize 3264x2448 и макет 3264x2448. Формат также установлен на JPEG с помощью getHolder (). SetFormat (ImageFormat.JPEG), а качество JPEG равно 100

Framebuffer установлен на 3264x2448

Это должно, на мой взгляд, привести к 1-к -1 передача кадра камеры, но очевидно, что это не так.

Я пробовал несколько других измерений, таких как соответствие размера экрана, выбор соответствующих размеров из StreamConfigurationMap, нестандартные размеры, все приводит к неровному выводу. Это как если бы в фоновом режиме всегда происходило повышение или понижение дискретизации (GL_TEXTURE_EXTERNAL_OES на самом деле поступает в разных размерах?). недель на данный момент.

1 Ответ

1 голос
/ 30 мая 2020

Используете ли вы матрицу преобразования, доступную в SurfaceTexture, для преобразования ввода текстуры в GL? Из-за некоторых сложностей в некоторых путях рендеринга преобразование по умолчанию сжимает границы изображения на 1 пиксель:

https://cs.android.com/android/platform/superproject/+/master: frameworks / base / libs / hwui / surfacetexture / SurfaceTexture.cpp; l = 312

Итак, если вы используете это, вы можете попробовать написать свое собственное преобразование, чтобы избежать этого сжатия, поскольку оно вам не нужно.

Помимо этого установка формата в GLSurfaceView здесь не влияет; рендеринг GL все равно отменяет все это.

(Обратите внимание, на некоторых устройствах максимальное разрешение сенсора может превышать максимальный размер текстуры, поддерживаемый GLES, поэтому будьте осторожны).

...