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)
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)
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)
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)
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), aANDROID_SCALER_CROP_REGION
nie.
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,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: 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)
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
.