זיהוי לוח שחמט

‫בס"ד‬
‫זיהוי לוח שחמט‬
‫נתן מייזלס ושי קרני ראם‬
‫מבוא‬
‫שחמט הוא ענף ספורט ומשחק לוח אסטרטגי המיועד לשני שחקנים‪ .‬זהו אחד מהמשחקים השכיחים והמורכבים‬
‫ביותר הקיימים בתרבות האנושית; ההערכות למספר המצבים החוקיים בשחמט נעות בין ‪ 01^34‬ל ‪.01^34‬‬
‫מסמך זה מתאר אפליקציית אנדרואיד שמזהה לוח שחמט ‪ ,‬את הכלים השונים ואת מיקומם על הלוח‪ .‬ניתן להגיד‬
‫שהאפליקציה ממירה תמונה של לוח שחמט לייצוג הדיגיטלי שלו‪.‬‬
‫ממשק‬
‫ממשק האפליקציה הינו פשוט ואינטואיטיבי‪ .‬מהמסך הראשי של האפליקציה מצלמים תמונה של לוח‬
‫השחמט ומקבלים תוך זמן קצר חזרה תמונה של הלוח – שהוא מיושר ועם זיהוי הכלים ומיקומם‪.‬‬
‫תמונה – מסך ראשי‪.‬‬
‫צילום לוח של האפליקציה‬
‫התמונה המוחזרת מהאפליקציה‪.‬‬
‫מימוש‬
‫בהתחלה אנו מקבלים תמונה של הלוח מהאפליקציה‪ .‬באמצעות קוד ‪ c++‬אנו עושים את הפעולות הבאות‪:‬‬
‫‪ .1‬יישור התמונה‬
‫רעיון כללי‪:‬‬
‫ע"מ ליישר את התמונה מטרתנו למצוא את ארבעת הפינות של לוח שחמט‪ ,‬וכך נוכל ליישר את התמונה‬
‫של הלוח באמצעות הומוגרפיה‪.‬‬
‫שלבים‪:‬‬
‫א‪ .‬הרצת ‪ canny edge detector‬על התמונה‪ .‬אנו משנים את התמונה לגוונים של אפור ומריצים את‬
‫האלגוריתם של ה‪. canny edge detector‬זהו אלגוריתם לזיהוי קצוות בתמונה‪ .‬על תמונה זו יותר נוח‬
‫לעבוד בשלבים הבאים‪.‬‬
‫תמונת מקור‬
‫תמונה אחרי הרצת ‪canny edge detector‬‬
‫ב‪ .‬אנו מריצים אלגוריתם ‪ .Hough Lines Transform‬אלגוריתם זה מוצא קווים ישרים בתמונה‪.‬‬
‫ג‪ .‬אנו ממזגים קווים קרובים‪ – .‬לפעמים האלגוריתם מוצא כמה קווים קרובים מדי – שאנו יודעים שהם‬
‫לא יכולים להיות כל כך קרובים בגלל מבנה לוח השחמט‪ .‬ולכן נמזג את הקווים הקרובים‪.‬‬
‫ד‪ .‬ממיינים את הקווים לקווים אופקיים ואנכיים‪.‬‬
‫תמונה של הקווים האופקיים והאנכיים‬
‫ה‪ .‬ע"פ כמות הקווים שמצאנו ‪ ,‬עושים יוריסטיקה פשוטה ע"מ לבחור את הקווים החיצוניים הנכונים‪.‬‬
‫אם יש ‪ 9‬קווים אופקיים ‪ /‬אנכיים נבחר את הראשון ואת האחרון‪ .‬אם יש ‪ 00‬קווים אופקיים ‪ /‬אנכיים‬
‫נבחר את הקו השני והאחד לפני אחרון‪.‬‬
‫ההיגיון הוא שלפעמים אנו מזהים הלוח החיצוני ולפעמים לא‪.‬‬
‫תמונה לדוגמא של בחירת הקווים של לוח השחמט‬
‫ישנם גם עוד יוריסטיקות ליתר מצבי הקצה‪.‬‬
‫הקווים שבחרנו הם קווי המסגרת של לוח השחמט‪.‬‬
‫ו‪ .‬מוצאים את נקודות החיתוך של קווי המסגרת של לוח השחמט – אלו ארבעת הפינות של הלוח‪.‬‬
‫ז‪ .‬מיישרים את הלוח ע"פ ארבעת הפינות‪.‬‬
‫תמונה מיושרת‬
‫‪ .2‬זיהוי כלים‪:‬‬
‫מאגר ‪:templates‬‬
‫יצרנו מאגר של ‪ 43‬תמונות הכוללות את כל התמונות של הכלים (השחורים והלבנים) ואת התמונות של כל‬
‫הכלים מסובבות ב‪ 081-‬מעלות‪ .‬את התמונות "גזרנו" במחשב מתמונת המקור של הכלים שממנה הדפסנו‬
‫את הכלים בסופו של דבר‪.‬‬
‫חיתוך הלוח למשבצות‪:‬‬
‫כשלב מקדים לזיהוי הכלים על הלוח‪ ,‬חילקנו את התמונה של הלוח (לאחר ביצוע הומוגרפיה‪ ,‬וחיתוך‬
‫המסגרת של הלוח) ל‪ 43-‬תמונות קטנות‪ ,‬כאשר כל אחת מהם מייצגת משבצת בלוח‪.‬‬
‫תמונה של חלוקת הלוח לקוביות‬
‫הסבר על אלגוריתם הזיהוי‪:‬‬
‫האלגוריתם בו השתמשנו לשם זיהוי הכלים הוא ‪.template matching‬‬
‫הרעיון הכללי העומד מאחורי האלגוריתם הזה הוא למצוא תמונה קטנה (‪ )template‬בתוך תמונת מקור גדולה‬
‫יותר‪.‬‬
‫דרך הפעולה של האלגוריתם הוא זה‪" :‬החלקת" תמונת ה‪ template-‬על תמונת המקור‪ ,‬כלומר‪ :‬השוואת‬
‫תמונת ה‪ template-‬על כל אזור בתמונת המקור (ע"י הזזה בפיקסל אחד כל פעם) ובכל אזור מחושב ערך‬
‫שמייצג את טיב הזיהוי שמחושב בעזרת המטריצה (‪ ,)a.‬ובעצם חוזרת מטריצה שמייצגת את טיב הזיהוי בכל‬
‫נקודה‪.‬‬
‫‪a. method=CV_TM_CCOEFF_NORMED‬‬
‫כעת כל שנותר כדי למצוא את הנקודה עם הזיהוי הטוב ביותר זה למצוא את הנקודה במטריצה עם הערך‬
‫המקסימלי‪ ,‬כאשר ישנו ‪ threshold‬שניתן דרכו לדעת גם את רמת הזיהוי‪.‬‬
‫זיהוי הכלים עצמו מתבצע על כל אחת מהתמונות הקטנות בנפרד‪ ,‬כלומר‪ :‬על כל משבצת בלוח בפני עצמה‪.‬‬
‫דרך הפעולה של האלגוריתם שלנו הוא‪ :‬ראשית אנו הופכים את התמונות לגוונים של אפור על מנת לשפר את‬
‫זיהוי הכלים ולהנמיך את השפעת הסביבה (כגון תאורה על הזיהוי)‪ .‬על כל משבצת אנו מריצים את ה‪-‬‬
‫‪ template matching‬של כל אחד מהכלים (‪ ,)templates‬עם ערך ‪ threshold‬נמוך יחסית‪ .‬לאחר שסיימנו‪ ,‬אנו‬
‫בודקים אם יש יותר מזיהוי יחיד‪.‬‬
‫עבור יותר מזיהוי יחיד‪ :‬אנו מעלים את ה‪ threshold-‬ומריצים שוב את כל ה‪ templates-‬על‬
‫המשבצת עד לקבלת מקסימום זיהוי יחיד‪.‬‬
‫עבור זיהוי יחיד‪ :‬אנו מחזירים ערך המייצג את הכלי הספציפי שזוהה ומסמנים על התמונה את הכלי‬
‫שזוהה או במקרה שלא זוהה אף כלי‪-‬ערך המסמן שלא נמצא שום זיהוי‪.‬‬
‫לבסוף‪ ,‬על פי המיפוי בין הערך שמייצג כל כלי אנו מחליפים את הערכים שהחזרנו לכל משבצת בשמות‬
‫הכלים עצמם ומציגים אותם על המשבצת‪.‬‬
‫תוצאות (מקור ותוצאה)‬
‫תוצאה רעה‬
‫ ההמוגרפיה לא תעבוד ולכן זיהוי‬.‫כפי שניתן לראות כאשר אנו בזווית חדה אנו לא מזהים את קווי לוח השחמט‬
.‫הכלים והלוח לא יעבדו‬
‫ביבליוגרפיה‬
/http://docs.opencv.org ‫ באינטרנט‬opencv ‫תיעוד‬
‫פרוייקט שחמט‬
http://www.nandanbanerjee.com/index.php?option=com_content&view=article&id=71:buttercupchess-robot&catid=78&Itemid=470
http://codebazaar.blogspot.co.il/2011/08/chess-board-recognition-project-part-1.html ‫פרוייקט שחמט‬
‫נספחים‬
‫ניסיונות ליישר תמונה‬
‫‪ .0‬בהתחלה ניסינו להשתמש באלגוריתם המובנה של ‪ opencv‬לקליברציה‪ ,‬המזהה לוח שחמט‪.‬‬
‫מסתבר כי הפונקציה מזהה לוח בגודל ‪ 4X4‬או ‪ 9X9‬וכו' כך שהיא לא התאימה לצרכים שלנו‪ .‬כמו כן‬
‫ברגע שהנחנו כלים על הלוח ‪ ,‬הפונקציה הפסיקה לעבוד כנראה בגלל שהיא מזהה משבצות‬
‫שחורות ולבנות‪ ,‬וכך מכיילת את המצלמה‪.‬‬
‫‪ .4‬ניסינו להשתמש באלגוריתם ‪ .Shi–Tomasi‬אלגוריתם זה מזהה פינות‪ .‬חשבנו שנוכל לקחת את‬
‫הפינות הכי קיצוניות ועל פיהם לזהות את פינות הלוח הגדרנו שיהיו רק מקסימום ‪ 011‬פינות על‬
‫מנת להימנע מתוצאות מזבלות‪.‬‬
‫בפועל האלגוריתם לא היה שימושי‪ .‬האלגוריתם מצא פינות גם על הכלים ‪ ,‬כך שהושפענו ישירות‬
‫מכמות הכלים שהיו על הלוח ולא יכולנו להשתמש באלגוריתם‪.‬‬