תיאוריה נוספת
מטרות ראייה
מתכנני משחק ה-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 * ny;
זכרו שבחרנו למקם את מ