Ausgabestreams, Zuschneiden und Zoomen

Ausgabestreams

Das Kamera-Subsystem verwendet für alle Auflösungen und Ausgabeformate ausschließlich die ANativeWindow-basierte Pipeline. Mehrere Streams können gleichzeitig konfiguriert werden, um einen einzelnen Frame an viele Ziele zu senden, z. B. an die GPU, den Videoencoder, RenderScript oder an app-sichtbare Puffer (RAW Bayer, verarbeitete YUV-Puffer oder JPEG-codierte Puffer).

Aus Gründen der Optimierung müssen diese Ausgabestreams im Voraus konfiguriert werden. Außerdem darf es nur eine begrenzte Anzahl davon geben. So können Speicher-Buffer vorab zugewiesen und die Kamerahardware konfiguriert werden, damit bei Anfragen mit mehreren oder unterschiedlichen aufgeführten Ausgabepipelines keine Verzögerungen oder Latenzen bei der Ausführung der Anfrage auftreten.

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

Zuschneiden

Das Zuschneiden des vollständigen Pixelarrays (für den digitalen Zoom und andere Anwendungsfälle, bei denen ein kleineres Sichtfeld wünschenswert ist) wird über die Einstellung ANDROID_SCALER_CROP_REGION mitgeteilt. Diese Einstellung gilt pro Anfrage und kann sich ändern. Das ist entscheidend für die Implementierung eines flüssigen digitalen Zooms.

