Android 9 wprowadził obsługę interfejsu API dla urządzeń z wieloma kamerami za pomocą nowego logicznego urządzenia fotograficznego, które składa się z co najmniej 2 fizycznych aparatów skierowanych w ten sam kierunek. Urządzenie logiczne aparatu jest udostępniane jako pojedynczy obiekt CameraDevice lub CaptureSession w aplikacji, co umożliwia interakcję z funkcjami wielu kamer zintegrowanych z HAL. Aplikacje mogą opcjonalnie uzyskiwać dostęp do podrzędnych strumieni danych z fizycznych kamer, metadanych i elementów sterujących oraz nimi zarządzać.
Rysunek 1. Obsługa wielu kamer
Na tym diagramie różne identyfikatory kamer są oznaczone kolorami. Aplikacja może przesyłać bufory surowych danych z każdej kamery fizycznej jednocześnie. Możesz też ustawić osobne ustawienia i otrzymywać osobne metadane z różnych kamer fizycznych.
Przykłady i źródła
Urządzenia z wieloma kamerami muszą być reklamowane z logicznym wsparciem dla wielu kamer.
Klienty kamer mogą wysyłać zapytania o identyfikator urządzeń fizycznych urządzeń, z których składa się dana kamera logiczna, wywołując metodę getPhysicalCameraIds()
.
Identyfikatory zwrócone w ramach wyniku są następnie używane do indywidualnego sterowania urządzeniami fizycznymi za pomocą setPhysicalCameraId()
.
Wyniki tych poszczególnych zapytań można uzyskać z pełnego wyniku, wywołując getPhysicalCameraResults()
.
Poszczególne żądania dotyczące kamery fizycznej mogą obsługiwać tylko ograniczony podzbiór parametrów. Aby otrzymać listę obsługiwanych parametrów, deweloperzy mogą wywołać metodę getAvailablePhysicalCameraRequestKeys()
.
Strumienie z kamery fizycznej są obsługiwane tylko w przypadku żądań bez ponownego przetwarzania oraz tylko w przypadku czujników monochromatycznych i typów Bayer.
Implementacja
Lista kontrolna pomocy
Aby dodać logiczne urządzenia z wieloma kamerami po stronie HAL:
- Dodaj funkcję
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
dla dowolnego logicznego urządzenia z kamerą, które jest obsługiwane przez co najmniej 2 fizyczne aparaty, które są też dostępne dla aplikacji. - W statycznym polu metadanych
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
wpisz listę identyfikatorów fizycznych kamer. - Wypełnij metadane statyczne związane z głębią, które są wymagane do korelacji pikseli z fizycznych strumieni kamer:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. W polu metadanych statycznego
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
ustaw tę wartość:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: w przypadku czujników w trybie głównym – brak sprzętowej synchronizacji migawki/ekspozycji.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: w przypadku czujników w trybie głównym/podrzędnym – sprzętowa synchronizacja migawki/ekspozycji.
Wypełnij kolumnę
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
listą obsługiwanych parametrów dla poszczególnych fizycznych kamer. Lista może być pusta, jeśli urządzenie logiczne nie obsługuje poszczególnych żądań.Jeśli obsługa poszczególnych próśb jest możliwa, przetwórz i zastosuj poszczególne
physicalCameraSettings
, które mogą docierać jako część żądań rejestrowania, a następnie dołącz do nich odpowiedniephysicalCameraMetadata
.W przypadku wersji interfejsu sprzętowego aparatu 3.5 (wprowadzonej w Androidzie 10) lub nowszej wypełnij klucz wyniku
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
za pomocą identyfikatora bieżącego aktywnego aparatu fizycznego obsługującego aparat logiczny.
W przypadku urządzeń z Androidem 9 kamery muszą obsługiwać zastępowanie jednego logicznego strumienia YUV/RAW strumieniami fizycznymi o tym samym rozmiarze (nie dotyczy strumieni RAW) i tym samym formacie z 2 fizycznych kamer. Nie dotyczy to urządzeń z Androidem 10.
W przypadku urządzeń z Androidem 10, na których wersja interfejsu HAL aparatu to
3.5 lub nowsza, urządzenie z aparatem musi obsługiwać
isStreamCombinationSupported
, aby aplikacje mogły sprawdzić, czy dana kombinacja strumieni zawierających strumienie fizyczne jest obsługiwana.
Mapa konfiguracji strumienia
W przypadku kamery logicznej obowiązkowe kombinacje strumieni dla urządzenia z kamerą o określonym poziomie sprzętowym są takie same jak wymagane w CameraDevice.createCaptureSession
.
Wszystkie strumienie na mapie konfiguracji strumieni muszą być strumieniami logicznymi.
W przypadku logicznego urządzenia z kamerą obsługującego format RAW z fizycznymi podkamerami o różnych rozmiarach, jeśli aplikacja skonfiguruje logiczny strumień RAW, logiczne urządzenie z kamerą nie może przełączyć się na fizyczne podkamery o różnych rozmiarach czujnika. Dzięki temu istniejące aplikacje do robienia zdjęć RAW nie przestaną działać.
Aby można było korzystać z zooma optycznego zgodnego z HAL i przełączać się między fizycznymi aparatami podrzędnymi podczas rejestrowania formatu RAW, aplikacje muszą skonfigurować fizyczne strumienie z podkamery zamiast logicznego strumienia RAW.
Gwarantowana kombinacja strumieni
Zarówno kamera logiczna, jak i powiązane z nią kamery fizyczne muszą gwarantować obowiązkowe kombinacje strumieni wymagane na poziomie poszczególnych urządzeń.
Urządzenie logiczne kamery powinno działać tak samo jak fizyczne urządzenie z kamerą na podstawie poziomu i możliwości sprzętowych. Zalecamy, aby zestaw funkcji był superzbiorem funkcji poszczególnych fizycznych kamer.
Na urządzeniach z Androidem 9 w przypadku każdej gwarantowanej kombinacji strumieni danych kamera logiczna musi obsługiwać:
Zastąpienie jednego logicznego strumienia YUV_420_888 lub strumienia nieprzetworzonego dwoma fizycznymi strumieniami o tym samym rozmiarze i formacie, z których każdy pochodzi z osobnej fizycznej kamery, pod warunkiem, że rozmiar i format są obsługiwane przez fizyczne kamery.
Dodawanie 2 strumyków RAW, po jednym z każdej fizycznej kamery, jeśli kamera logiczna nie reklamuje funkcji RAW, ale fizyczne kamery ją obsługują. Zwykle dzieje się tak, gdy fizyczne kamery mają różne rozmiary czujników.
Korzystanie z strumieni fizycznych zamiast strumienia logicznego o tym samym rozmiarze i formacie. Nie może on spowolnić szybkości rejestrowania, jeśli minimalny czas trwania klatki strumienia fizycznego i logicznego jest taki sam.
Wydajność i moc
Skuteczność:
- Konfigurowanie i przesyłanie strumieni fizycznych może spowolnić szybkość rejestrowania przez logiczną kamerę z powodu ograniczeń zasobów.
- Zastosowanie ustawień fizycznego aparatu może spowolnić szybkość rejestrowania, jeśli aparaty bazowe mają różne liczby klatek.
Zasilanie:
- Optymalizacja zużycia energii przez HAL działa nadal w standardowym przypadku.
- Konfigurowanie lub żądanie strumieni fizycznych może zastąpić wewnętrzną optymalizację zużycia energii przez HAL i spowodować większe zużycie energii.
Dostosowywanie
Implementację urządzenia możesz dostosować na te sposoby:
- Połączone dane wyjściowe logicznego aparatu fotograficznego zależą wyłącznie od implementacji HAL. Decyzja o tym, jak z fizycznych kamer wyodrębniać połączone strumienie logiczne, jest transparentna dla aplikacji i ramy kamery Androida.
- Opcjonalnie można obsługiwać pojedyncze żądania i wyniki dotyczące urządzeń fizycznych. Zestaw dostępnych parametrów w takich żądaniach zależy całkowicie od konkretnej implementacji HAL.
- Od Androida 10 interfejs HAL może zmniejszyć liczbę aparatów, które aplikacja może otworzyć bezpośrednio, przez nieopublikowanie niektórych lub wszystkich identyfikatorów PHYSICAL_ID w
getCameraIdList
. WywołaniegetPhysicalCameraCharacteristics
musi zwrócić właściwości fizycznej kamery.
Weryfikacja
Urządzenia z wieloma kamerami logicznymi muszą przejść test CTS kamery tak jak inne zwykłe kamery.
Przypadki testowe przeznaczone dla tego typu urządzeń znajdziesz w module LogicalCameraDeviceTest
.
Te 3 testy ITS są przeznaczone do systemów z wieloma kamerami, aby ułatwić prawidłowe łączenie obrazów:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
Testy sceny 1 i 4 są przeprowadzane za pomocą platformy testowej ITS-in-a-box. Test test_multi_camera_match
sprawdza, czy jasność środka obrazu jest taka sama, gdy obie kamery są włączone. Test test_multi_camera_alignment
sprawdza, czy parametry odstępów, orientacji i zniekształceń kamery są prawidłowo załadowane. Jeśli system z wieloma aparatami obejmuje aparat szerokokątny (>90o), wymagana jest wersja rev2 urządzenia ITS.
Sensor_fusion
to drugi testowy sprzęt, który umożliwia powtarzanie określonych ruchów telefonu i sprawdza, czy sygnały zegarów żyroskopu i czujnika obrazu są zgodne oraz czy klatki z wielu kamer są zsynchronizowane.
Wszystkie pudełka są dostępne w firmie AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) i MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Dodatkowo pudełko ITS rev1 można kupić w witrynie West-Mark (www.west-mark.com, dgoodman@west-mark.com).
Sprawdzone metody
Aby w pełni korzystać z funkcji obsługiwanych przez wiele aparatów, zachowując przy tym zgodność aplikacji, stosuj te sprawdzone metody podczas wdrażania logicznego urządzenia z wieloma kamerami:
- (Android 10 lub nowszy) Ukryj fizyczne kamery pomocnicze
getCameraIdList
. Zmniejsza to liczbę aparatów, które mogą być otwierane bezpośrednio przez aplikacje, co eliminuje potrzebę stosowania przez aplikacje złożonej logiki wyboru aparatu. - (Android 11 lub nowszy) W przypadku logicznego urządzenia z wieloma kamerami obsługującego zoom optyczny zastosuj interfejs API
ANDROID_CONTROL_ZOOM_RATIO
i użyj go tylko do kadrowania w sposób uwzględniający współczynnik proporcji.ANDROID_SCALER_CROP_REGION
ANDROID_CONTROL_ZOOM_RATIO
umożliwia pomniejszanie i utrzymanie większej precyzji. W takim przypadku HAL musi dostosować system współrzędnychANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
iANDROID_STATISTICS_FACE_LANDMARKS
, aby traktować pole widzenia po powiększeniu jako aktywną tablicę czujnika. Więcej informacji o tym, jakANDROID_SCALER_CROP_REGION
współpracuje zANDROID_CONTROL_ZOOM_RATIO
, znajdziesz wcamera3_crop_reprocess#cropping
. - W przypadku urządzeń z wieloma kamerami i fizycznymi kamerami o różnych możliwościach upewnij się, że urządzenie reklamuje obsługę określonej wartości lub zakresu dla danego elementu sterującego tylko wtedy, gdy cały zakres zoomu obsługuje tę wartość lub zakres. Jeśli na przykład aparat logiczny składa się z aparatu ultraszerokokątnego, szerokokątnego i teleobiektywu, wykonaj te czynności:
- Jeśli rozmiary aktywnych matryc fizycznych kamer są różne, HAL kamery musi przeprowadzić mapowanie z aktywnej matrycy fizycznej kamery na aktywną matrycę logicznej kamery dla
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
, iANDROID_STATISTICS_FACE_LANDMARKS
, tak aby z perspektywy aplikacji system współrzędności był rozmiarem aktywnej matrycy logicznej kamery. - Jeśli aparaty szerokokątny i teleobiektyw obsługują autofokus, ale aparat ultraszerokokątny ma stałą ostrość, sprawdź, czy logiczny aparat reklamuje obsługę autofokusu. HAL musi symulować maszynę stanu autofokusu dla aparatu ultraszerokokątnego, aby po zbliżeniu w aparacie do obiektywu ultraszerokokątnego aplikacja nie była świadoma, że fizyczny aparat ma stałą ostrość, a maszyny stanu autofokusu w przypadku obsługiwanych trybów autofokusu działają zgodnie z oczekiwaniami.
- Jeśli kamery szerokokątna i teleobiektywowa obsługują rozdzielczość 4K przy 60 fps, a kamera ultraszerokokątna tylko 4K przy 30 fps lub 1080p przy 60 fps, ale nie 4K przy 60 fps, sprawdź, czy kamera logiczna nie wyświetla rozdzielczości 4K przy 60 fps w obsługiwanych konfiguracjach strumienia. Gwarantuje to integralność logicznych możliwości aparatu, dzięki czemu aplikacja nie napotka problemu z nieosiągnięciem rozdzielczości 4K przy 60 fps przy wartości
ANDROID_CONTROL_ZOOM_RATIO
mniejszej niż 1.
- Jeśli rozmiary aktywnych matryc fizycznych kamer są różne, HAL kamery musi przeprowadzić mapowanie z aktywnej matrycy fizycznej kamery na aktywną matrycę logicznej kamery dla
- Począwszy od Androida 10, obsługa kombinacji strumieni, które obejmują strumienie fizyczne, nie wymaga już logicznej kamery wielokamerowej.
Jeśli HAL obsługuje kombinację strumieni fizycznych:
- (Android 11 lub nowszy) Aby lepiej obsługiwać różne przypadki użycia, takie jak głębia obrazu w sterowaniu stereo lub śledzenie ruchu, ustaw pole widzenia na tak duże, jak to można osiągnąć przez sprzęt. Jeśli jednak strumień fizyczny i logiczny pochodzą z tej samej kamery fizycznej, ograniczenia sprzętowe mogą spowodować, że pole widzenia strumienia fizycznego będzie takie samo jak strumienia logicznego.
- Aby rozwiązać problem z obciążeniem pamięci spowodowanym przez wiele strumieni fizycznych, upewnij się, że aplikacje używają
discardFreeBuffers
do oddzielenia wolnych buforów (buforów zwolnionych przez konsumenta, ale jeszcze nie usuniętych z kolejki przez producenta), jeśli strumień fizyczny ma pozostać nieaktywny przez pewien czas. - Jeśli strumienie z różnych fizycznych kamer nie są zwykle dołączane do tego samego żądania, upewnij się, że aplikacje używają
surface group
, aby jedna kolejka buforów była używana do obsługi 2 interfejsów aplikacji, co zmniejsza zużycie pamięci.