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żna 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.
Klienci kamery mogą wysłać zapytanie o identyfikator kamery fizycznej, z której korzysta dana logiczna kamera, wywołując funkcję getPhysicalCameraIds()
.
Identyfikatory zwrócone w ramach wyniku są następnie używane do sterowania poszczególnymi 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 uzyskać listę obsługiwanych parametrów, deweloperzy mogą wywołać funkcję getAvailablePhysicalCameraRequestKeys()
.
Strumienie z fizycznych kamer są obsługiwane tylko w przypadku żądań bez przetwarzania i tylko w przypadku czujników monochromatycznych i Bayera.
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ą również dostępne dla aplikacji. - Wypełnij statyczne pole metadanych
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
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
. Ustaw statyczne pole metadanych
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
na:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: w przypadku czujników w trybie głównym nie ma synchronizacji przysłony ani 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ń przechwytywania, a następnie dołącz do nich odpowiedniephysicalCameraMetadata
.W przypadku wersji interfejsu Camera HAL 3.5 (wprowadzonej w Androidzie 10) lub nowszych wypełnij klucz wyników
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 strumienia 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 przechwytywania w formacie RAW nie ulegną uszkodzeniu.
Aby korzystać z zoomu optycznego implementowanego przez HAL przez przełączanie się między fizycznymi podkamerami podczas rejestrowania w formacie RAW, aplikacje muszą skonfigurować strumienie z fizycznych podkamer zamiast logicznego strumienia RAW.
Gwarantowana kombinacja strumieni
Zarówno kamera logiczna, jak i podstawowe kamery fizyczne muszą gwarantować obowiązkowe kombinacje strumieni wymagane na poziomie urządzenia.
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 nieskompresowanego 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 obsługuje formatu RAW, ale fizyczne kamery tak. 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:
- Złożony sygnał z logicznego urządzenia do obsługi kamery zależy całkowicie 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ę kamer, które aplikacja może otworzyć bezpośrednio, przez niereklamowanie 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 wielu kamer zawiera kamerę o szerokim polu widzenia (>90°), wymagana jest wersja 2 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 w wersji 1 można kupić w firmie 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 na
getCameraIdList
. Zmniejsza to liczbę aparatów, które mogą być otwierane bezpośrednio przez aplikacje, co eliminuje potrzebę stosowania przez aplikacje skomplikowanej 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 powiększenie obrazu i utrzymanie większej dokładności. W tym 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 przybliżeniu jako aktywny układ czujników. Więcej informacji o tym, jakANDROID_SCALER_CROP_REGION
współdziała zANDROID_CONTROL_ZOOM_RATIO
, znajdziesz w artykulecamera3_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ę z fizycznymi strumieniami:
- (Android 11 lub nowszy) Aby lepiej obsługiwać przypadki użycia, takie jak głębia ze stereoskopii i śledzenie ruchu, zwiększ pole widzenia fizycznych wyjść strumienia do maksymalnego możliwego poziomu dla danego sprzętu. 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 pole widzenia 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 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 dwóch powierzchni aplikacji, co zmniejsza zużycie pamięci.