בימים האחרונים אני עובד על פרויקט קצרצר שיוצג בכנס שבו אני עתיד להשתתף. הפרויקט מראה כיצד ניתן לשלב תוכנה ומספר רכיבי חומרה כדי להשיג אפקט של חלון וירטואלי -- חלון שמורכב ממסך מחשב ותוכנו משתנה בהתאם למיקום המביט ומרחקו מהחלון.
התחלתי לעבוד על הפרויקט היום, ואני צופה שהוא יסתיים אחרי סוכות. אני אעדכן את העמוד בכל התקדמות.
מציאת מיקום הצופה ביחס לחלון היא לא פעולה פשוטה. ישנן שלוש שיטות שונות בהן אני הולך להשתמש, לכל אחת יתרונות וחסרונות מסויימים.
השיטה הראשונה - Head Tracking (מעקב מיקום ראש) באמצעות עיבוד תמונה
בשיטה זו מוצבת מצלמת ווידאו קטנה מתחת למיקום החלון, ומצלמת את חלל החדר. התמונה מועברת למחשב ומיקום הצופה מחושב באמצעות שרשרת של אלגוריתמים של עיבוד תמונה. כתבתי קוד די יעיל ב-#C שלוכד תמונות מהמצלמה ומבצע שרשרת של עיבודים עד למציאת מיקום הפנים. את התהליך ניתן לראות בתמונות הבאות:
התמונה המקורית מהמצלמה
התמונה אחרי המרה לגווני אפור והרצת פילטרי Erosion ופיקסלציה

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

הרצה של פילטר סף (Threshold) על התמונה הקודמת מראה את האיזורים שהשתנו

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

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

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