Strumienie wyjściowe, kadrowanie i powiększanie

Strumienie wyjściowe

Podsystem kamery działa wyłącznie w oparciu o potok ANativeWindow dla wszystkich rozdzielczości i formatów wyjściowych. Można skonfigurować wiele strumieni jednocześnie, aby wysłać pojedynczą klatkę do wielu celów, takich jak procesor graficzny, koder wideo, RenderScript lub bufory widoczne w aplikacji (RAW Bayer, przetworzone bufory YUV lub bufory zakodowane w formacie JPEG).

W ramach optymalizacji te strumienie wyjściowe muszą być skonfigurowane z wyprzedzeniem, a jednocześnie może istnieć tylko ograniczona ich liczba. Pozwala to na wstępną alokację buforów pamięci i konfigurację sprzętu kamery, dzięki czemu w przypadku przesyłania żądań z wieloma lub różnymi potokami wyjściowymi na liście nie wystąpią opóźnienia ani opóźnienia w realizacji żądania.

Aby uzyskać więcej informacji na temat gwarantowanych kombinacji wyjściowych strumieni, które zależą od obsługiwanego poziomu sprzętu, zobacz createCaptureSession() .

Uprawa

Przycięcie pełnej tablicy pikseli (w przypadku zoomu cyfrowego i innych zastosowań, w których pożądane jest mniejsze pole widzenia) jest realizowane poprzez ustawienie ANDROID_SCALER_CROP_REGION. Jest to ustawienie zależne od żądania i może się zmieniać w zależności od żądania, co ma kluczowe znaczenie dla zapewnienia płynnego powiększenia cyfrowego.

Region jest zdefiniowany jako prostokąt (x, y, szerokość, wysokość), gdzie (x, y) opisuje lewy górny róg prostokąta. Prostokąt jest zdefiniowany w układzie współrzędnych tablicy aktywnych pikseli czujnika, gdzie (0,0) oznacza lewy górny piksel tablicy aktywnych pikseli. Dlatego szerokość i wysokość nie mogą być większe niż wymiary podane w statycznym polu informacyjnym ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Minimalna dozwolona szerokość i wysokość są raportowane przez warstwę HAL za pośrednictwem statycznego pola informacyjnego ANDROID_SCALER_MAX_DIGITAL_ZOOM, które opisuje maksymalny obsługiwany współczynnik powiększenia. Dlatego minimalna szerokość i wysokość obszaru przycięcia wynosi:

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

Jeśli zakres przycięcia musi spełniać określone wymagania (na przykład musi zaczynać się od parzystych współrzędnych, a jego szerokość/wysokość musi być równa), HAL musi wykonać niezbędne zaokrąglenia i wypisać ostateczny zakres przycięcia użyty w wyniku metadane wyników. Podobnie, jeśli warstwa HAL implementuje stabilizację wideo, musi dostosować zakres przycięcia wyniku, aby opisać obszar faktycznie uwzględniony w wyjściu po zastosowaniu stabilizacji wideo. Ogólnie rzecz biorąc, aplikacja korzystająca z kamery musi być w stanie określić otrzymywane pole widzenia na podstawie zakresu kadrowania, wymiarów przetwornika obrazu i ogniskowej obiektywu.

Ponieważ obszar przycięcia ma zastosowanie do wszystkich strumieni, które mogą mieć inne współczynniki kształtu niż obszar przycięcia, dokładny obszar czujnika zastosowany dla każdego strumienia może być mniejszy niż obszar przycięcia. W szczególności każdy strumień powinien zachować kwadratowe piksele i proporcje, minimalnie przycinając zdefiniowany zakres przycięcia. Jeśli współczynnik proporcji strumienia jest szerszy niż zakres przycięcia, strumień należy przyciąć dalej w pionie, a jeśli współczynnik kształtu strumienia jest węższy niż zakres przycięcia, strumień należy przyciąć dalej w poziomie.

We wszystkich przypadkach uprawa strumieniowa musi być wyśrodkowana w obrębie pełnego obszaru upraw, a każdy strumień jest kadrowany tylko w poziomie lub w pionie w stosunku do pełnego obszaru upraw, nigdy jednocześnie.

Na przykład, jeśli zdefiniowano dwa strumienie, strumień 640 x 480 (aspekt 4:3) i strumień 1280 x 720 (aspekt 16:9), poniżej przedstawiono oczekiwane obszary wyjściowe dla każdego strumienia dla kilku przykładowych obszarów upraw, na hipotetycznym 3 Czujnik MP (matryca 2000 x 1500 pikseli).

Zakres przycięcia: (500, 375, 1000, 750) (współczynnik proporcji 4:3)
Kadr strumieniowy 640 x 480: (500, 375, 1000, 750) (równy zakresowi przycięcia)
Przycinanie strumieniowe 1280 x 720: (500, 469, 1000, 562)

współczynnik-region-43

Rysunek 1. Proporcje 4:3

Zakres przycięcia: (500, 375, 1333, 750) (proporcje 16:9)
Przycinanie strumieniowe 640 x 480: (666, 375, 1000, 750)
Kadr strumieniowy 1280 x 720: (500, 375, 1333, 750) (równy zakresowi przycięcia)

współczynnik-regionu-169

Rysunek 2. Proporcje 16:9

Zakres przycięcia: (500, 375, 750, 750) (stosunek proporcji 1:1)
Przycinanie strumieniowe 640 x 480: (500, 469, 750, 562)
Przycinanie strumieniowe 1280 x 720: (500, 543, 750, 414)