Die Region wird als Rechteck (x, y, width, height) definiert, wobei (x, y) die linke obere Ecke des Rechtecks beschreibt. Das Rechteck wird auf dem Koordinatensystem des aktiven Pixelarrays des Sensors definiert, wobei (0,0) das Pixel oben links im aktiven Pixelarray ist. Daher dürfen Breite und Höhe nicht größer sein als die im statischen Info-Feld ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen. Die minimal zulässige Breite und Höhe werden von der HAL über das statische Info-Feld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Die minimale Breite und Höhe des Zuschneidebereichs sind daher:

  {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 Zuschnittsbereich bestimmte Anforderungen erfüllen muss (z. B. muss er an geraden Koordinaten beginnen und seine Breite/Höhe muss gerade sein), muss die HAL die erforderlichen Rundungen vornehmen und den endgültigen Zuschnittsbereich in die Metadaten der Ausgabeergebnisse schreiben. Wenn die HAL die Videostabilisierung implementiert, muss sie den Bereich für die resultierende Zuschneidung anpassen, um den Bereich zu beschreiben, der nach der Anwendung der Videostabilisierung tatsächlich in der Ausgabe enthalten ist. Im Allgemeinen muss eine App, die eine Kamera verwendet, das Sichtfeld anhand des zugeschnittenen Bereichs, der Abmessungen des Bildsensors und der Brennweite des Objektivs bestimmen können.

Da der Zuschnittsbereich für alle Streams gilt, die möglicherweise ein anderes Seitenverhältnis als der Zuschnittsbereich haben, ist der genaue Sensorbereich, der für jeden Stream verwendet wird, möglicherweise kleiner als der Zuschnittsbereich. Insbesondere sollte jeder Stream quadratische Pixel und sein Seitenverhältnis beibehalten, indem der definierte Zuschneidebereich minimal weiter zugeschnitten wird. Wenn das Seitenverhältnis des Streams breiter als der Zuschnittsbereich ist, sollte der Stream vertikal weiter zugeschnitten werden. Ist das Seitenverhältnis des Streams schmaler als der Zuschnittsbereich, sollte der Stream horizontal weiter zugeschnitten werden.

In allen Fällen muss der Stream-Zuschnitt im gesamten Zuschnittsbereich zentriert sein. Außerdem wird jeder Stream nur horizontal oder vertikal im Verhältnis zum gesamten Zuschnittsbereich zugeschnitten, niemals beides.

Wenn beispielsweise zwei Streams definiert sind: ein Stream mit 640 × 480 (Seitenverhältnis 4:3) und ein Stream mit einer Größe von 1280 × 720 (Seitenverhältnis von 16:9), werden unten für einige Beispiel-Anschnittbereiche die erwarteten Ausgabebereiche für jeden Stream auf einem hypothetischen 3-MP-Sensor (2.000 × 1.500 Pixel) gezeigt.

Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Streamzuschnitt: 640 × 480: (500, 375, 1.000, 750) (entspricht Zuschneidebereich)
Stream-Zuschnitt: 1280 × 720: (60, 60, 12)

Anbauregion-43-Verhältnis

Abbildung 1. Bildverhältnis 4:3

Zuschneidebereich: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
Stream-Zuschnitt für 640 × 480: (666, 375, 1000, 750)
Stream-Zuschnitt für 1280 × 720: (500, 375, 1333, 750) (entspricht dem Zuschneidebereich)

crop-region-169-ratio

Abbildung 2: Seitenverhältnis von 16:9

Zuschneidebereich: (500, 375, 750, 750) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480 Pixel: (500, 469, 750, 562)
Zuschnitt für 1280 × 720 Pixel: (500, 543, 750, 414)

crop-region-11-ratio

Abbildung 3 Seitenverhältnis 1:1

Und noch ein letztes Beispiel: ein Stream mit quadratischem Seitenverhältnis von 1.024 × 1.024 statt des 480p-Streams:
Zuschneidebereich: (500, 375, 1.000, 750) (Seitenverhältnis 4:3)
Zuschnitt für Stream mit 1.024 × 1.024: (625, 375, 750, 750)
Zuschnitt für Stream mit 1.280 × 720: (500, 469, 1.000, 562)

Anbauregion-43-Quadrat-Verhältnis

Abbildung 4 Seitenverhältnis 4:3, quadratisch

Erneute Verarbeitung

Zusätzliche Unterstützung für Rohbilddateien wird durch die Unterstützung der Nachbearbeitung von RAW-Bayer-Daten bereitgestellt. Dank dieser Unterstützung kann die Kamerapipeline einen zuvor erfassten RAW-Puffer und Metadaten (einen gesamten Frame, der zuvor aufgenommen wurde) verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erstellen.

Zoom

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

Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstatt ANDROID_SCALER_CROP_REGION für Zuschneiden und Zoomen zu verwenden, kann eine App ANDROID_CONTROL_ZOOM_RATIO zum Steuern der Zoomstufe und ANDROID_SCALER_CROP_REGION zum horizontalen und vertikalen Zuschneiden verwenden, um ein anderes Seitenverhältnis als das des nativen Kamerasensors zu erzielen.

Ein Mehrkamerasystem kann mehrere Objektive mit unterschiedlichen Brennweiten enthalten. Der Nutzer kann den optischen Zoom nutzen, indem er zwischen den Objektiven wechselt. Die Verwendung von ANDROID_CONTROL_ZOOM_RATIO bietet Vorteile in den folgenden Szenarien:

  • Vom Weitwinkel- zu einem Teleobjektiv heranzoomen: Ein Gleitkommaverhältnis bietet eine bessere Genauigkeit im Vergleich zu ganzzahligen Werten von ANDROID_SCALER_CROP_REGION.
  • Heranzoomen vom Weitwinkel- zum Ultraweitwinkelobjektiv: ANDROID_CONTROL_ZOOM_RATIO unterstützt das Heranzoomen (< 1,0 f), ANDROID_SCALER_CROP_REGION hingegen nicht.

Zur Veranschaulichung sind hier mehrere Szenarien mit unterschiedlichen Zoomfaktoren, Zuschneidebereichen und Ausgabestreams zu sehen. Dabei wird dieselbe hypothetische Kamera verwendet, die im vorherigen Abschnitt definiert wurde.

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

Zoomverhältnis 2-zu-43

Abbildung 5. 2,0-facher Zoom, Seitenverhältnis 4:3

Zoomfaktor: 2,0; 1/4 des ursprünglichen Sichtfelds
Zuschneidebereich: (0, 187, 2000, 1125) (Seitenverhältnis 16:9)
Zuschnitt für 640 × 480 Pixel-Stream: (250, 187, 1500, 1125) (Pillarbox-Format)
Zuschnitt für 1280 × 720 Pixel-Stream: (0, 187, 2000, 1125) (entspricht dem Zuschneidebereich)

Zoomverhältnis 2-zu-169

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

Zoomverhältnis: 0,5; 4-faches Originalsichtfeld (Wechsel vom Weitwinkel- zum Ultraweitwinkelobjektiv)
Zuschneidebereich: (250, 0, 1500, 1500) (Seitenverhältnis 1:1)
Zuschnitt für 640 × 480-Stream: (250, 187, 1500, 1125) (Letterbox-Format)
Zuschnitt für 1280 × 720-Stream: (250, 328, 1500, 844) (Letterbox-Format)

images/zoom-ratio-0.5-crop-11

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

Wie in den obigen Grafiken zu sehen, ändert sich das Koordinatensystem des Ausschnitts in das effektive Sichtfeld nach dem Zoomen. Es wird durch das Rechteck mit den folgenden Abmessungen dargestellt: (0, 0, activeArrayWith, activeArrayHeight). Das Gleiche gilt für AE-/AWB-/AF-Regionen und Gesichter. Diese Änderung des Koordinatensystems gilt nicht für die RAW-Aufnahme und die zugehörigen Metadaten wie intrinsicCalibration und lensShadingMap.

Angenommen, der Ausgabestream 1 (640 × 480) ist der Sucherstream, kann ein 2,0-facher 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)

Wenn in einer App android.control.aeRegions auf das linke obere Viertel des Sichtfelds im Sucher festgelegt werden soll, musst du android.control.aeRegions auf (0, 0, 1000, 750) setzen und android.control.zoomRatio auf 2.0 setzen. Alternativ kann die App android.control.aeRegions auf die entsprechende Region von (500, 375, 1000, 750) für android.control.zoomRatio von 1.0 festlegen.