Obsługa wielu kamer

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ć.

Obsługa wielu kamer

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:

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łanie getPhysicalCameraCharacteristicsmusi 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:

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_RATIOumożliwia powiększenie obrazu i utrzymanie większej dokładności. W tym przypadku HAL musi dostosować system współrzędnych ANDROID_SCALER_CROP_REGION, ANDROID_CONTROL_AE_REGIONS, ANDROID_CONTROL_AWB_REGIONS, ANDROID_CONTROL_AF_REGIONS, ANDROID_STATISTICS_FACE_RECTANGLESANDROID_STATISTICS_FACE_LANDMARKS, aby traktować pole widzenia po przybliżeniu jako aktywny układ czujników. Więcej informacji o tym, jak ANDROID_SCALER_CROP_REGION współdziała z ANDROID_CONTROL_ZOOM_RATIO, znajdziesz w artykule camera3_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, i ANDROID_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ściANDROID_CONTROL_ZOOM_RATIO mniejszej niż 1.
  • 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.