התחלנו בלימוד יסודות של OpenCV ואז עשינו כמה עיבוד תמונה בסיסי ומניפולציות על תמונות ואחריו פילוחי תמונות ופעולות רבות אחרות באמצעות OpenCV ושפת פיתון. כאן, בחלק זה, נבצע כמה טכניקות פשוטות לזיהוי אובייקטים תוך שימוש בהתאמת תבניות. אנו נמצא אובייקט בתמונה ואז נתאר את תכונותיו. התכונות הן התכונות הנפוצות של התמונה כגון פינות, קצוות וכו '. אנו נסתכל גם על כמה אלגוריתמי איתור אובייקטים נפוצים ופופולאריים כגון SIFT, SURF, FAST, BREIF & ORB.
כפי שנאמר במדריכות הקודמות, OpenCV היא Open Source Commuter Vision Library אשר כוללת ממשקי C ++, Python ו- Java ותומכת ב- Windows, Linux, Mac OS, iOS ו- Android. כך שניתן להתקין אותו בקלות ב- Raspberry Pi עם פייתון וסביבת לינוקס. ו- Raspberry Pi עם OpenCV ומצלמה מחוברת יכולים לשמש ליצירת יישומי עיבוד תמונה רבים בזמן אמת כמו זיהוי פנים, נעילת פנים, מעקב אחר אובייקטים, זיהוי לוחית מספר רכב, מערכת אבטחה לבית וכו '
איתור וזיהוי אובייקטים מהווים מקרה השימוש החשוב ביותר לראיית מחשב, הם משמשים לביצוע דברים חזקים כגון
- תיוג סצינות
- ניווט רובוט
- מכוניות בנהיגה עצמית
- זיהוי גוף (Microsoft Kinect)
- זיהוי מחלות וסרטן
- זיהוי פנים
- זיהוי כתב יד
- זיהוי עצמים בתמונות לוויין
זיהוי אובייקטים לעומת זיהוי
זיהוי אובייקטים הוא הרמה השנייה של זיהוי אובייקטים בה המחשב מסוגל לזהות אובייקט ממספר עצמים בתמונה ואולי יוכל לזהות אותו.
כעת נבצע כמה פונקציות לעיבוד תמונה כדי למצוא אובייקט מתמונה.
מציאת אובייקט מתמונה
כאן נשתמש בהתאמת תבניות למציאת דמות / אובייקט בתמונה, נשתמש בפונקציה cv2.matchTemplate () של OpenCV למציאת אותו אובייקט
ייבא cv2 ייבא מטומטם כ- np
טען תמונת קלט והמיר אותה לאפור
תמונה = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('אנשים', תמונה) cv2.waitKey (0) אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
טען את תמונת התבנית
תבנית = cv2.imread ('waldo.jpg', 0) # תוצאה של התאמת תבנית של אובייקט לתוצאת תמונה = cv2.matchTemplate (אפור, תבנית, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (תוֹצָאָה)
צור תיבה תוחמת
top_left = max_loc # הגדלת גודל המלבן התוחם ב- 50 פיקסלים bottom_right = (top_left + 50, top_left + 50) cv2. מלבן (תמונה, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('אובייקט נמצא', תמונה) cv2.waitKey (0) cv2.destroyAllWindows ()
ב cv2.matchTemplate (אפור, תבנית, cv2.TM_CCOEFF) , הזן את התמונה בקנה מידה אפור כדי למצוא את האובייקט והתבנית. לאחר מכן החל את שיטת התאמת התבנית למציאת האובייקטים מהתמונה, כאן נעשה שימוש ב- cv2.TM_CCOEFF .
הפונקציה כולה מחזירה מערך המוזן בתוצאה, שהיא התוצאה של הליך התאמת התבנית.
ואז אנו משתמשים ב- cv2.minMaxLoc (תוצאה) , אשר נותן את הקואורדינטות או את תיבת התוחם שבה נמצא האובייקט בתמונה, וכאשר נקבל את הקואורדינטות האלה מציירים מלבן מעליו, ומותחים מידות קטנות של התיבה כך אובייקט יכול להשתלב בקלות בתוך המלבן.
ישנן מגוון שיטות לביצוע התאמת תבניות ובמקרה זה אנו משתמשים ב- cv2.TM_CCOEFF אשר מייצג מקדם מתאם.
כאן מקשי המקלדת הם (X, Y) קואורדינטות שחולצו באמצעות גלאי נפה ונמשכו מעל התמונה באמצעות פונקציית המפתח kevoint לצייר cv2.
לִגלוֹשׁ
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('paris.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
צור אובייקט גלאי תכונות של SURF, כאן הגדרנו את סף הסי ל -500
גלישה = cv2.xfeatures2d.SURF_create (500) מקשי מקשים , מתארים = surf.detectAndCompute (אפור, ללא) הדפסה ("מספר נקודות המקלדת שזוהו:", len (מקשי המפתח))
צייר נקודות מפתח עשירות על תמונת קלט
תמונה = cv2.drawKeypoints (תמונה, מקשי מקשים, ללא, דגלים = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('שיטת תכונה - SURF', תמונה) cv2.waitKey () cv2.destroyAllWindows ()
פלט קונסולה:
מָהִיר
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('paris.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
צור אובייקט גלאי מהיר
fast = cv2.FastFeatureDetector_create () # השג נקודות מפתח, כברירת מחדל דיכוי מקסימלי אינו פועל # כדי לכבות את ההגדרה fast.setBool ('nonmaxSuppression', False) מקשי נקודה = fast.detect (אפור, ללא) הדפסה ("מספר מקשי המפתח זוהה: ", len (נקודות מפתח))
שרטטו מקשי מפתח עשירים על תמונת קלט
תמונה = cv2.drawKeypoints (תמונה, מקשי מפתח, ללא, דגלים = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('שיטת תכונה - FAST', תמונה) cv2.waitKey () cv2.destroyAllWindows ()
פלט קונסולה:
קָצָר
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('paris.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
צור אובייקט גלאי מהיר
קצר = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
צור אובייקט חילוץ BRIEF
#brief = cv2.DescriptorExtractor_create ("BRIEF") # קביעת נקודות מפתח של נקודות מפתח = fast.detect (אפור, ללא)
השג מתארים ומקשי סופי חדשים באמצעות BRIEF
נקודות הדפסה, מתארים = brief.compute (אפור, נקודות מפתח) הדפסה ("מספר נקודות המקשים שזוהו:", len (נקודות מפתח))
שרטטו מקשי מפתח עשירים על תמונת קלט
תמונה = cv2.drawKeypoints (תמונה, מקשי מפתח, ללא, דגלים = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('שיטת תכונה - BRIEF', תמונה) cv2.waitKey () cv2.destroyAllWindows ()
פלט קונסולה:
גַלגַל הָעַיִן
ייבא cv2 ייבוא מטומטם כתמונת np = cv2.imread ('paris.jpg') אפור = cv2.cvtColor (תמונה, cv2.COLOR_BGR2GRAY)
צור אובייקט ORB, אנו יכולים לציין את מספר נקודות המפתח הרצויות לנו
orb = cv2.ORB_create () # קבע נקודות מפתח מקשי = orb.detect (אפור, ללא)
השג את המתארים
נקודות הדפסה, מתארים = אורב.מחשב (אפור, מקשי) הדפסה ("מספר המקשים שזוהו:", len (נקודות)
שרטטו מקשי מפתח עשירים על תמונת קלט
תמונה = cv2.drawKeypoints (תמונה, מקשי מפתח, ללא, דגלים = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('שיטת תכונה - ORB', תמונה) cv2.waitKey () cv2.destroyAllWindows ()
פלט קונסולה:
אנו יכולים לציין את מספר מקשי המקלדת שמגבלתם המקסימלית היא 5000, אולם ערך ברירת המחדל הוא 500, כלומר ORB יגלה באופן אוטומטי 500 מקשי המקלדת הטובים ביותר אם לא יוגדר עבור ערך מקשי כלשהו.
אז ככה זיהוי אובייקטים מתרחש ב- OpenCV, אותן תוכניות יכולות להיות מופעלות גם ב- Raspberry Pi המותקנות ב- OpenCV ויכולות לשמש כמכשיר נייד כמו סמארטפונים עם עדשת Google.
מאמר זה מופנה מתוך Master Computer Vision ™ OpenCV4 בקורס Python with Deep Learning על Udemy, שנוצר על ידי Rajeev Ratan, הירשם כמנוי כדי ללמוד עוד על ראיית מחשבים ו- Python.