Strumienie wyjściowe, przycinanie i powiększanie

Strumienie wyjściowe

Podsystem kamery działa wyłącznie na podstawie potoku opartego na ANativeWindow we wszystkich rozdzielczościach i formatach wyjściowych. na wysłanie jednej klatki do wielu elementów docelowych, takich jak GPU, kodera, RenderScript, lub bufory widoczne w aplikacji (RAW Bayer, przetworzone YUV). (bufory czy bufory z kodowaniem JPEG).

Ze względów optymalizacji te strumienie wyjściowe należy skonfigurować z wyprzedzeniem. może jednocześnie istnieć tylko ograniczona ich liczba. Umożliwia to wstępne przydzielanie do buforowania i konfigurowania aparatu, tak aby po otrzymaniu żądania przesłane z wymienionymi wieloma potokami wyjściowymi lub o ich zróżnicowaniu, z opóźnieniami w realizacji żądania.

Więcej informacji o gwarantowanych kombinacjach wyjściowych strumieni w zależności od obsługiwanego poziomu sprzętu, zobacz createCaptureSession()

Przycinanie

Przycinanie pełnej tablicy pikseli (na potrzeby powiększenia cyfrowego i innych zastosowań, gdzie mniejsze pole widzenia jest pożądane) jest przekazywane przez ANDROID_SCALER_CROP_REGION . To ustawienie jest określane dla konkretnej prośby i można je zmienić w odpowiedzi na żądanie. co ma kluczowe znaczenie dla wdrożenia płynnego powiększenia cyfrowego.

