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

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

Подсистема камеры работает исключительно с конвейером на основе 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 реализует стабилизацию видео, он должен скорректировать результирующую область обрезки, чтобы описать область, фактически включенную в вывод после применения стабилизации видео. Как правило, приложение, использующее камеру, должно иметь возможность определять поле зрения, которое оно получает, на основе области обрезки, размеров датчика изображения и фокусного расстояния объектива.

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

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

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

Область обрезки: (500, 375, 1000, 750) (соотношение сторон 4:3)
640 x 480 потоковое кадрирование: (500, 375, 1000, 750) (равно области кадрирования)
1280 x 720 потоковое кадрирование: (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)
1280 x 720 потоковое кадрирование: (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)
640x480 потоковое кадрирование: (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)
640 x 480 потоковое кадрирование: (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)
640 x 480 потоковое кадрирование: (250, 187, 1500, 1125) (почтовый ящик)
1280 x 720 потоковое кадрирование: (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 .