5.22. תיקון עדשה ופרספקטיבה

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

5.22.1. עיוות עדשה רדיאלי

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

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

img.lens_corr(strength=1.8)

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

שני פרמטרי הצד בדרך כלל בסדר בערכי ברירת המחדל שלהם. zoom (ברירת מחדל 1.0) משנה את קנה המידה של הפלט – ערך גדול מאחד חותך החוצה כדי לפצות על האופן שבו תיקון עדשה דוחף את הפינות הרחק יותר החוצה; ערכים קטנים יותר משאירים יותר מהסצנה המתוקנת נראית לעין במחיר של הכללת פיקסלים ריקים בקצוות התמונה. x_corr ו-y_corr מזיזים את מרכז התיקון הרחק ממרכז הגאומטרי של התמונה, מה שמועיל כאשר העדשה אינה ממורכזת אופטית מעל החיישן (מקרה לא שכיח אך כדאי לדעת עליו).

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

5.22.2. תיקון סיבוב תלת-ממדי

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

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

rotation_corr() מריצה את התיקון הזה:

img.rotation_corr(x_rotation=10.0, y_rotation=0.0, z_rotation=0.0)

שלושת פרמטרי הסיבוב הם במעלות ומתארים סיבובים סביב צירי x, y, ו-z של מצלמה וירטואלית הממורכזת על התמונה. x_rotation מטה את המצלמה מעלה או מטה (התיקון הטבעי לצילום של קיר מגובה הקרקע); y_rotation מסובב את המצלמה שמאלה או ימינה; z_rotation מסובב את המצלמה סביב הציר האופטי שלה (התיקון הטבעי להרכבה לא-ישרה).

x_translation ו-y_translation מזיזים את המצלמה הווירטואלית לרוחב בלי לסובב אותה. zoom (ברירת מחדל 1.0) משנה את קנה המידה של הפלט. fov (ברירת מחדל 60.0) מתאר את שדה הראייה האנכי של המצלמה, ומשמש לחישוב ההיטל – הערך צריך להתאים לעדשה האמיתית כדי לשמור על עקביות הגאומטריה.

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

5.22.3. יישור מלבן ידוע

הצורה השימושית ביותר של rotation_corr() היא מילת המפתח corners=, שמקבלת רשימה של ארבע תכ“ים (tuples) מסוג (x, y) המתארים את הפינות של מלבן ידוע בתמונת הקלט. המתודה מחשבת איזה סיבוב תלת-ממדי היה ממפה מלבן אמיתי לאותן ארבע נקודות מסוימות, מחילה את ה-הפוך של אותו סיבוב על כל התמונה, ומחזירה תוצאה שבה המלבן הידוע מלבני שוב:

plate_corners = [(45, 80), (300, 60), (310, 180), (40, 200)]
img.rotation_corr(corners=plate_corners)

השימוש הקלאסי הוא בדיוק מה שהשם מרמז: לוחית רישוי (או כל מאפיין מלבני אחר) המצולמת מזווית אלכסונית. שלב במעלה הזרם מזהה את הלוחית ומדווח על ארבעת מיקומי הפינות שלה בתמונה הנלכדת; העברת אותן פינות אל rotation_corr() מפיקה תמונה שבה הלוחית יושבת כמלבן אמיתי, מוכנה לכל שלב של זיהוי תווים או התאמת תבנית שבא לאחר מכן.

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