Obszar jest zdefiniowany jako prostokąt (x, y, szerokość, wysokość) z elementami (x, y) który opisuje lewy górny róg prostokąta. Prostokąt jest zdefiniowany na układ współrzędnych aktywnej tablicy pikseli czujnika, przy czym (0,0) to punkt piksel w lewym górnym rogu aktywnej tablicy pikseli. Dlatego atrybuty szerokość i wysokość nie mogą być większe niż wymiary podane w funkcji ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY statyczne pole informacji. Minimalna dozwolona szerokość i wysokość jest raportowana przez HAL używając pola statycznych informacji na temat systemu ANDROID_SCALER_MAX_DIGITAL_ZOOM, które opisuje maksymalnego obsługiwanego współczynnika powiększenia. Dlatego minimalna szerokość obszaru przycięcia wzrost to:

  {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 obszar przycięcia musi spełniać określone wymagania (np. zaczyna się od parzystych współrzędnych, a jego szerokość/wysokość musi być parzysta), HAL musi wykonać niezbędne zaokrąglenia i wpisać ostateczny obszar przycinania używany metadanych wynikowych. Analogicznie, jeśli HAL ma stabilizację wideo, musi dostosować wynikowy obszar przycięcia tak, aby opisać region uwzględniony obrazu wyjściowego po zastosowaniu stabilizacji wideo. Ogólnie rzecz biorąc, musi być w stanie określić, jakie pole widzenia otrzymuje, na podstawie obszar przycinania, wymiary czujnika obrazu i ogniskę obiektywu.

Ponieważ region uprawy odnosi się do wszystkich strumieni, które mogą mieć różne aspekty niż obszar przycięcia, dokładny obszar czujnika używany dla każdego strumienia może być jest mniejszy niż obszar przycięcia. Konkretnie każdy strumień powinien być kwadratowy pikseli i współczynnika proporcji przez minimalne przycięcie zdefiniowanego przycięcia i regionie. Jeśli format obrazu jest szerszy niż obszar przycinania, należy przyciąć w pionie, a format obrazu jest węższy niż obszar przycięcia, strumień należy przyciąć w poziomie.

We wszystkich przypadkach przycięcie strumienia musi być wyśrodkowane w pełnym obszarze przycinania. przycięty obraz w poziomie lub w pionie względem całego obszaru przycinania, a nie obu.

Jeśli np. zdefiniujesz dwa strumienie, strumień o wymiarach 640 x 480 (współczynnik proporcji 4:3) strumień 1280 x 720 (format 16:9), poniżej pokazuje oczekiwane regiony wyjściowe. dla każdego strumienia dla kilku przykładowych obszarów przycięcia, hipotetycznym wynikiem 3 Mpix (2000 x 1500 pikseli tablicy).

Region przycięcia: (500, 375, 1000, 750) (współczynnik proporcji 4:3)
Przycięcie strumienia 640 x 480: (500, 375, 1000, 750) (równe regionowi przycięcia)
Przycięcie strumienia 1280 x 720: (500, 469, 1000, 562)

współczynnik-regionu-43

Rysunek 1. Format obrazu 4:3

Region przycięcia: (500, 375, 1333, 750) (współczynnik proporcji 16:9)
Przycięcie strumienia 640 x 480: (666, 375, 1000, 750)
Przycięcie strumienia 1280 x 720: (500, 375, 1333, 750) (równe regionowi przycięcia)

współczynnik-regionu-169

Rysunek 2. Współczynnik proporcji 16:9

Region przycięcia: (500, 375, 750, 750) (współczynnik proporcji 1:1)
Przycięcie strumienia 640 x 480: (500, 469, 750, 562)
Przycięcie strumienia 1280 x 720: (500, 543, 750, 414)

współczynnik-regionu-11

Rysunek 3. Format obrazu 1:1

Ostatni przykład to kwadratowy strumień o współczynniku proporcji 1024 x 1024 zamiast 480p. strumień:
Region przycięcia: (500, 375, 1000, 750) (współczynnik proporcji 4:3)
Przycięcie strumienia 1024 x 1024: (625, 375, 750, 750)
Przycięcie strumienia 1280 x 720: (500, 469, 1000, 562)

współczynnik-kwadrat-43 przycięcia

Rysunek 4. Format obrazu 4:3, kwadrat

Ponowne przetwarzanie

Dodatkowa obsługa plików nieprzetworzonych obrazów jest świadczona przez ponowne przetwarzanie plików RAW Bayer. i skalowalnych danych. Dzięki tej obsłudze potok kamery może przetworzyć wcześniej przechwycony bufor i metadane RAW (całej zarejestrowanej wcześniej klatki), tworzy nowy, wyrenderowany plik wyjściowy YUV lub JPEG.

Zoom

Na urządzeniach z Androidem 11 lub nowszym aplikacja może używać powiększenia w aparacie (cyfrowego i optycznego) za pomocą ustawienia ANDROID_CONTROL_ZOOM_RATIO.

Współczynnik powiększenia jest definiowany jako współczynnik zmiennoprzecinkowy. Zamiast i używania ANDROID_SCALER_CROP_REGION do przycinania i powiększania, aplikacja może używać ANDROID_CONTROL_ZOOM_RATIO, by sterować poziomem powiększenia, i używać ANDROID_SCALER_CROP_REGION – przycięcie w poziomie i w pionie w uzyskać współczynniki proporcji inne niż w przypadku natywnego czujnika aparatu.

System obejmujący kilka aparatów może zawierać więcej niż jeden obiektyw z różnymi możesz użyć zoomu optycznego i zmienić obiektyw. Używanie usługi ANDROID_CONTROL_ZOOM_RATIO przynosi korzyści w tych sytuacjach:

  • Powiększanie z obiektywu szerokokątnego do teleobiektywu: współczynnik zmiennoprzecinkowy zapewnia większą precyzję w porównaniu z wartościami całkowitymi ANDROID_SCALER_CROP_REGION
  • Zmiana powiększenia z obiektywu szerokokątnego na obiektyw ultraszerokokątny: ANDROID_CONTROL_ZOOM_RATIO obsługuje pomniejszanie (<1.0f), a ANDROID_SCALER_CROP_REGION nie.

Aby to zilustrować, przedstawiamy kilka scenariuszy różnych współczynników powiększenia, obszarów przycinania i wyników wyjściowych za pomocą tej samej hipotetycznej kamery zdefiniowanej w poprzedniej sekcji.

Współczynnik powiększenia: 2,0; 1/4 oryginalnego pola widzenia
Region przycięcia: (0, 0, 2000, 1500) (współczynnik proporcji 4:3)
Przycięcie strumienia 640 x 480: (0, 0, 2000, 1500) (równe części przycinania)
Przycięcie strumienia 1280 x 720: (0, 187, 2000, 1125)

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

Rysunek 5. Zoom 2,0, format obrazu 4:3

Współczynnik powiększenia: 2,0; 1/4 oryginalnego pola widzenia
Region przycięcia: (0, 187, 2000, 1125) (współczynnik proporcji 16:9)
Przycięcie strumienia 640 x 480: (250, 187, 1500, 1125) (pillarbox)
Przycięcie strumienia 1280 x 720: (0, 187, 2000, 1125) (równe regionowi przycięcia)

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

Rysunek 6. Zoom 2,0, format obrazu 16:9

Współczynnik powiększenia: 0,5; 4x oryginalnego pola widzenia (zmiana z obiektywu szerokokątnego na ultraszerokokątny)
Region przycięcia: (250, 0, 1500, 1500) (współczynnik proporcji 1:1)
Przycięcie strumienia 640 x 480: (250, 187, 1500, 1125) (literowe)
Przycięcie strumienia 1280 x 720: (250, 328, 1500, 844) (lista letterbox)

obrazy/współczynnik powiększenia-0,5-przycięcia-11

Rysunek 7. Zoom 0,5, format obrazu 1:1

Jak widać na powyższych wykresach, układ współrzędnych obszaru przycięcia zmienia się na skuteczny jest widoczne po powiększeniu, co jest przedstawiane przez prostokąt o następujących wymiarach: (0, 0, activeArrayWith, activeArrayHeight). To samo dotyczy twarzy i regionów AE/AWB/AF. Ta zmiana układu współrzędnych nie dotyczy Format zapisu RAW i powiązane z nim metadane, takie jak intrinsicCalibration czy lensShadingMap

Posługując się tym samym hipotetycznym przykładem powyżej, przy założeniu, że strumień wyjściowy nr 1 (640 x 480) to strumienia w wizjerze, powiększenie 2,0x można uzyskać na 2 sposoby:

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

Aby aplikacja mogła ustawić android.control.aeRegions jako lewy górny róg ćwierć pola widzenia wizjera, android.control.aeRegions do: (0, 0, 1000, 750) z Ustawiono android.control.zoomRatio na 2.0. Ewentualnie aplikacja może ustawić android.control.aeRegions na odpowiednik region (500, 375, 1000, 750) dla android.control.zoomRatio z 1.0.