współczynnik upraw-region-11

Rysunek 3. Proporcje 1:1

I ostatni przykład: strumień o kwadratowych proporcjach 1024x1024 zamiast strumienia 480p:
Zakres przycięcia: (500, 375, 1000, 750) (współczynnik proporcji 4:3)
Kadrowanie strumieniowe 1024 x 1024: (625, 375, 750, 750)
Przycinanie strumieniowe 1280 x 720: (500, 469, 1000, 562)

region-przycięcia-43-kwadrat-współczynnik

Rysunek 4. Proporcje 4:3, kwadrat

Utylizacja

Dodatkową obsługę plików obrazów RAW zapewnia obsługa ponownego przetwarzania danych RAW Bayer. Ta obsługa umożliwia potokowi kamery przetwarzanie wcześniej przechwyconego bufora RAW i metadanych (całej klatki, która została wcześniej nagrana) w celu wygenerowania nowego wyrenderowanego wyjścia YUV lub JPEG.

Powiększenie

W przypadku urządzeń z systemem Android 11 lub nowszym aplikacja może korzystać z zoomu aparatu (cyfrowego i optycznego) za pomocą ustawienia ANDROID_CONTROL_ZOOM_RATIO .

Współczynnik powiększenia definiuje się jako współczynnik zmiennoprzecinkowy. Zamiast używać ANDROID_SCALER_CROP_REGION do przycinania i powiększania, aplikacja może używać ANDROID_CONTROL_ZOOM_RATIO do kontrolowania poziomu powiększenia i używać ANDROID_SCALER_CROP_REGION do przycinania w poziomie i w pionie, aby uzyskać współczynniki kształtu inne niż natywny czujnik aparatu.

System wielokamerowy może zawierać więcej niż jeden obiektyw o różnych ogniskowych, a użytkownik może korzystać z zoomu optycznego poprzez przełączanie między obiektywami. Korzystanie z ANDROID_CONTROL_ZOOM_RATIO przynosi korzyści w poniższych scenariuszach:

  • Powiększanie z obiektywu szerokokątnego na teleobiektyw: współczynnik zmiennoprzecinkowy zapewnia lepszą precyzję w porównaniu z wartościami całkowitymi ANDROID_SCALER_CROP_REGION .
  • Pomniejszanie z obiektywu szerokokątnego na obiektyw ultraszerokokątny: ANDROID_CONTROL_ZOOM_RATIO obsługuje pomniejszanie (<1,0f), podczas gdy ANDROID_SCALER_CROP_REGION nie.

Aby to zilustrować, oto kilka scenariuszy różnych współczynników powiększenia, obszarów przycięcia i strumieni wyjściowych przy użyciu tej samej hipotetycznej kamery zdefiniowanej w poprzedniej sekcji.

Współczynnik powiększenia: 2,0; 1/4 oryginalnego pola widzenia
Zakres przycięcia: (0, 0, 2000, 1500) (współczynnik proporcji 4:3)
Kadr strumieniowy 640x480: (0, 0, 2000, 1500) (równy zakresowi przycięcia)
Przycinanie strumieniowe 1280 x 720: (0, 187, 2000, 1125)

współczynnik powiększenia-2-przycięcie-43

Rysunek 5. Zoom 2.0, proporcje 4:3

Współczynnik powiększenia: 2,0; 1/4 oryginalnego pola widzenia
Zakres przycięcia: (0, 187, 2000, 1125) (proporcje 16:9)
Kadr strumieniowy 640 x 480: (250, 187, 1500, 1125) (pillarboxed)
Kadr strumieniowy 1280 x 720: (0, 187, 2000, 1125) (równy zakresowi przycięcia)

współczynnik powiększenia-2-przycięcie-169

Rysunek 6. Zoom 2.0, proporcje 16:9

Współczynnik powiększenia: 0,5; 4x oryginalne pole widzenia (przełączono z obiektywu szerokokątnego na obiektyw ultraszerokokątny)
Zakres przycięcia: (250, 0, 1500, 1500) (stosunek proporcji 1:1)
Przycięcie strumieniowe 640 x 480: (250, 187, 1500, 1125) (letterbox)
Przycinanie strumieniowe 1280 x 720: (250, 328, 1500, 844) (letterbox)

obrazy/zoom-ratio-0,5-crop-11

Rysunek 7. Powiększenie 0,5, proporcje 1:1

Jak widać na powyższych wykresach, układ współrzędnych obszaru przycięcia zmienia się na efektywne pole widzenia po powiększeniu i jest reprezentowany przez prostokąt o następujących wymiarach: ( 0 , 0 , activeArrayWith , activeArrayHeight ). To samo dotyczy obszarów i twarzy AE/AWB/AF. Ta zmiana układu współrzędnych nie dotyczy przechwytywania plików RAW i powiązanych z nimi metadanych, takich jak intrinsicCalibration i lensShadingMap .

Korzystając z tego samego hipotetycznego przykładu powyżej i zakładając, że strumień wyjściowy nr 1 (640x480) jest strumieniem wizjera, powiększenie 2,0x można uzyskać na jeden z dwóch sposobów:

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

Aby aplikacja ustawiła android.control.aeRegions jako lewą górną ćwiartkę pola widzenia wizjera, ustaw android.control.aeRegions na (0, 0, 1000, 750) a android.control.zoomRatio ustaw na 2.0 . Alternatywnie aplikacja może ustawić android.control.aeRegions na równoważny region (500, 375, 1000, 750) dla android.control.zoomRatio wynoszący 1.0 .