Ausgabestreams, Zuschneiden und Zoom

Ausgabestreams

Das Kamera-Subsystem arbeitet ausschließlich auf der ANativeWindow-basierten Pipeline für alle Auflösungen und Ausgabeformate. Mehrere Ströme können gleichzeitig konfiguriert werden , einen einzelnen Rahmen zu viele Ziele wie die GPU zu senden, den Videocodierer, render oder app-sichtbaren Puffer (RAW Bayer, verarbeitet YUV Puffern oder JPEG-kodierte Puffer).

Zur Optimierung müssen diese Ausgabeströme vorab konfiguriert werden und es darf nur eine begrenzte Anzahl auf einmal vorhanden sein. Dies ermöglicht die Vorabzuweisung von Speicherpuffern und die Konfiguration der Kamerahardware, sodass es bei der Übermittlung von Anfragen mit mehreren oder unterschiedlichen aufgelisteten Ausgabepipelines zu keinen Verzögerungen oder Latenzen bei der Erfüllung der Anfrage kommt.

Für weitere Informationen zu den garantierten Strom - Ausgabekombinationen , die auf der unterstützten Hardware - Ebene abhängen, siehe createCaptureSession() .

Zuschneiden

Das Zuschneiden des gesamten Pixelarrays (für Digitalzoom und andere Anwendungsfälle, bei denen ein kleineres Sichtfeld wünschenswert ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION kommuniziert. Dies ist eine Einstellung pro Anfrage und kann sich auf Anfrage ändern, was für die Implementierung eines reibungslosen Digitalzooms von entscheidender Bedeutung ist.

Der Bereich ist als Rechteck (x, y, Breite, Höhe) definiert, wobei (x, y) die linke obere Ecke des Rechtecks ​​beschreibt. Das Rechteck ist im Koordinatensystem des aktiven Pixelarrays des Sensors definiert, wobei (0,0) das obere linke Pixel des aktiven Pixelarrays ist. Daher dürfen Breite und Höhe nicht größer sein als die im statischen Infofeld ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen. Die minimal zulässige Breite und Höhe werden vom HAL über das statische Infofeld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Daher sind die minimale Breite und Höhe des Erntebereichs:

  {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 der Zuschneidebereich bestimmte Anforderungen erfüllen muss (z. B. muss er mit geraden Koordinaten beginnen und seine Breite/Höhe muss gerade sein), muss der HAL die erforderliche Rundung durchführen und den endgültigen Zuschneidebereich ausgeben, der in der Ausgabe verwendet wird Ergebnis-Metadaten. In ähnlicher Weise muss die HAL, wenn die Videostabilisierung implementiert wird, den Ergebnis-Crop-Bereich anpassen, um den Bereich zu beschreiben, der tatsächlich in der Ausgabe enthalten ist, nachdem die Videostabilisierung angewendet wurde. Im Allgemeinen muss eine Anwendung mit Kamera in der Lage sein, das Sichtfeld, das sie empfängt, basierend auf dem Zuschneidebereich, den Abmessungen des Bildsensors und der Brennweite des Objektivs zu bestimmen.

Da der Zuschneidebereich für alle Ströme gilt, die andere Seitenverhältnisse als der Zuschneidebereich haben können, kann der genaue Sensorbereich, der für jeden Strom verwendet wird, kleiner sein als der Zuschneidebereich. Insbesondere sollte jeder Stream quadratische Pixel und sein Seitenverhältnis beibehalten, indem der definierte Zuschneidebereich minimal weiter beschnitten wird. Wenn das Seitenverhältnis des Streams breiter als der Zuschneidebereich ist, sollte der Stream weiter vertikal beschnitten werden, und wenn das Seitenverhältnis des Streams schmaler als der Zuschneidebereich ist, sollte der Stream horizontal weiter beschnitten werden.

In allen Fällen muss der Stream-Beschnitt innerhalb des vollständigen Beschnittbereichs zentriert sein, und jeder Stream wird nur entweder horizontal oder vertikal relativ zum gesamten Beschnittbereich beschnitten, niemals beides.

Wenn beispielsweise zwei Streams definiert sind, ein Stream mit 640 x 480 (4:3-Seite) und ein Stream mit 1280 x 720 (16:9-Seite), werden unten die erwarteten Ausgabebereiche für jeden Stream für einige beispielhafte Zuschneidebereiche auf einem hypothetischen 3 MP-Sensor (2000 x 1500 Pixel Array).

Zuschneidebereich: (500, 375, 1000, 750) (4:3-Seitenverhältnis)
640x480 Stream-Crop: (500, 375, 1000, 750) (entspricht dem Crop-Bereich)
1280 x 720 Stream-Crop: (500, 469, 1000, 562)

Ernteregion-43-Verhältnis

Abbildung 1 : 4: 3 - Seitenverhältnis

Zuschneidebereich: (500, 375, 1333, 750) (16:9 Seitenverhältnis)
640 x 480 Stream-Crop: (666, 375, 1000, 750)
1280 x 720 Stream-Crop: (500, 375, 1333, 750) (entspricht dem Bereich "Crop")

Ernteregion-169-Verhältnis

Abbildung 2 : 16: 9 - Seitenverhältnis

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

Ernte-Region-11-Verhältnis

Abbildung 3 : 1: 1 - Seitenverhältnis

Und ein letztes Beispiel, ein Stream mit einem quadratischen Seitenverhältnis von 1024 x 1024 anstelle des 480p-Streams:
Zuschneidebereich: (500, 375, 1000, 750) (4:3-Seitenverhältnis)
1024x1024 Stream-Crop: (625, 375, 750, 750)
1280 x 720 Stream-Crop: (500, 469, 1000, 562)

Ernteregion-43-Quadrat-Verhältnis

Abbildung 4. 4: 3 - Seitenverhältnis, quadratisch

Wiederaufbereitung

Zusätzliche Unterstützung für Rohbilddateien wird durch die Wiederverarbeitungsunterstützung für RAW-Bayer-Daten bereitgestellt. Diese Unterstützung ermöglicht es der Kamerapipeline, einen zuvor erfassten RAW-Puffer und Metadaten (einen gesamten zuvor aufgezeichneten Frame) zu verarbeiten, um eine neu gerenderte YUV- oder JPEG-Ausgabe zu erzeugen.

Zoomen

Für Geräte mit Android 11 oder höher kann eine App eines Kamera-Zoom (digital und optisch) durch die Verwendung ANDROID_CONTROL_ZOOM_RATIO Einstellung.

Das Zoomverhältnis ist als Gleitkommafaktor definiert. Anstelle der Verwendung von ANDROID_SCALER_CROP_REGION für Ernte und Zoom kann eine App verwenden ANDROID_CONTROL_ZOOM_RATIO die Zoomstufe zu steuern, und die Verwendung ANDROID_SCALER_CROP_REGION für horizontale und vertikale Zuschneiden Seitenverhältnisse anders als die nativen Kamerasensor zu erreichen.

Ein Mehrkamerasystem kann mehr als ein Objektiv mit unterschiedlichen Brennweiten enthalten, und der Benutzer kann den optischen Zoom verwenden, indem er zwischen den Objektiven wechselt. Mit ANDROID_CONTROL_ZOOM_RATIO Vorteile in den Szenarien hat unter:

  • Einzoomen aus einer großen Linse zu einem Teleobjektiv: Ein Gleitkomma - Verhältnis im Vergleich zu ganzzahligen Werten von besserer Präzision bietet ANDROID_SCALER_CROP_REGION .
  • Auszoomen aus einer breiten Linse zu einem ultra Objektiv: ANDROID_CONTROL_ZOOM_RATIO unterstützt Zoom-out (<1.0f) , während ANDROID_SCALER_CROP_REGION nicht.

Zur Veranschaulichung sind hier mehrere Szenarien mit unterschiedlichen Zoomverhältnissen, Zuschneidebereichen und Ausgabeströmen unter Verwendung derselben hypothetischen Kamera, die im vorherigen Abschnitt definiert wurde, aufgeführt.

Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 0, 2000, 1500) (4:3-Seitenverhältnis)
640 x 480 Stream-Crop: (0, 0, 2000, 1500) (entspricht dem Crop-Bereich)
1280 x 720 Stream-Crop: (0, 187, 2000, 1125)

Zoom-Verhältnis-2-Crop-43

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

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

Zoomverhältnis-2-Crop-169

Abbildung 6. 2,0 - Zoom, 16: 9 - Seitenverhältnis

Zoomverhältnis: 0,5; 4x ursprüngliches Sichtfeld (von Weitwinkelobjektiv auf Ultraweitwinkelobjektiv umgeschaltet)
Zuschneidebereich: (250, 0, 1500, 1500) (1:1 Seitenverhältnis)
640 x 480 Stream-Crop: (250, 187, 1500, 1125) (Letterbox)
1280 x 720 Stream-Crop: (250, 328, 1500, 844) (Letterbox)

Bilder/Zoom-Verhältnis-0.5-Crop-11

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

Wie aus den Graphen oben gesehen, das Koordinatensystem der Anbauregion Änderungen des effektiven Afterzoomsichtfeld, und wird durch das Rechteck mit den folgenden Dimensionen dargestellt wird : ( 0 , 0 , activeArrayWith , activeArrayHeight ). Gleiches gilt für AE/AWB/AF-Bereiche und Gesichter. Dieses Koordinatensystem Änderung gilt nicht für RAW - Abscheidung und die dazugehörigen Metadaten wie intrinsicCalibration und lensShadingMap .

Unter Verwendung des gleichen hypothetischen Beispiels oben und unter der Annahme, dass der Ausgabestream Nr. 1 (640 x 480) der Sucherstream ist, kann der 2,0-fache Zoom auf zwei Arten erreicht werden:

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

Für eine Anwendung , um Als android.control.aeRegions die linke obere Viertel des Suchersichtfeldes zu sein, stellen android.control.aeRegions auf (0, 0, 1000, 750) mit android.control.zoomRatio Satz 2.0 . Alternativ kann die Anwendung eingestellt android.control.aeRegions die äquivalenten Region (500, 375, 1000, 750) für android.control.zoomRatio von 1.0 .