תמיכה בריבוי מצלמות

אנדרואיד 9 הציגה תמיכת API עבור התקני ריבוי מצלמות באמצעות התקן מצלמה לוגי חדש המורכב משני או יותר התקני מצלמה פיזיים המצביעים לאותו כיוון. מכשיר המצלמה הלוגית נחשף כ-CameraDevice/CaptureSession יחיד לאפליקציה המאפשרת אינטראקציה עם תכונות מרובות מצלמות המשולבות ב-HAL. אפליקציות יכולות לגשת ולשלוט בזרמים הבסיסיים של המצלמה הפיזית, מטא נתונים ופקדים.

תמיכה בריבוי מצלמות

איור 1 . תמיכה בריבוי מצלמות

בתרשים זה, מזהי מצלמה שונים מקודדים בצבע. האפליקציה יכולה להזרים מאגרים גולמיים מכל מצלמה פיזית בו-זמנית. אפשר גם להגדיר פקדים נפרדים ולקבל מטא נתונים נפרדים ממצלמות פיזיות שונות.

דוגמאות ומקורות

יש לפרסם התקני ריבוי מצלמות עם יכולת ריבוי מצלמות לוגית .

לקוחות מצלמה יכולים לשאול את מזהה המצלמה של המכשירים הפיזיים שמהם מורכבת מצלמה לוגית מסוימת על ידי קריאה ל- getPhysicalCameraIds() . המזהים המוחזרים כחלק מהתוצאה משמשים לאחר מכן לשליטה במכשירים פיזיים בנפרד באמצעות setPhysicalCameraId() . ניתן לשאול את התוצאות מבקשות בודדות כאלה מהתוצאה המלאה על ידי הפעלת getPhysicalCameraResults() .

בקשות מצלמה פיזיות בודדות עשויות לתמוך רק בתת-קבוצה מוגבלת של פרמטרים. כדי לקבל רשימה של הפרמטרים הנתמכים, מפתחים יכולים לקרוא ל- getAvailablePhysicalCameraRequestKeys() .

זרמי מצלמה פיזיים נתמכים רק עבור בקשות ללא עיבוד מחדש ורק עבור חיישני מונוכרום ו-bayer.

יישום

רשימת תמיכה

כדי להוסיף התקני ריבוי מצלמות לוגיים בצד HAL:

עבור מכשירים המריצים אנדרואיד 9, מכשירי מצלמה חייבים לתמוך בהחלפת זרם YUV/RAW לוגי אחד בזרמים פיזיים באותו גודל (לא חל על זרמי RAW) ובאותו פורמט משתי מצלמות פיזיות. זה לא חל על מכשירים עם אנדרואיד 10.

עבור מכשירים עם אנדרואיד 10 שבהם גרסת מכשיר ה-HAL של המצלמה היא 3.5 ומעלה, מכשיר המצלמה חייב לתמוך isStreamCombinationSupported עבור אפליקציות כדי לשאול אם שילוב זרמים מסוים המכיל זרמים פיזיים נתמך.

מפת תצורת זרם

עבור מצלמה לוגית, שילובי הזרם החובה עבור התקן המצלמה ברמת חומרה מסוימת זהים למה שנדרש ב- CameraDevice.createCaptureSession . כל הזרמים במפת תצורת הזרמים חייבים להיות זרמים לוגיים.

עבור מכשיר מצלמה לוגית התומך ביכולת RAW עם מצלמות משנה פיזיות בגדלים שונים, אם אפליקציה מגדירה זרם RAW לוגי, אסור להתקן המצלמה הלוגית לעבור למצלמות משנה פיזיות בגדלים שונים של חיישנים. זה מבטיח שיישומי לכידת RAW קיימים לא יישברו.

כדי לנצל את הזום האופטי המיושם ב-HAL על ידי מעבר בין מצלמות משנה פיזיות במהלך לכידת RAW, אפליקציות חייבות להגדיר זרמי מצלמות משנה פיזיות במקום זרם RAW לוגי.

שילוב זרם מובטח

הן המצלמה הלוגית והן המצלמות הפיזיות הבסיסיות שלה חייבות להבטיח את שילובי הזרם החובה הנדרשים לרמות המכשיר שלהם.

מכשיר מצלמה לוגי צריך לפעול באותו אופן כמו התקן מצלמה פיזית בהתבסס על רמת החומרה והיכולות שלו. מומלץ שסט התכונות שלו יהיה ערכת על של מצלמות פיזיות בודדות.

