Выходные потоки, обрезка и масштабирование

Выходные потоки

Подсистема камеры работает исключительно на основе конвейера на основе ANativeWindow для всех разрешений и выходных форматов. Несколько потоков можно настроить одновременно для отправки одного кадра множеству целей, таких как графический процессор, видеокодер, RenderScript или буферы, видимые приложением (RAW Bayer, обработанные буферы YUV или буферы в кодировке JPEG).

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

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

Обрезка

Обрезка всего массива пикселей (для цифрового масштабирования и других случаев использования, когда желательно меньшее поле зрения) осуществляется через настройку ANDROID_SCALER_CROP_REGION. Это настройка для каждого запроса, и она может меняться для каждого запроса, что имеет решающее значение для реализации плавного цифрового масштабирования.

Область определяется как прямоугольник (x, y, ширина, высота), где (x, y) описывает верхний левый угол прямоугольника. Прямоугольник определяется в системе координат массива активных пикселей датчика, где (0,0) — верхний левый пиксель массива активных пикселей. Таким образом, ширина и высота не могут быть больше размеров, указанных в статическом информационном поле ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Минимально допустимая ширина и высота сообщается HAL через статическое информационное поле ANDROID_SCALER_MAX_DIGITAL_ZOOM, которое описывает максимальный поддерживаемый коэффициент масштабирования. Таким образом, минимальная ширина и высота области обрезки составляют:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

Если область обрезки должна соответствовать определенным требованиям (например, она должна начинаться с четных координат, а ее ширина/высота должна быть четной), HAL должен выполнить необходимое округление и записать окончательную область обрезки, используемую в выходных данных. метаданные результата. Аналогично, если HAL реализует стабилизацию видео, он должен настроить область обрезки результата, чтобы описать область, фактически включенную в выходные данные после применения стабилизации видео. В общем, приложение, использующее камеру, должно иметь возможность определять поле зрения, которое оно получает, на основе области обрезки, размеров датчика изображения и фокусного расстояния объектива.

Поскольку область обрезки применяется ко всем потокам, которые могут иметь другие соотношения сторон, чем область обрезки, точная область датчика, используемая для каждого потока, может быть меньше, чем область обрезки. В частности, каждый поток должен поддерживать квадратные пиксели и соотношение сторон путем минимальной дополнительной обрезки определенной области обрезки. Если соотношение сторон потока шире области обрезки, поток следует дополнительно обрезать по вертикали, а если соотношение сторон потока уже области обрезки, поток следует дополнительно обрезать по горизонтали.

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

Например, если определены два потока: поток 640x480 (соотношение сторон 4:3) и поток 1280x720 (соотношение сторон 16:9), ниже показаны ожидаемые области вывода для каждого потока для нескольких образцов областей обрезки на гипотетическом 3 Датчик MP (матрица 2000 x 1500 пикселей).

Область обрезки: (500, 375, 1000, 750) (соотношение сторон 4:3)
Обрезка потока 640 x 480: (500, 375, 1000, 750) (соответствует области обрезки)
Обрезание потока 1280x720: (500, 469, 1000, 562)

соотношение региона-43

Рис. 1. Соотношение сторон 4:3

Область обрезки: (500, 375, 1333, 750) (соотношение сторон 16:9)
Обрезание потока 640x480: (666, 375, 1000, 750)
Обрезание потока 1280x720: (500, 375, 1333, 750) (соответствует области обрезки)

соотношение региона-169

Рис. 2. Соотношение сторон 16:9

Область обрезки: (500, 375, 750, 750) (соотношение сторон 1:1)
Обрезка потока 640x480: (500, 469, 750, 562)
Обрезка потока 1280x720: (500, 543, 750, 414)

соотношение региона урожая 11

Рис. 3. Соотношение сторон 1:1

И последний пример: поток с квадратным соотношением сторон 1024x1024 вместо потока 480p:
Область обрезки: (500, 375, 1000, 750) (соотношение сторон 4:3)
Обрезка потока 1024x1024: (625, 375, 750, 750)
Обрезание потока 1280x720: (500, 469, 1000, 562)

регион обрезки-43-квадратное соотношение

Рис. 4. Соотношение сторон 4:3, квадрат

переработка

Дополнительная поддержка файлов необработанных изображений обеспечивается за счет поддержки повторной обработки данных RAW Bayer. Эта поддержка позволяет конвейеру камеры обрабатывать ранее захваченный буфер RAW и метаданные (весь кадр, который был записан ранее), чтобы создать новый обработанный результат YUV или JPEG.

Увеличить

На устройствах под управлением Android 11 или более поздней версии приложение может использовать масштабирование камеры (цифровое и оптическое) с помощью параметра ANDROID_CONTROL_ZOOM_RATIO .

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

Многокамерная система может содержать более одного объектива с разным фокусным расстоянием, и пользователь может использовать оптический зум, переключаясь между объективами. Использование ANDROID_CONTROL_ZOOM_RATIO дает преимущества в следующих сценариях:

  • Увеличение масштаба с широкоугольного объектива на телеобъектив: соотношение с плавающей запятой обеспечивает лучшую точность по сравнению с целочисленными значениями ANDROID_SCALER_CROP_REGION .
  • Уменьшение масштаба с широкоугольного объектива на сверхширокоугольный: ANDROID_CONTROL_ZOOM_RATIO поддерживает уменьшение масштаба (<1,0f), тогда как ANDROID_SCALER_CROP_REGION — нет.

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

Коэффициент масштабирования: 2,0; 1/4 исходного поля зрения
Область обрезки: (0, 0, 2000, 1500) (соотношение сторон 4:3)
Обрезка потока 640 x 480: (0, 0, 2000, 1500) (соответствует области обрезки)
Обрезание потока 1280x720: (0, 187, 2000, 1125)

коэффициент масштабирования-2-обрезка-43

Рис. 5. Масштаб 2.0, соотношение сторон 4:3.

Коэффициент масштабирования: 2,0; 1/4 исходного поля зрения
Область обрезки: (0, 187, 2000, 1125) (соотношение сторон 16:9)
Обрезка потока 640x480: (250, 187, 1500, 1125) (в столбце)
Обрезка потока 1280x720: (0, 187, 2000, 1125) (соответствует области обрезки)

коэффициент масштабирования-2-обрезка-169

Рис. 6. Масштаб 2.0, соотношение сторон 16:9.

Коэффициент масштабирования: 0,5; 4-кратное исходное поле зрения (переключение с широкоугольного объектива на сверхширокоугольный)
Область обрезки: (250, 0, 1500, 1500) (соотношение сторон 1:1)
Обрезка потока 640x480: (250, 187, 1500, 1125) (почтовый ящик)
Обрезка потока 1280x720: (250, 328, 1500, 844) (почтовый ящик)

изображения/коэффициент масштабирования-0,5-обрезка-11

Рис. 7. Масштаб 0,5, соотношение сторон 1:1.

Как видно из графиков выше, система координат области обрезки меняется на эффективное поле зрения после масштабирования и представляется прямоугольником со следующими размерами: ( 0 , 0 , activeArrayWith , activeArrayHeight ). То же самое относится к областям и лицам AE/AWB/AF. Это изменение системы координат не применяется к захвату RAW и связанным с ним метаданным, таким как intrinsicCalibration и lensShadingMap .

Используя тот же гипотетический пример, приведенный выше, и предполагая, что выходной поток № 1 (640x480) является потоком видоискателя, 2,0-кратное увеличение может быть достигнуто одним из двух способов:

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (по умолчанию), scaler.cropRegion = (500, 375, 1000, 750)

Чтобы приложение установило android.control.aeRegions как верхнюю левую четверть поля зрения видоискателя, установите для android.control.aeRegions значение (0, 0, 1000, 750) а для android.control.zoomRatio установите значение 2.0 . Альтернативно, приложение может установить для android.control.aeRegions эквивалентную область (500, 375, 1000, 750) для android.control.zoomRatio , равного 1.0 .