זרמי פלט, חיתוך וזום

זרמי פלט

תת-מערכת המצלמה פועלת אך ורק על צינור מבוסס ANativeWindow עבור כל הרזולוציות ופורמטי הפלט. ניתן להגדיר מספר זרמים בו-זמנית כדי לשלוח פריים בודד למטרות רבות כגון ה-GPU, מקודד הווידאו, RenderScript או מאגרים גלויים לאפליקציה (RAW Bayer, מאגרי YUV מעובדים או מאגרים מקודדים ב-JPEG).

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

למידע נוסף על שילובי פלט הזרם המובטחים התלויים ברמת החומרה הנתמכת, ראה createCaptureSession() .

חיתוך

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

האזור מוגדר כמלבן (x, y, רוחב, גובה), כאשר (x, y) מתאר את הפינה השמאלית העליונה של המלבן. המלבן מוגדר על מערכת הקואורדינטות של מערך הפיקסלים הפעילים של החיישן, כאשר (0,0) הוא הפיקסל השמאלי העליון של מערך הפיקסלים הפעיל. לכן, הרוחב והגובה אינם יכולים להיות גדולים מהמידות המדווחות בשדה המידע הסטטי ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. הרוחב והגובה המינימליים המותרים מדווחים על ידי HAL דרך שדה המידע הסטטי ANDROID_SCALER_MAX_DIGITAL_ZOOM, המתאר את גורם הזום המרבי הנתמך. לכן, רוחב וגובה אזור היבול המינימליים הם:

  {width, height} =
   { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM),
     floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] /
       ANDROID_SCALER_MAX_DIGITAL_ZOOM) }

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

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

בכל המקרים, יבול הנחל חייב להיות מרוכז באזור היבול המלא, וכל זרם נחתך רק אופקית או אנכית ביחס לאזור היבול המלא, לעולם לא שניהם.

לדוגמה, אם מוגדרים שני זרמים, זרם 640x480 (היבט 4:3) וזרם 1280x720 (16:9 היבט), להלן מדגים את אזורי הפלט הצפויים עבור כל זרם עבור כמה אזורי יבול לדוגמה, על 3 היפותטי חיישן MP (2000 x 1500 פיקסלים).

אזור חיתוך: (500, 375, 1000, 750) (יחס רוחב-גובה של 4:3)
יבול זרם 640x480: (500, 375, 1000, 750) (שווה לאזור היבול)
חיתוך זרם של 1280x720: (500, 469, 1000, 562)

יבול-אזור-43-יחס

איור 1. יחס רוחב-גובה של 4:3

אזור חיתוך: (500, 375, 1333, 750) (יחס רוחב-גובה של 16:9)
חיתוך זרם בגודל 640x480: (666, 375, 1000, 750)
יבול זרם 1280x720: (500, 375, 1333, 750) (שווה לאזור היבול)

יבול-אזור-169-יחס

איור 2. יחס רוחב-גובה של 16:9

אזור חיתוך: (500, 375, 750, 750) (יחס רוחב-גובה של 1:1)
חיתוך זרם בגודל 640x480: (500, 469, 750, 562)
חיתוך זרם של 1280x720: (500, 543, 750, 414)

יבול-אזור-11-יחס

איור 3. יחס רוחב-גובה של 1:1

ודוגמה אחרונה, זרם יחס רוחב-גובה של 1024x1024 במקום זרם 480p:
אזור חיתוך: (500, 375, 1000, 750) (יחס רוחב-גובה של 4:3)
חיתוך זרם של 1024x1024: (625, 375, 750, 750)
חיתוך זרם של 1280x720: (500, 469, 1000, 562)

יבול-אזור-43-ריבוע-יחס

איור 4. יחס רוחב-גובה של 4:3, ריבוע

עיבוד מחדש

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

תקריב

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

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

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

  • התקרבות מעדשה רחבה לעדשת טלפוטו: יחס נקודה צפה מספק דיוק טוב יותר בהשוואה לערכי מספר שלמים של ANDROID_SCALER_CROP_REGION .
  • התרחקות מעדשה רחבה לעדשה רחבה במיוחד: ANDROID_CONTROL_ZOOM_RATIO תומך בהתרחקות (<1.0f) בעוד ש- ANDROID_SCALER_CROP_REGION לא.

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

יחס זום: 2.0; 1/4 משדה הראייה המקורי
אזור חיתוך: (0, 0, 2000, 1500) (יחס רוחב-גובה של 4:3)
יבול זרם 640x480: (0, 0, 2000, 1500) (שווה לאזור חיתוך)
חיתוך זרם של 1280x720: (0, 187, 2000, 1125)

zoom-ratio-2-crop-43

איור 5. זום 2.0, יחס רוחב-גובה של 4:3

יחס זום: 2.0; 1/4 משדה הראייה המקורי
אזור חיתוך: (0, 187, 2000, 1125) (יחס רוחב-גובה של 16:9)
יבול זרם בגודל 640x480: (250, 187, 1500, 1125) (ארגז עמודים)
יבול זרם 1280x720: (0, 187, 2000, 1125) (שווה לאזור היבול)

zoom-ratio-2-crop-169

איור 6. זום 2.0, יחס רוחב-גובה של 16:9

יחס זום: 0.5; פי 4 משדה הראייה המקורי (החלפה מעדשה רחבה לעדשה רחבה במיוחד)
אזור חיתוך: (250, 0, 1500, 1500) (יחס רוחב-גובה של 1:1)
חיתוך זרם בגודל 640x480: (250, 187, 1500, 1125) (ארגז מכתבים)
חיתוך זרם בגודל 1280x720: (250, 328, 1500, 844) (ארגז מכתבים)

images/zoomen-ratio-0.5-crop-11

איור 7. זום 0.5, יחס רוחב-גובה של 1:1

כפי שניתן לראות מהגרפים שלמעלה, מערכת הקואורדינטות של אזור החיתוך משתנה לשדה הראייה האפקטיבי לאחר זום, ומיוצגת על ידי המלבן בעל הממדים הבאים: ( 0 , 0 , activeArrayWith , activeArrayHeight ). אותו הדבר חל על אזורים ופצופים של AE/AWB/AF. שינוי מערכת קואורדינטות זה אינו חל על לכידת RAW ועל המטא נתונים הקשורים אליו כגון intrinsicCalibration ו- lensShadingMap .

באמצעות אותה דוגמה היפותטית לעיל, ובהנחה שזרם פלט מס' 1 (640x480) הוא זרם העינית, ניתן להשיג זום של 2.0x באחת משתי דרכים:

  • zoomRatio = 2.0 , scaler.cropRegion = (0, 0, 2000, 1500)
  • zoomRatio = 1.0 (ברירת מחדל), scaler.cropRegion = (500, 375, 1000, 750)

כדי שאפליקציה תגדיר את android.control.aeRegions כרבע השמאלי העליון של שדה הראייה של העינית, הגדר את android.control.aeRegions ל- (0, 0, 1000, 750) כאשר android.control.zoomRatio מוגדר ל 2.0 . לחלופין, האפליקציה יכולה להגדיר את android.control.aeRegions לאזור המקביל של (500, 375, 1000, 750) עבור android.control.zoomRatio של 1.0 .