במכשירים שבהם פועל אנדרואיד 9, עבור כל שילוב זרם מובטח, המצלמה הלוגית חייבת לתמוך ב:

  • החלפת זרם YUV_420_888 לוגי אחד או גולמי בשני זרמים פיזיים באותו גודל ופורמט, כל אחד ממצלמה פיזית נפרדת, בהתחשב בכך שהגודל והפורמט נתמכים על ידי המצלמות הפיזיות.

  • הוספת שני זרמים גולמיים, אחד מכל מצלמה פיזית, אם המצלמה הלוגית לא מפרסמת יכולת RAW, אבל המצלמות הפיזיות הבסיסיות כן. זה קורה בדרך כלל כאשר למצלמות הפיזיות יש גדלי חיישן שונים.

  • שימוש בזרמים פיזיים במקום זרם לוגי באותו גודל ופורמט. זה לא חייב להאט את קצב הפריימים של הלכידה כאשר משך הפריימים המינימלי של הזרמים הפיזיים והלוגיים זהים.

שיקולי ביצועים וכוח

  • ביצועים:

    • הגדרה והזרמת זרמים פיזיים עשויים להאט את קצב הלכידה של המצלמה הלוגית עקב אילוצי משאבים.
    • החלת הגדרות מצלמה פיזיות עשויה להאט את קצב הצילום אם המצלמות הבסיסיות יוכנסו לקצבי פריימים שונים.
  • כּוֹחַ:

    • אופטימיזציית ההספק של HAL ממשיכה לעבוד במקרה ברירת המחדל.
    • הגדרה או בקשה של זרמים פיזיים עשויים לעקוף את אופטימיזציית ההספק הפנימי של HAL ולגרום לצריכת חשמל רבה יותר.

התאמה אישית

אתה יכול להתאים אישית את יישום המכשיר שלך בדרכים הבאות.

  • הפלט הממוזג של התקן המצלמה הלוגית תלוי לחלוטין ביישום HAL. ההחלטה על האופן שבו נגזרים זרמים לוגיים מותכים מהמצלמות הפיזיות היא שקופה ליישום ולמסגרת מצלמת אנדרואיד.
  • ניתן לתמוך באופן אופציונלי בבקשות ותוצאות פיזיות בודדות. קבוצת הפרמטרים הזמינים בבקשות כאלה תלויה לחלוטין גם ביישום ה-HAL הספציפי.
  • מ-Android 10, ה-HAL יכול להפחית את מספר המצלמות שניתן לפתוח ישירות על ידי אפליקציה על ידי בחירה שלא לפרסם חלק או את כל ה-PHYSICAL_IDs ב- getCameraIdList . הקריאה getPhysicalCameraCharacteristics חייבת להחזיר את המאפיינים של המצלמה הפיזית.

מַתַן תוֹקֵף

התקני ריבוי מצלמות לוגיים חייבים לעבור CTS של מצלמה כמו כל מצלמה רגילה אחרת. ניתן למצוא את מקרי הבדיקה המכוונים לסוג זה של מכשיר במודול LogicalCameraDeviceTest .

שלושת מבחני ITS אלה מכוונים למערכות מרובות מצלמות כדי להקל על היתוך נכון של תמונות:

בדיקות סצנה 1 וסצנה 4 פועלות עם מתקן הבדיקה ITS-in-a-box . מבחן test_multi_camera_match טוען שהבהירות של מרכז התמונות תואמת כאשר שתי המצלמות מופעלות. מבחן test_multi_camera_alignment קובע שמרווחי מצלמה, כיוונים ופרמטרים של עיוות נטענים כראוי. אם מערכת מרובת המצלמות כוללת מצלמת FoV רחבה (>90o), נדרשת גרסת rev2 של תיבת ITS.

Sensor_fusion הוא מתקן בדיקה שני המאפשר תנועות טלפון חוזרות ונשנות וטוען כי חותמות הזמן של הגירוסקופ וחיישן התמונה תואמות ושהמסגרות מרובות המצלמה מסונכרנות.

כל הקופסאות זמינות דרך AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) ו-MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). בנוסף, ניתן לרכוש את הקופסה rev1 ITS דרך West-Mark ( www.west-mark.com , dgoodman@west-mark.com).

שיטות עבודה מומלצות

