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

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

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

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

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

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

Кадрирование

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

Регион определяется как прямоугольник (x, y, width, height), где (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 реализует стабилизацию видео, он должен скорректировать область кадрирования результата, чтобы описать область, фактически включенную в выходные данные после применения стабилизации видео. Как правило, приложение, использующее камеру, должно уметь определять поле зрения на основе области кадрирования, размеров датчика изображения и фокусного расстояния объектива.

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

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

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

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

crop-region-43-ratio

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

Область кадрирования: (500, 375, 1333, 750) (соотношение сторон 16:9)
Кадрирование потока 640 x 480: (666, 375, 1000, 750)
Кадрирование потока 1280 x 720: (500, 375, 1333, 750) (совпадает с областью кадрирования)

crop-region-169-ratio

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

Область кадрирования: (500, 375, 750, 750) (соотношение сторон 1:1)
Кадрирование потока 640 x 480: (500, 469, 750, 562)
Кадрирование потока 1280 x 720: (500, 543, 750, 414)

crop-region-11-ratio

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

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

crop-region-43-square-ratio

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

Повторная обработка

Дополнительная поддержка необработанных графических файлов обеспечивается за счет поддержки повторной обработки необработанных данных 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) (совпадает с областью кадрирования)
Кадрирование потока 1280 x 720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

Рисунок 5. 2-кратный зум, соотношение сторон 4:3

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

zoom-ratio-2-crop-169

Рисунок 6. 2-кратный зум, соотношение сторон 16:9

Коэффициент масштабирования: 0,5; в 4 раза больше исходной зоны обзора (переключение с широкоугольного объектива на сверхширокоугольный объектив).
Область кадрирования: (250, 0, 1500, 1500) (соотношение сторон 1:1).
Кадрирование потока 640 x 480: (250, 187, 1500, 1125) (с леттербоксингом).
Кадрирование потока 1280 x 720: (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) является потоком видоискателя, двукратное увеличение может быть достигнуто одним из двух способов:

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