Ausgabestreams, Zuschneiden und Zoomen

Ausgabeströme

Das Kamera-Subsystem arbeitet ausschließlich auf der ANativeWindow-basierten Pipeline für alle Auflösungen und Ausgabeformate. Mehrere Streams können gleichzeitig konfiguriert werden, um einen einzelnen Frame an viele Ziele wie die GPU, den Video-Encoder, RenderScript oder in der App sichtbare Puffer (RAW Bayer, verarbeitete YUV-Puffer oder JPEG-kodierte Puffer) zu senden.

Aus Optimierungsgründen müssen diese Ausgabestreams im Voraus konfiguriert werden und es darf nur eine begrenzte Anzahl gleichzeitig vorhanden sein. Dies ermöglicht die Vorabzuweisung von Speicherpuffern und die Konfiguration der Kamerahardware, sodass es bei der Übermittlung von Anforderungen mit mehreren oder unterschiedlich aufgelisteten Ausgabepipelines nicht zu Verzögerungen oder Latenzen bei der Erfüllung der Anforderung kommt.

Weitere Informationen zu den garantierten Stream-Ausgabekombinationen, die von der unterstützten Hardwareebene abhängen, finden Sie unter createCaptureSession() .

Zuschneiden

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

Die Region ist als Rechteck (x, y, Breite, Höhe) definiert, wobei (x, y) die obere linke Ecke des Rechtecks ​​beschreibt. Das Rechteck wird im 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 Infofeld ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY angegebenen Abmessungen. Die minimal zulässige Breite und Höhe werden von der HAL über das statische Infofeld ANDROID_SCALER_MAX_DIGITAL_ZOOM gemeldet, das den maximal unterstützten Zoomfaktor beschreibt. Daher betragen die Mindestbreite 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 auf geraden Koordinaten beginnen und seine Breite/Höhe muss gerade sein), muss der HAL die erforderliche Rundung vornehmen und den endgültigen Zuschneidebereich ausschreiben, der in der Ausgabe verwendet wird Ergebnismetadaten. Wenn die HAL eine Videostabilisierung implementiert, muss sie in ähnlicher Weise den resultierenden Zuschneidebereich anpassen, um den Bereich zu beschreiben, der tatsächlich in der Ausgabe enthalten ist, nachdem die Videostabilisierung angewendet wurde. Im Allgemeinen muss eine Anwendung, die eine Kamera verwendet, in der Lage sein, das empfangene Sichtfeld anhand des Zuschnittbereichs, der Abmessungen des Bildsensors und der Brennweite des Objektivs zu bestimmen.

Da die Zuschneideregion für alle Bäche gilt, die andere Seitenverhältnisse als die Zuschneideregion haben können, kann die genaue Sensorregion, die für jeden Bach verwendet wird, kleiner als die Zuschneideregion sein. 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 zugeschnitten werden. Wenn das Seitenverhältnis des Streams schmaler als der Zuschneidebereich ist, sollte der Stream weiter horizontal zugeschnitten werden.

In allen Fällen muss der Bachzuschnitt innerhalb des gesamten Zuschneidebereichs zentriert sein, und jeder Bach wird relativ zum gesamten Zuschneidebereich nur entweder horizontal oder vertikal zugeschnitten, niemals beides.

Wenn beispielsweise zwei Streams definiert sind, ein 640 x 480-Stream (4:3-Seitenverhältnis) und ein 1280 x 720-Stream (16:9-Seitenverhältnis), werden unten die erwarteten Ausgabebereiche für jeden Stream für einige Beispiel-Zuschneidebereiche anhand einer hypothetischen 3 veranschaulicht MP-Sensor (2000 x 1500 Pixel Array).

Zuschneidebereich: (500, 375, 1000, 750) (Seitenverhältnis 4:3)
640 x 480 Stream Crop: (500, 375, 1000, 750) (entspricht der Crop-Region)
1280x720 Stream Crop: (500, 469, 1000, 562)

Crop-Region-43-Verhältnis

Abbildung 1. Seitenverhältnis 4:3

