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

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

Подсистема камеры работает исключительно на основе конвейера 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-мегапиксельном сенсоре (матрица 2000 x 1500 пикселей).

Площадь посева: (500, 375, 1000, 750) (соотношение сторон 4:3)
Площадь ручья 640x480: (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)

crop-region-43-square-ratio

Рисунок 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)
Площадь ручья 640x480: (0, 0, 2000, 1500) (равно площади посева)
Кадрирование ручья размером 1280x720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-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) (равно площади посева)

zoom-ratio-2-crop-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) (с черными полосами сверху и снизу)

images/zoom-ratio-0.5-crop-11

Рисунок 7. Увеличение 0,5, соотношение сторон 1:1.

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

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

  • 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 .