ב-Android 9 נוספה תמיכה ב-API לאפליקציות מרובות מצלמות באמצעות מצלמה לוגית חדשה שמורכבת משני ממדים פיזיים או יותר ומצלמות שמצביעות לאותו כיוון. מכשיר המצלמה הלוגי נחשפו כ- CameraDevice/CaptureSession יחיד לאפליקציה, וכך מאפשרים אינטראקציה עם תכונות מרובות מצלמות משולבות HAL. אפליקציות יכולות אופציונליות גישה ושליטה בסטרימינג הפיזיות של המצלמה, במטא-נתונים ובאמצעי הבקרה.
איור 1. תמיכה בכמה מצלמות
בתרשים הזה, מזהי מצלמות שונים מקודדים לפי צבעים. האפליקציה יכולה סטרימינג של אגירת נתונים גולמיים מכל מצלמה פיזית בו-זמנית. כמו כן להגדיר פקדים נפרדים ולקבל מטא-נתונים נפרדים ממצלמות פיזיות.
דוגמאות ומקורות
יש לפרסם מכשירים עם כמה מצלמות באמצעות יכולת לוגית לכמה מצלמות.
לקוחות המצלמה יכולים לשלוח שאילתה על מזהה המצלמה של המכשירים הפיזיים הספציפיים
היא עשויה ליצור ממצלמה לוגית
getPhysicalCameraIds()
המזהים שמוחזרים כחלק מהתוצאה משמשים לשליטה במכשירים פיזיים.
בנפרד,
setPhysicalCameraId()
אפשר להריץ שאילתות על התוצאות של בקשות ספציפיות כאלה
באמצעות הפעלה
getPhysicalCameraResults()
בקשות נפרדות למצלמה פיזית עשויות לתמוך רק בחלק מוגבל של
. מפתחים יכולים להתקשר כדי לקבל רשימה של הפרמטרים הנתמכים
getAvailablePhysicalCameraRequestKeys()
יש תמיכה בשידורי מצלמות פיזיים רק בבקשות שלא מתבצעות עיבוד מחדש רק לחיישנים מונוכרומטיים או לחיישני באייר.
הטמעה
רשימת משימות לתמיכה
כדי להוסיף מכשירים לוגיים עם כמה מצלמות בצד עם ממשק HAL:
- הוספה של
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
לכל מכשיר מצלמה בחיבור לוגי שמגובה על ידי שני חיישנים פיזיים או יותר. מצלמות שגם חשופות לאפליקציה. - אכלוס את הסטטי
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
שדה מטא-נתונים עם רשימה של מזהי מצלמות פיזיים. - אכלוס את המטא-נתונים הסטטיים שקשורים לעמוקים שנדרשים כדי לתאם בין
סטרימינג ממצלמה פיזית פיקסלים:
ANDROID_LENS_POSE_ROTATION
ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. מגדירים את הערך הסטטי
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
שדה מטא נתונים אל:ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: לחיישנים במצב ראשי, ללא סנכרון תריס/חשיפה של חומרה.ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: לחיישנים במצב משני, סנכרון תריס/חשיפה של החומרה.
אכלוס
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
עם רשימת פרמטרים נתמכים עבור מצלמות פיזיות נפרדות. יכולה להיות ריקה אם המכשיר הלוגי לא תומך בבקשות ספציפיות.אם יש תמיכה בבקשות ספציפיות, מטפלים בהן ומחילים אותן
physicalCameraSettings
שיכולים להגיע כחלק מבקשות התיעוד ולצרף את האנשיםphysicalCameraMetadata
בהתאם.לגרסאות 3.5 של מכשיר עם תכונת המצלמה עם HAL (החל מ-Android 10) ואילך, צריך לאכלס את
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
התוצאה באמצעות המזהה של המצלמה הפיזית הפעילה הנוכחית ברקע "מצלמה לוגית".
במכשירים עם Android 9, נדרשת מצלמה תמיכה בהחלפת זרם YUV/RAW לוגי אחד בשידורים פיזיים של בגודל זהה (לא רלוונטי לשידורים בפורמט RAW) ובאותו פורמט משני מכשירים פיזיים מצלמות. האפשרות הזו לא רלוונטית למכשירים עם Android 10.
במכשירים שבהם פועלת מערכת Android 10
גרסת מכשיר ה-HAL של המצלמה היא
3.5
ואילך, התקן המצלמה צריך לתמוך
isStreamCombinationSupported
לאפליקציות לשאול אם שילוב מסוים של מקורות נתונים מכיל
שידורים פיזיים נתמכים.
מפת ההגדרה של השידור
למצלמה לוגית, שילובי החובה של הסטרימינג למכשיר המצלמה של
רמת חומרה מסוימת זהה לנדרש
CameraDevice.createCaptureSession
כל השידורים במפת הגדרת השידור חייבים להיות זרמים לוגיים.
למכשיר מצלמה לוגי שתומך ביכולת RAW עם מצלמות משנה פיזיות בגדלים שונים, אם אפליקציה מגדירה זרם RAW לוגי, שהמצלמה הלוגית לא תוכל לעבור למצלמות משנה פיזיות עם גודל החיישנים. כך תבטיחו שאפליקציות קיימות לצילום תמונות בפורמט RAW לא יישקלו.
כדי לנצל את היתרונות של זום אופטי בהטמעת HAL על ידי מעבר במצלמות משנה פיזיות במהלך צילום RAW, האפליקציות חייבות להגדיר סטרימינג פיזי ממצלמות משנה במקום זרם RAW לוגי.
שילוב מובטח של שידורים
גם המצלמה הלוגית וגם המצלמות הפיזיות שבבסיסה חייבות להבטיח שילובים נדרשים של מקורות נתונים שנדרשים ברמות המכשיר.
מתקן מצלמה בחיבור לוגי צריך לפעול בדיוק כמו מצלמה פיזית. בהתאם לרמת החומרה וליכולות שלו. מומלץ קבוצת פיצ'רים זו היא קבוצת-על של מצלמות פיזיות בודדות.
במכשירים עם Android 9, לכל אחד מהם שילוב של סטרימינג, המצלמה הלוגית חייבת לתמוך ב:
החלפת YUV_420_888 לוגי אחד או זרם גולמי אחד עם שני שידורים פיזיים של ואותו גודל ופורמט, כל אחד מהם ממצלמה פיזית נפרדת, הגודל והפורמט שנתמכים על ידי המצלמות הפיזיות.
הוספת שני שידורים גולמיים, אחד מכל מצלמה פיזית, אם מצלמת הלוגי שלא מפרסמת יכולת RAW, אבל המצלמות הפיזיות כן כן מפרסמת אותן. לרוב זה קורה כשלמצלמות הפיזיות יש חיישנים בגדלים שונים.
שימוש בשידורים פיזיים במקום זרם לוגי באותו גודל הפורמט. אסור שזה יאט את קצב הפריימים של הצילום כאשר משך רינדור הפריים המינימלי של השידור הפיזי והלוגי זהה.
שיקולי ביצועים ועוצמה
ביצועים:
- הגדרה וסטרימינג של שידורים פיזיים עשויים להאט קצב הצילום של המצלמה הלוגית בגלל אילוצי משאבים.
- החלת הגדרות המצלמה הפיזית עלולה להאט את קצב הצילום אם המצלמות הבסיסיות משתלבות בקצב פריימים שונה.
הספק:
- אופטימיזציית החשמל של HAL ממשיכה לפעול בתרחיש ברירת המחדל.
- הגדרה או בקשה של שידורים פיזיים עשויים לבטל את ההטמעה הפנימית של HAL אופטימיזציה של צריכת חשמל וצריכת אנרגיה גבוהה יותר.
התאמה אישית
אתם יכולים להתאים אישית את הטמעת המכשיר בדרכים הבאות.
- הפלט הממוזג של מצלמת המצלמה הלוגית תלוי לחלוטין ב-HAL יישום בפועל. ההחלטה על האופן שבו נגזרים זרמים לוגיים משולבים המצלמות הפיזיות שקופות לאפליקציה ולמצלמת Android .
- אפשר לקבל תמיכה בבקשות פיזיות ובתוצאות פיזיות נפרדות. קבוצת הפרמטרים הזמינים בבקשות כאלה גם תלויה לחלוטין בהטמעה הספציפית של ה-HAL.
- החל מגרסה 10 של Android, תכונת HAL יכולה להפחית את מספר
מצלמות שאפליקציה מסוימת יכולה לפתוח ישירות באמצעות בחירה שלא
לפרסם את כל מזהי ה-PHYStrial_ID או חלק מהם
getCameraIdList
אנחנו מתקשרים אלgetPhysicalCameraCharacteristics
חייב להחזיר לאחר מכן את המאפיינים של המצלמה הפיזית.
אימות
מכשירים לוגיים עם כמה מצלמות חייבים לעבור את בדיקת ה-CTS של המצלמה, כמו כל מצלמה רגילה אחרת.
ניתן למצוא את מקרי הבדיקה שמטרגטים מכשיר מהסוג הזה
LogicalCameraDeviceTest
של מודל טרנספורמר.
שלוש הבדיקות האלה (ITS) מטרגטות מערכות מרובות מצלמות כדי לאפשר מיזוג של תמונות:
scene1/test_multi_camera_match.py
scene4/test_multi_camera_alignment.py
sensor_fusion/test_multi_camera_frame_sync.py
הבדיקות בסצנה 1 ובסצנה 4 פועלות עם
בדיקת ITS-in-a-box
מתקן הבדיקה של test_multi_camera_match
טוענת שרמת הבהירות של
מרכז התמונות תואם כששתי המצלמות מופעלות.
בדיקת test_multi_camera_alignment
טוענת שהריווח בין המצלמה, הכיוונים,
ופרמטרים של עיוות נטענים כמו שצריך. אם במערכת מרובת המצלמות
כולל מצלמת Wide FoV (>90o), נדרשת גרסת rev2 של תיבת ה-ITS.
Sensor_fusion
הוא מכשיר בדיקה שני שמאפשר שימוש בטלפון חוזר שנקבע מראש
וטוען שחותמות הזמן של הג'ירוסקופ ושל חיישן התמונה תואמות
הפריימים של כמה מצלמות מסונכרנים.
כל התיבות זמינות דרך AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) וגם MYWAY ייצור (www.myway.tw, sales@myway.tw). בנוסף, ניתן לרכוש את תיבת ה-ITS של Rev1 דרך West-Mark (www.west-mark.com, dgoodman@west-mark.com).
שיטות מומלצות
כדי לנצל באופן מלא את התכונות שמופעלות על ידי ריבוי מצלמות, תוך שמירה על תאימות של אפליקציה, צריך לפעול לפי השיטות המומלצות הבאות מכשיר עם כמה מצלמות:
- (Android 10 ואילך) הסתרת מצלמות משנה פיזיות של
getCameraIdList
הפעולה הזו מצמצמת את מספר המצלמות שאפשר לפתוח ישירות באמצעות כך שלא יהיה צורך להפעיל לוגיקה מורכבת של בחירת מצלמה. - (Android מגרסה 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
, וגםANDROID_STATISTICS_FACE_LANDMARKS
לטיפול בהמשך מרחק התצוגה בתור המערך הפעיל של החיישן. לקבלת מידע נוסף על האופן שבוANDROID_SCALER_CROP_REGION
פועל יחד עםANDROID_CONTROL_ZOOM_RATIO
, ראוcamera3_crop_reprocess#cropping
. - עבור מכשירים עם כמה מצלמות עם מצלמות פיזיות עם מצלמות
יכולות, יש לוודא שהמכשיר מפרסם תמיכה בערך מסוים
או טווח של פקד מסוים, רק אם כל טווח הזום תומך בערך
או טווח. לדוגמה, אם המצלמה הלוגית מורכבת ממצלמת Ultrawide,
במצלמת טלפוטו, לבצע את הפעולות הבאות:
- אם גודל המערך הפעיל של המצלמות הפיזיות שונה,
היא צריכה לבצע מיפוי מהמערכים הפעילים של המצלמות הפיזיות
המערך הפעיל של המצלמה הלוגית עבור
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
, וגםANDROID_STATISTICS_FACE_LANDMARKS
כך שמנקודת המבט של האפליקציה, מערכת הקואורדינטות היא גודל המערך הפעיל של המצלמה הלוגית. - אם מצלמת הטלפוטו ורחבה תומכות במיקוד אוטומטי, אבל טכנולוגיית Ultrawide המצלמה מוגדרת למיקוד קבוע, צריך לוודא שהמצלמה הלוגית מפרסמת מיקוד אוטומטי תמיכה. רכיב ה-HAL חייב לדמות מכונה למצב של מיקוד אוטומטי בטכנולוגיית Ultrawide כך שכשהאפליקציה מקטינה את התצוגה לעדשת Ultrawide, שהמצלמה הפיזית שבבסיסה מתמקדת בפוקוס קבוע שקוף לאפליקציה, והמכונות במצב מיקוד אוטומטי במצבי AF הנתמכים פועלים מה מצופה.
- אם המצלמות לרוחב ומצלמות הטלפוטו תומכות ב-4K @ 60fps,
מצלמת Ultrawide תומכת רק ב- 4K @ 30fps או ב-1080p ב- 60 fps, אבל
לא 4K @ 60fps, עליך לוודא שהמצלמה הלוגית לא מפרסמת איכות 4k @
60 fps בהגדרות הסטרימינג הנתמכות. כך ניתן להבטיח
תקינות היכולות של המצלמה הלוגית, כדי להבטיח שהאפליקציה לא
נתקלים בבעיה שאי אפשר להשיג 4k @ 60fps
ANDROID_CONTROL_ZOOM_RATIO
קטן מ-1.
- אם גודל המערך הפעיל של המצלמות הפיזיות שונה,
היא צריכה לבצע מיפוי מהמערכים הפעילים של המצלמות הפיזיות
המערך הפעיל של המצלמה הלוגית עבור
- בוהק מ-Android 10, מערכת לוגית מרובת מצלמות
אין צורך לתמוך בשילובים של שידורים שכוללים שידורים חיים.
אם תקן HAL תומך בשילוב עם שידורים פיזיים:
- (Android 11 ואילך) לטיפול טוב יותר בשימוש כגון העומק מסטריאו ומעקב אחר תנועה, יוצרים את שדה הראייה של פלטי הסטרימינג הפיזיות עד כמה שהחומרה יכולה לקבל. עם זאת, אם זרם פיזי וזרם לוגי מגיעים מאותו מקור מצלמה פיזית, מגבלות חומרה עשויות לאלץ את שדה הראייה של כדי שיהיה זהה לזרם הלוגי.
- כדי להתמודד עם לחץ הזיכרון שנוצר בגלל מספר שידורים פיזיים,
לוודא שהאפליקציות משתמשות ב-
discardFreeBuffers
כדי להקצות את מאגרי הנתונים הזמניים (חוצצים) שמשחררים על ידי הצרכן, אבל עדיין לא הוסרו על ידי המפיק) אם שידור פיזי צפוי להיות ללא פעילות במשך פרק זמן מסוים. - אם שידורים פיזיים ממצלמות פיזיות שונות בדרך כלל לא
מצורפים לאותה בקשה, צריך לוודא שהאפליקציות משתמשות ב-
surface group
כך שתור אחד של מאגר נתונים זמני ישמש לגיבוי שני משטחים הפונים לאפליקציות, והפחתת צריכת הזיכרון.