Zuschneidebereich: (500, 375, 1333, 750) (Seitenverhältnis 16:9)
640x480 Stream Crop: (666, 375, 1000, 750)
1280 x 720 Stream Crop: (500, 375, 1333, 750) (entspricht der Crop-Region)

Crop-Region-169-Verhältnis

Abbildung 2. Seitenverhältnis 16:9

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

Crop-Region-11-Verhältnis

Abbildung 3. Seitenverhältnis 1:1

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

Crop-Region-43-Quadrat-Verhältnis

Abbildung 4. Seitenverhältnis 4:3, 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 Kamera-Pipeline, einen zuvor erfassten RAW-Puffer und Metadaten (ein gesamtes Bild, das zuvor aufgezeichnet wurde) zu verarbeiten, um eine neue gerenderte YUV- oder JPEG-Ausgabe zu erzeugen.

Zoomen

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

Das Zoomverhältnis wird als Gleitkommafaktor definiert. Anstatt ANDROID_SCALER_CROP_REGION zum Zuschneiden und Zoomen zu verwenden, kann eine App ANDROID_CONTROL_ZOOM_RATIO verwenden, um die Zoomstufe zu steuern, und ANDROID_SCALER_CROP_REGION zum horizontalen und vertikalen Zuschneiden verwenden, um andere Seitenverhältnisse als der native Kamerasensor zu erzielen.

Ein System mit mehreren Kameras kann mehr als ein Objektiv mit unterschiedlichen Brennweiten enthalten, und der Benutzer kann den optischen Zoom nutzen, indem er zwischen den Objektiven wechselt. Die Verwendung ANDROID_CONTROL_ZOOM_RATIO bietet in den folgenden Szenarien Vorteile:

  • Vergrößern von einem Weitwinkelobjektiv zu einem Teleobjektiv: Ein Gleitkommaverhältnis bietet eine bessere Präzision im Vergleich zu ganzzahligen Werten von ANDROID_SCALER_CROP_REGION .
  • Herauszoomen von einem Weitwinkelobjektiv zu einem Ultraweitwinkelobjektiv: ANDROID_CONTROL_ZOOM_RATIO unterstützt das Herauszoomen (<1,0f), ANDROID_SCALER_CROP_REGION hingegen nicht.

Zur Veranschaulichung finden Sie hier mehrere Szenarien mit unterschiedlichen Zoomverhältnissen, Zuschneidebereichen und Ausgabeströmen, wobei dieselbe hypothetische Kamera verwendet wird, die im vorherigen Abschnitt definiert wurde.

Zoomverhältnis: 2,0; 1/4 des ursprünglichen Sichtfeldes
Zuschneidebereich: (0, 0, 2000, 1500) (Seitenverhältnis 4:3)
640x480 Stream Crop: (0, 0, 2000, 1500) (entspricht der Crop-Region)
1280x720 Stream Crop: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

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

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

Zoomverhältnis-2-Zuschneiden-169

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

Zoomverhältnis: 0,5; 4x des ursprünglichen Sichtfeldes (umgestellt von Weitwinkelobjektiv auf Ultraweitwinkelobjektiv)
Zuschneidebereich: (250, 0, 1500, 1500) (Seitenverhältnis 1:1)
640 x 480 Stream-Zuschnitt: (250, 187, 1500, 1125) (Letterbox)
1280 x 720 Stream-Zuschnitt: (250, 328, 1500, 844) (Letterbox)

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

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

Wie aus den obigen Diagrammen hervorgeht, ändert sich das Koordinatensystem des Zuschneidebereichs in das effektive Sichtfeld nach dem Zoomen und 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-Erfassung und die zugehörigen Metadaten wie intrinsicCalibration und lensShadingMap .

Unter Verwendung des gleichen hypothetischen Beispiels oben und unter der Annahme, dass Ausgabestrom Nr. 1 (640 x 480) der Sucherstrom ist, 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)

Damit eine App android.control.aeRegions auf das obere linke Viertel des Sichtfelds des Suchers festlegt, setzen Sie android.control.aeRegions auf (0, 0, 1000, 750) und android.control.zoomRatio auf 2.0 . 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.