כדי לנצל באופן מלא את התכונות המופעלות על ידי ריבוי מצלמה תוך שמירה על תאימות אפליקציות, פעל לפי השיטות המומלצות הבאות בעת יישום התקן מרובה מצלמה לוגי:

  • (אנדרואיד 10 ומעלה) הסתר מצלמות משנה פיזיות מ- getCameraIdList . זה מקטין את מספר המצלמות שניתן לפתוח ישירות על ידי אפליקציות, ומבטל את הצורך שלאפליקציות בעלות היגיון מורכב של בחירת מצלמה.
  • (אנדרואיד 11 ומעלה) עבור התקן מרובה מצלמות לוגי התומך בזום אופטי, הטמע את ANDROID_CONTROL_ZOOM_RATIO API, והשתמש ANDROID_SCALER_CROP_REGION לחיתוך יחס רוחב-גובה בלבד. ANDROID_CONTROL_ZOOM_RATIO מאפשר למכשיר להתרחק ולשמור על דיוק טוב יותר. במקרה זה, ה-HAL חייב להתאים את מערכת הקואורדינטות של ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROID_STATISTICS_FACE_RECTANGLES , ל-3 ANDROID_STATISTICS_FACE_LANDMARKS שדה הראייה כמערך הפעיל של החיישן. למידע נוסף על אופן הפעולה של ANDROID_SCALER_CROP_REGION עם ANDROID_CONTROL_ZOOM_RATIO , ראה camera3_crop_reprocess#cropping .
  • עבור התקני ריבוי מצלמות עם מצלמות פיזיות בעלות יכולות שונות, ודא שהמכשיר מפרסם תמיכה בערך או טווח מסוים עבור פקד רק אם כל טווח הזום תומך בערך או בטווח. לדוגמה, אם המצלמה הלוגית מורכבת ממצלמה רחבה במיוחד, רחבה ומצלמת טלפוטו, בצע את הפעולות הבאות:
    • אם גדלי המערך הפעיל של המצלמות הפיזיות שונות, המצלמה HAL חייבת לבצע את המיפוי מהמערכים הפעילים של המצלמות הפיזיות למערך הפעיל של המצלמות הלוגיות עבור ANDROID_SCALER_CROP_REGION , ANDROID_CONTROL_AE_REGIONS , ANDROID_CONTROL_AWB_REGIONS , ANDROID_CONTROL_AF_REGIONS , ANDROIDGIONS , ANDROID_STATISTICS_FACE_RECTANGLES , ו- ANDROID_STATISTICS_FACE_LANDMARKS כך שמהאפליקציה של פרספקטיבה, מערכת הקואורדינטות היא גודל המערך הפעיל של המצלמה הלוגית.
    • אם המצלמות הרחבות והטלפוטו תומכות בפוקוס אוטומטי, אך המצלמה האולטרה-רחבה היא בפוקוס קבוע, ודא שהמצלמה הלוגית מפרסמת תמיכה בפוקוס אוטומטי. ה-HAL חייב לדמות מכונת מצב פוקוס אוטומטי עבור המצלמה האולטרה-רחבה כך שכאשר האפליקציה מתרחקת לעדשה האולטרה-רחבה, העובדה שהמצלמה הפיזית הבסיסית היא מיקוד קבוע היא שקופה לאפליקציה, ומכונות מצב הפוקוס האוטומטי עבור מצבי ה-AF הנתמכים לעבוד כמצופה.
    • אם המצלמות הרחבות והטלפוטו תומכות ב-4K @ 60 fps, והמצלמה האולטרה-רחבה תומכת רק ב-4K @ 30 fps, או 1080p @ 60 fps, אך לא 4K @ 60 fps, ודא שהמצלמה הלוגית לא מפרסמת 4k @ 60 fps ב תצורות הזרם הנתמכות שלו. זה מבטיח את שלמות יכולות המצלמה הלוגית, ומבטיח שהאפליקציה לא תתקל בבעיה של אי השגת 4k @ 60 פריימים לשנייה בערך ANDROID_CONTROL_ZOOM_RATIO של פחות מ-1.
  • החל מאנדרואיד 10, לא נדרשת מצלמה מרובה לוגית כדי לתמוך בשילובי זרמים הכוללים זרמים פיזיים. אם ה-HAL תומך בשילוב עם זרמים פיזיים:
    • (אנדרואיד 11 ומעלה) כדי להתמודד טוב יותר עם מקרי שימוש כגון עומק מסטריאו ומעקב אחר תנועה, הפוך את שדה הראייה של פלטי הזרם הפיזי לגדול ככל שניתן להשיג על ידי החומרה. עם זאת, אם זרם פיזי וזרם לוגי מקורם מאותה מצלמה פיזית, מגבלות חומרה עלולות לאלץ את שדה הראייה של הזרם הפיזי להיות זהה לזרם הלוגי.
    • כדי לטפל בלחץ הזיכרון שנגרם על ידי זרמים פיזיים מרובים, ודא שאפליקציות משתמשות discardFreeBuffers כדי להקצות את המאגרים החינמיים (מאגרים ששוחררו על ידי הצרכן, אך עדיין לא הועמדו בתור על ידי היצרן) אם זרם פיזי צפוי להיות פעיל למשך תקופה של זמן.
    • אם זרמים פיזיים ממצלמות פיזיות שונות בדרך כלל אינם מחוברים לאותה בקשה, ודא שאפליקציות משתמשות surface group כך שתור חיץ אחד ישמש לגיבוי של שני משטחים הפונים לאפליקציה, מה שמפחית את צריכת הזיכרון.