תוכן עניינים:

הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה: 13 שלבים (עם תמונות)
הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה: 13 שלבים (עם תמונות)

וִידֵאוֹ: הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה: 13 שלבים (עם תמונות)

וִידֵאוֹ: הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה: 13 שלבים (עם תמונות)
וִידֵאוֹ: 🚀 RUTUBE ונקודה. פיתוח RUTUBA תוך 5 שעות *ללא מים* [הבא / תגובה / Nest / PostgreSQL / Redux] 2024, נוֹבֶמבֶּר
Anonim
הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה
הוק מחווה: רובוט נשלט על ידי מחוות יד באמצעות ממשק מבוסס עיבוד תמונה

Gesture Hawk הוצג ב- TechEvince 4.0 כממשק פשוט המבוסס על עיבוד תמונה ומכונה. התועלת שלה טמונה בעובדה שאין צורך בחיישנים נוספים או לבישים למעט כפפה בכדי לשלוט במכונית הרובוטית הפועלת על עקרון הנעה דיפרנציאלי. במדריך זה, ניקח אותך על עקרון העבודה מאחורי מעקב אחר אובייקטים וזיהוי מחוות המשמשים את המערכת. ניתן להוריד את קוד המקור של פרויקט זה מ- Github באמצעות קישור:

שלב 1: דברים נדרשים:

הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
הדברים הנדרשים
  1. נהג מנוע L298N
  2. מנועי DC
  3. שלדת מכונית רובוטית
  4. ארדואינו אונו
  5. סוללות LiPo
  6. כבל USB Arduino (ארוך)
  7. ספריית OpenCV עם Python

שלב 2: עקרון העבודה:

עקרון העבודה
עקרון העבודה

Gesture Hawk היא מערכת עיבוד תלת פאזית כפי שניתן לראות בתרשים לעיל.

שלב 3: כניסת קלט ועיבוד:

לכידת קלט ועיבוד
לכידת קלט ועיבוד

ניתן להבין את לכידת הקלט בקטגוריות הרחבות יותר הנתונות בתרשים לעיל.

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

hsv = cv2.cvtColor (מסגרת, cv2. COLOR_BGR2HSV)

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

שלב 4:

תמונה
תמונה

שלב 5:

להלן קטע קוד להלן כדי ליצור סרגל מסלול כזה לבניית מסכות:

יבוא cv2

יבוא numpy כמו npdef שום דבר (x): העבר cv2.namedWindow ('תמונה') img = cv2. VideoCapture (0) cv2.createTrackbar ('l_H', 'image', 110, 255, כלום) cv2.createTrackbar ('l_S ',' תמונה ', 50, 255, כלום) cv2.createTrackbar (' l_V ',' image ', 50, 255, כלום) cv2.createTrackbar (' h_H ',' image ', 130, 255, כלום) cv2. createTrackbar ('h_S', 'image', 255, 255, כלום) cv2.createTrackbar ('h_V', 'image', 255, 255, כלום) בעוד (1): _, frame = img.read ()

hsv = cv2.cvtColor (frame, cv2. COLOR_BGR2HSV) lH = cv2.getTrackbarPos ('l_H', 'image') lS = cv2.getTrackbarPos ('l_S', 'image') lV = cv2.getTrackbarPos ('l_ 'image') hH = cv2.getTrackbarPos ('h_H', 'image') hS = cv2.getTrackbarPos ('h_S', 'image') hV = cv2.getTrackbarPos ('h_V', 'image') lower_R = np. מערך ([lH, lS, lV]) higher_R = np.array ([hH, hS, hV]) mask = cv2.inRange (hsv, lower_R, higher_R) res = cv2.bitwise_and (מסגרת, מסגרת, מסכה = מסכה) cv2.imshow ('image', res) k = cv2.waitKey (1) & 0xFF אם k == 27: break cv2.destroyAllWindows ()

שלב 6: חלק עיבוד:

חלק עיבוד
חלק עיבוד

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

גוף קמור:

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

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

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

שלב 7:

תמונה
תמונה

שלב 8:

תמונה
תמונה

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

שלב 9:

תמונה
תמונה

במקרה לעיל, הזווית α צריכה להיות בין 0 ל- 90 מעלות אם המחווה היא לפנייה שמאלה. כלומר שיזוף (α) צריך להיות חיובי.

שלב 10:

תמונה
תמונה

במקרה לעיל, הזווית α צריכה להיות בין 180 ל- 90 מעלות אם המחווה היא לפנייה ימינה. כלומר שיזוף (α) צריך להיות שלילי.

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

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

שלב 11:

תמונה
תמונה

סוף סוף מחוות תנועה קדימה מנותחת על ידי פונקציית matchShape () ב- OpenCV. פונקציה זו משווה את צורת שני הסופרים, במקרה זה, בין דוגמא לאימון על אבן בתמונה למעלה לקווי המתאר בצד שמאל של התמונה למעלה. הוא מחזיר ערך שנע בין 0 ל -2 או 3, על פי הווריאציה הקיימת בצורת שתי קווי מתאר. עבור אותו מתאר זהה, הוא מחזיר 0.

ret = cv2.matchShapes (cnt1, cnt2, 1, 0.0)

כאן, cn1 ו- cnt2 הן שתי קווי המתאר שיש להשוות.

שלב 12: בקרת תנועה:

בקרת תנועה
בקרת תנועה

PySerial:

השתמשנו בספריית PySerial של פייתון כדי להמיר את הנתונים המעובדים לנתונים סדרתיים שיועברו ל- Arduino Uno באמצעות כבל USB Arduino. לאחר שזוהתה מחווה מסוימת על ידי opencv יצרנו משתנה זמני שאומר 'x' והקצנו לו ערך ייחודי והמירנו אותו לקלט סידורי באמצעות שורת הפקודה הבאה:-

יבוא סדרתי #t ליבוא ספריית Pyserial

serial. Serial ('', baudrate = '9600', timeout = '0') # הגדרת פלט סדרתי.. שם הנמל הוא שם הנמל שבאמצעותו תתבצע העברת נתונים.

serial.write (b'x ') # x הוא האלפבית שנשלח ליציאה … b הוא להמיר מחרוזת זו לבייטים.

עיבוד ארדואינו:

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

נהג מנוע L298N:-

נהג מנוע משמש כמתווך בין המנוע למקור החשמל מכיוון שלא ניתן להפעיל מנועים ישירות בגלל דירוגי מתח נמוך. סוללת Li-Po מחוברת למסוף הכניסה שלה 12V ואנחנו מחברים את שקע 5V של arduino לשקע הכניסה של 5V של נהג המנוע, המחבר סוף סוף את הקרקע של Li-Po כמו גם את arduino בשקע קרקע משותף של נהג המנוע.

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

מוּמלָץ: