Ausgabestreams, Zuschneiden und Zoomen

Ausgabestreams

Das Kamerasubsystem wird ausschließlich in der ANativeWindow-basierten Pipeline ausgeführt. alle Auflösungen und Ausgabeformate. Mehrere Streams können hier konfiguriert werden: einen Frame einmal an viele Ziele wie die GPU, das Video Encoder, RenderScript oder App-sichtbare Puffer (RAW Bayer, verarbeitete YUV) Puffer oder JPEG-codierte Puffer).

Zur Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden. darf nur eine begrenzte Anzahl gleichzeitig vorhanden sein. Dies ermöglicht eine Vorabzuweisung von und die Konfiguration der Kamerahardware. mit mehreren oder unterschiedlichen aufgeführten Ausgabepipelines gesendet werden, Verzögerungen oder Latenz bei der Ausführung der Anfrage.

Weitere Informationen zu den Kombinationen der garantierten Streamausgabe die von der unterstützten Hardwareebene abhängen, finden Sie unter createCaptureSession()

Zuschneiden

Zuschneiden des gesamten Pixelarrays (für den digitalen Zoom und andere Anwendungsfälle, in denen ein kleineres Sichtfeld wünschenswert ist) wird über die ANDROID_SCALER_CROP_REGION Einstellung. Diese Einstellung wird für jede Anfrage einzeln festgelegt. was für die Implementierung des flüssigen digitalen Zooms wichtig ist.

Der Bereich ist als Rechteck (x, y, Breite, Höhe) mit (x, y) definiert. das die obere linke Ecke des Rechtecks darstellt. Das Rechteck wird auf der Koordinatensystem des aktiven Pixelarrays des Sensors, wobei (0,0) für Pixel oben links im aktiven Pixelarray. Daher können Breite und Höhe nicht größer als die im ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY gemeldeten Abmessungen sind. statisches Infofenster. Die minimal zulässige Breite und Höhe werden vom HAL gemeldet über das statische Infofeld ANDROID_SCALER_MAX_DIGITAL_ZOOM, in dem den maximal unterstützten Zoomfaktor. Daher sind die minimale Breite des Zuschneidebereichs und Höhe:

  {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) }

Wenn das Anbaugebiet bestimmte Anforderungen erfüllen muss (z. B. mit geraden Koordinaten beginnen und die Breite/Höhe gleich sein muss), zeigt der HAL muss die erforderliche Rundung vorgenommen und der endgültige Zuschnittbereich angegeben werden, der im Metadaten der Ausgabeergebnisse. Wenn der HAL eine Videostabilisierung implementiert, muss der für das Ergebnis erfasste Ausschnitt so angepasst werden, dass er die Region beschreibt, die tatsächlich in die Ausgabe nach Anwendung der Videostabilisierung. Im Allgemeinen muss die App in der Lage sein, das empfangene Sichtfeld basierend auf den Zuschnittbereich, die Abmessungen des Bildsensors und die Brennweite des Objektivs.

Da der Zuschneidebereich für alle Streams gilt und unterschiedliche Aspekte haben kann, als der Beschnittbereich ist, kann der exakte Sensorbereich, der für jeden Stream verwendet wird, kleiner als der Zuschneidebereich ist. Insbesondere sollte jeder Stream quadratisch Pixel und sein Seitenverhältnis durch minimalen weiteren Zuschneiden des jeweiligen Ausschnitts. Region Ist das Seitenverhältnis des Streams größer als der Zuschnitt, wird der Stream sollte weiter vertikal zugeschnitten sein und das Seitenverhältnis des Streams schmaler als der Erntebereich, sollte der Fluss weiter zugeschnitten werden. horizontal.

In allen Fällen muss der Zuschnitt im Stream innerhalb des gesamten Zuschnittbereichs zentriert sein. wird jeder Stream relativ zum vollen Stream entweder horizontal oder vertikal zugeschnitten. und niemals beides zusammen.

Sind beispielsweise zwei Streams definiert, ein Stream von 640 x 480 (Seitenverhältnis 4:3) und ein Stream im Format 1280 x 720 (Seitenverhältnis 16:9), unten zeigt die erwarteten Ausgaberegionen für jeden Stream für einige Beispiel-Anbaugebiete bei hypothetischen 3 MP (2000 x 1500 Pixel Array).

Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Streamzuschnitt 640 x 480: (500, 375, 1.000, 750) (entspricht Zuschneidebereich)
Streamzuschnitt 1280 x 720: (500, 469, 1000, 562)

Anbauregion-43-Verhältnis

Abbildung 1: Bildverhältnis 4:3

Zuschneidebereich: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
Streamzuschnitt 640 x 480: (666, 375, 1.000, 750)
Streamzuschnitt 1280 x 720: (500, 375, 1333, 750) (entspricht Zuschneidebereich)

Verhältnis-zu-169-Ertrag

Abbildung 2: Seitenverhältnis von 16:9

Zuschneidebereich: (500, 375, 750, 750) (Seitenverhältnis 1:1)
Streamzuschnitt 640 x 480: (500, 469, 750, 562)
Streamzuschnitt 1280 x 720: (500, 543, 750, 414)

11-ern-angenehmer-anteil

Abbildung 3: Seitenverhältnis: 1:1

Ein letztes Beispiel ist ein Stream mit einem quadratischen Seitenverhältnis von 1024 x 1024 anstelle von 480p. Stream:
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Streamzuschnitt 1024 × 1024: (625, 375, 750, 750)
Streamzuschnitt 1280 x 720: (500, 469, 1000, 562)

Anbauregion-43-Quadrat-Verhältnis

Abbildung 4: Seitenverhältnis 4:3, quadratisch

Erneute Verarbeitung

Zusätzlicher Support für RAW-Bilddateien wird durch den Support für die erneute Verarbeitung von RAW-Bayer bereitgestellt. Daten. Durch diese Unterstützung kann die Kamerapipeline zuvor aufgenommene RAW-Zwischenspeicher und Metadaten (ein ganzer Frame, der zuvor aufgezeichnet wurde) eine neue gerenderte YUV- oder JPEG-Ausgabe.

Zoom

Auf Geräten mit Android 11 oder höher kann eine App den Zoom einer Kamera verwenden (digital und optisch) über die ANDROID_CONTROL_ZOOM_RATIO-Einstellung verfügbar.

Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstelle von mit ANDROID_SCALER_CROP_REGION zum Zuschneiden und Zoomen, kann eine App ANDROID_CONTROL_ZOOM_RATIO, um die Zoomstufe zu steuern, und verwenden ANDROID_SCALER_CROP_REGION für horizontales und vertikales Zuschneiden auf andere Seitenverhältnisse als der native Kamerasensor erreichen.

Ein Multi-Kamera-System kann mehr als ein Objektiv mit unterschiedlichen Brennweite und der optische Zoom ermöglicht das Wechseln zwischen Objektiven. Die Verwendung von ANDROID_CONTROL_ZOOM_RATIO bietet in den folgenden Szenarien Vorteile:

  • Heranzoomen vom Weitwinkel- zu einem Teleobjektiv: Ein Gleitkommaverhältnis bietet eine bessere Precision im Vergleich zu ganzzahligen Werten von ANDROID_SCALER_CROP_REGION
  • Herauszoomen von einem Weitwinkel- auf ein Ultraweitwinkelobjektiv: ANDROID_CONTROL_ZOOM_RATIO unterstützt das Herauszoomen (<1.0f), was bei ANDROID_SCALER_CROP_REGION nicht der Fall ist.

Zur Veranschaulichung sehen Sie hier mehrere Szenarien mit unterschiedlichen Zoomverhältnissen, Zuschneidebereichen und Ausgabe. mit derselben hypothetischen Kamera, die im vorherigen Abschnitt definiert wurde.

Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 0, 2.000, 1.500) (Seitenverhältnis 4:3)
Streamzuschnitt 640 x 480: (0, 0, 2000, 1500) (entspricht Zuschneidebereich)
Streamzuschnitt 1280 x 720: (0, 187, 2000, 1125)

Zoomverhältnis 2-zu-43

Abbildung 5: Zoom: 2.0, Seitenverhältnis 4:3

Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Streamzuschnitt 640 x 480: (250, 187, 1500, 1125) (Pillarbox-Bild)
Streamzuschnitt 1280 x 720: (0, 187, 2000, 1125) (entspricht Zuschneidebereich)

Zoomverhältnis 2-zu-169

Abbildung 6: Zoom: 2.0, Seitenverhältnis 16:9

Zoomverhältnis: 0,5; 4-faches ursprüngliches Sichtfeld (von Weitwinkel- auf Ultraweitwinkelobjektiv gewechselt)
Zuschneidebereich: (250, 0, 1.500, 1.500) (Seitenverhältnis 1:1)
Streamzuschnitt 640 x 480: (250, 187, 1500, 1125) (Letterbox-Bild)
Streamzuschnitt 1280 x 720: (250, 328, 1500, 844) (Letterbox-Bild)

Bilder/Zoomverhältnis-0,5-zuschnitt-11

Abbildung 7: 0,5 Zoom, Seitenverhältnis 1:1

Wie Sie den Grafiken oben entnehmen können, ändert sich das Koordinatensystem des Anbaugebiets zum effektiven nach dem Zoomen angezeigt wird und durch das Rechteck mit den folgenden Abmessungen dargestellt wird: (0, 0, activeArrayWith, activeArrayHeight). Dasselbe gilt für AE/AWB/AF-Regionen und -Gesichter. Diese Änderung des Koordinatensystems gilt nicht für RAW-Aufnahme und die zugehörigen Metadaten wie intrinsicCalibration und lensShadingMap.

Verwenden Sie das gleiche hypothetische Beispiel oben und gehen Sie davon aus, dass der Ausgabestream Nr. 1 (640 x 480) der Wert Im Sucher-Stream gibt es zwei Möglichkeiten für den 2, 0-fachen Zoom:

  • zoomRatio = 2.0, scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (Standard), scaler.cropRegion = (500, 375, 1000, 750)

Wenn in einer App android.control.aeRegions oben links festgelegt werden soll ein Viertel des Sichtfelds im Sucher, android.control.aeRegions nach (0, 0, 1000, 750) mit android.control.zoomRatio auf 2.0 festgelegt. Alternativ können Sie kann die App android.control.aeRegions auf die entsprechende Region von (500, 375, 1000, 750) für android.control.zoomRatio von 1.0.