תיאוריה נוספת
מטרות ראייה
מתכנני משחקי FRC לעתים קרובות ממקמים "מטרות ראייה" מחזירות אור בנקודות אסטרטגיות בשדה המשחק. מטרות ראייה אלו עשויות בדרך כלל מסרט מחזיר-אור. לאלמנטי ניקוד מרכזיים יש בדרך כלל מטרות ראייה שניתן להשתמש בהן לכיוון אוטומטי. להלן ניתן לראות שתי דוגמאות של מטרות ראייה ממשחקי FRC בשנים 2016 ו-2017.
למטרות הראייה מחזירות-האור יש תכונה שימושית מאוד: כאשר מאירים עליהן אור, הוא יוחזר ישירות למקור האור. זו הסיבה שללימלייט יש נורות LED ירוקות בהירות המקיפות את עדשת המצלמה שלה. על ידי הגדרת חשיפת המצלמה לרמה נמוכה מאוד תוך פליטת אור ירוק בהיר לכיוון המטרה, אנו יכולים לקבל תמונה שהיא ברובה שחורה עם מטרת ראייה ירוקה בהירה. זה הופך את משימת זיהוי המטרה לקלה יחסית.
כאן ניתן לראות דוגמה לתמונה אידיאלית. שימו לב כיצד כמעט כל הפרטים בתמונה נעלמים בגלל הגדרת החשיפה הנמוכה, אך הסרט מחזיר-האור בולט בבהירות.
סיפיות (Thresholding)
סיפיות היא המרכיב הקריטי הבא ברוב אלגוריתמי מעקב הראייה של FRC. זוהי הפעולה של לקיחת תמונה וזריקת כל הפיקסלים שאינם בטווח צבעים מסוים. התוצאה של סיפיות היא בדרך כלל תמונה חד-ממדית שבה פיקסל הוא "דלוק" או "כבוי". סיפיות עובדת היטב על תמונות שנלכדו באמצעות האסטרטגיה שתוארה לעיל (חשיפה נמוכה, תמונה כהה מאוד עם מטרת ראייה מוארת בבהירות).
לימלייט מבצעת סיפיות במרחב הצבעים HSV (גוון-רוויה-ערך). ייתכן שאתם רגילים לחשוב על צבעים במרחב הצבעים RGB (אדום-ירוק-כחול). HSV הוא רק דרך אחרת לייצג צבע, בדומה לאופן שבו ניתן להשתמש בקואורדינטות קרטזיות או קוטביות לתיאור מיקומים. הסיבה שאנו משתמשים במרחב הצבעים HSV היא שניתן להשתמש בגוון כדי לבחור בצורה מדויקת מאוד את הצבע הירוק שנורות ה-LED של לימלייט פולטות.
חשוב מאוד להתאים את הגדרות הסיפיות שלך כדי לסלק כמה שיותר מהתמונה. תקבלו את התוצאות הטובות ביותר אם תמטבו כל שלב בצינור הראייה שלכם לפני שתעברו לשלב הבא. התמונה הבאה מציגה את ההבדל בין סיפיות לא נכונה לסיפיות נכונה:
לפעמים דברים כמו תאורת תקרה או חלונות בזירה יכולים להיות קשים להסרה מהתמונה באמצעות סיפיות, מה שמביא אותנו לשלב הבא.
סינון קונטורים
לאחר הסיפיות, צינור הראייה של לימלייט מייצר סט של קונטורים לתמונה. קונטור הוא עקומה המקיפה קבוצה רציפה של פיקסלים. לפעמים דברים כמו תאורת תקרה, לוחות תוצאות בזירה, חלונות ודברים אחרים יכולים לעבור את שלב הסיפיות. כאן סינון הקונטורים הופך לשימושי. המטרה היא לסלק כל קונטור שאנחנו יודעים שאינו המטרה שאנו מעוניינים בה.
מסנן הקונטורים הראשון והקל ביותר הוא להתעלם מכל קונטור שקטן ממה שמטרת הראייה שלנו נראית ממרחק ה ניקוד שלנו. כל דבר קטן יותר מגודל זה הוא כנראה משהו רחוק יותר ויש להתעלם ממנו. זה נקרא סינון שטח.
למטרות הראייה של FRC יש לעתים קרובות תכונה גיאומטרית שניתן לנצל כדי לעזור לנו לסנן קונטורים. לדוגמה, אם למטרת הראייה יש יחס רוחב-גובה רחב, אנחנו יכולים לסנן כל קונטור שאינו רחב:
עם זאת, זכרו שהמצלמה שלכם עשויה להסתכל על המטרה מזווית מוזרה. זה יכול להשפיע באופן דרסטי על יחס הרוחב-גובה של הקונטור שלה. הקפידו לבדוק את ההגדרות שלכם ממגוון זוויות כדי להבטיח שאינכם מסננים בצורה אגרסיבית מדי ומתעלמים ממטרת הראייה!
מטרת התמונה הבאה מעניינת מאוד. זו אחת ממטרות הראייה המתוכננות בצורה הטובה ביותר ב-FRC (לדעתנו). לימלייט מחשבת אוטומטית ערך הנקרא מלאות של קונטור. מלאות היא היחס בין שטח הפיקסלים של הקונטור לשטח הקמור שלו. לצורה מסוימת זו יש מלאות נמוכה מאוד וכמעט אף פעם לא רואים תאורת תקרה, חלונות וכו' עם מלאות כה נמוכה. לכן ניתן לסנן ביעילות רבה את הקונטורים הלא רצויים אם מטרת הראייה שלכם נראית כמו זו.
ללימלייט יש אפשרויות רבות לסינון קונטורים. ניתן להשתמש באפשרויות אלה יחד עם מה שאתם יודעים על המאפיינים הגיאומטריים של מטרת הראייה המסוימת שאתם מנסים לעקוב אחריה.
כרגע, אם מספר קונטורים עוברים את אפשרויות הסינון שלכם, נבחר הקונטור הגדול ביותר. בנוסף, הצינור מעדיף "להינעל" על קונטורים באמצעות היסטרזיס. זוהי תכונה שעוזרת למנוע הבהוב בין מטרות דומות.
מפיקסלים לזוויות
התוצאה הסופית של צינור הראייה היא מיקום פיקסל של הקונטור הטוב ביותר בתמונה. עבור רוב המשחקים, אנחנו יכולים פשוט לכוון למרכז הקונטור. לפעמים שימושי גם לכוון למרכז העליון או לנקודה אחרת, אבל בעיקרון יש לנו קואורדינטת פיקסל לאן שאנחנו רוצים לכוון. כדי לחשב את הזוויות למטרה זו, עלינו להשתמש בטריגונומטריה.
ראשית אנו מניחים שיש לנו מצלמת "חור סיכה" מושלמת. בפועל זה יכול להיות רחוק מהאמת, אבל המצלמה של לימלייט קרובה מאוד לכך. (עדשת עין דג תהיה רחוקה מאוד מאידיאל זה כדוגמה נגדית.)
למצלמת לימלייט יש שדה ראייה אופקי של 54 מעלות ושדה ראייה אנכי של 41 מעלות. היא לוכדת תמונות ברזולוציה של 320x240. אנו מניחים שמרכז התמונה הוא הציר האופטי של המצלמה (כך שהזוויות x ו-y עבור מיקום זה הן 0,0). בהינתן ערכים ידועים אלה, אנו יכולים להשתמש בטריגונומטריה כדי לחשב את הזוויות עבור כל פיקסל בתמונה.
התרשים למטה מציג דוגמה לנקודת מטרה שעבורה אנו רוצים לחשב זוויות. קואורדינטות הפיקסל מתחילות בפינה השמאלית העליונה של התמונה והן חיוביות לימין ולמטה.
הצעד הראשון שלנו יהיה להמיר מקואורדינטות פיקסל לקואורדינטות דו-ממדיות מנורמלות כאשר 0,0 הוא מרכז התמונה ו-1.0:
(px, py) = קואורדינטות פיקסל, 0,0 היא הפינה השמאלית העליונה, חיובי למטה ולימין
(nx, ny) = קואורדינטות פיקסל מנורמלות, 0,0 הוא המרכז, חיובי לימין ולמעלה
nx = (1/160) * (px - 159.5)
ny = (1/120) * (119.5 - py)
לאחר מכן אנו מגדירים מישור צפייה דמיוני ומחשבים את גודלו. לפשטות, אנחנו יכולים לבחור למקם מישור זה 1.0 יחידה לפני מיקום המצלמה. הנה מבט מלמעלה על המצלמה. המטרה שלנו היא לחשב את רוחב וגובה מישור הצפייה כיוון שערכים אלה ישמשו לחישוב הזוויות מאוחר יותר:
בהינתן מרחק של 1.0 יחידה ושדה ראייה אופקי ואנכי ידוע, אנו יכולים לחשב את גודל מלבן מישור הצפייה באמצעות הנוסחאות הבאות:
vpw = 2.0*tan(horizontal_fov/2)
vph = 2.0*tan(vertical_fov/2)
באמצעות שני ערכים אלה, אנו יכולים כעת להמיר בין קואורדינטות פיקסל מנורמלות לקואורדינטות מישור צפייה באמצעות כפל פשוט.
x = vpw/2 * nx;
`y = vph/2