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

מראה זיהוי פנים עם תא סודי: 15 שלבים (עם תמונות)
מראה זיהוי פנים עם תא סודי: 15 שלבים (עם תמונות)

וִידֵאוֹ: מראה זיהוי פנים עם תא סודי: 15 שלבים (עם תמונות)

וִידֵאוֹ: מראה זיהוי פנים עם תא סודי: 15 שלבים (עם תמונות)
וִידֵאוֹ: תפסתי אותה על חםםםם!!!!!! 2024, יולי
Anonim
מראה זיהוי פנים עם תא סודי
מראה זיהוי פנים עם תא סודי
מראה זיהוי פנים עם תא סודי
מראה זיהוי פנים עם תא סודי
מראה זיהוי פנים עם תא סודי
מראה זיהוי פנים עם תא סודי

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

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

אני רוצה להודות לאנשים/פלטפורמות אלה שממנו קיבלתי גם את המידע והמשאבים שלי:

TeCoEd - ערוץ יוטיוב

Emmet מ- PiMyLifeUp

MJRoBot ב- Hackster.io (פרופיל)

Gaven MacDonald - ערוץ היוטיוב

טאקר שאנון ב- Thingiverse (פרופיל)

אספקה

ציוד למסגרת:

  • קרש עץ (מידות לוח זה היו 42 אינץ 'על 7.5 אינץ' על 5/16 אינץ ')
  • מסגרת תמונה בעיפרון (עם זכוכית)
  • תרסיס צבע
  • דבק רפלקטיבי לכיוון אחד
  • מנקה זכוכית וסמרטוט
  • עץ MDF

חומרי זיהוי פנים:

  • פטל פאי (השתמשתי ב- Pi 3 B+ אבל יש אפשרויות אחרות)
  • מודול מצלמה
  • מנוע צעדים

כלים:

  • מסור שולחני
  • ג'יג ראה
  • נייר זכוכית עץ
  • GlueTape
  • מידה
  • מספריים
  • בקבוק תרסיס
  • מדפסת תלת מימד
  • דבק מגע

שלב 1: חיתוכים למסגרת התיבה

חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה
חיתוכים למסגרת התיבה

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

  • הנח את המסגרת בכיוון דיוקן. מדוד את הצדדים הארוכים (LS) של צד חור הזכוכית על המסגרת עם ½ אינץ 'נוסף בחלקו העליון והתחתון. (כלומר הוסיפו סנטימטר לצד הארוך של מדידת חור הזכוכית. רשמו זאת ותייגו LSM (מדידת צד ארוך).
  • באופן דומה, מודדים את הצד העליון של החור ומוסיפים עוד 1 אינץ '. רשום זאת ותייג SSM (מדידת צד קצר).
  • קבל את הלוח שלך ועם מסור שולחן חתך שני LSM x 2 "ושני SSM x 2".
  • קח את אחד מחתכי ה- LSM ומדוד מלבן בגודל 2 "x1" שנמצא 1 "מלמטה וחצי" מצד שמאל וימין (כפי שמוצג בתמונה 3).
  • חותכים את החור בעזרת פאזל. לאחר מכן השתמש בנייר הזכוכית כדי לשייף את הקצוות.

שלב 2: חיתוכים למגירה

חתכים למגירה
חתכים למגירה
חתכים למגירה
חתכים למגירה
חתכים למגירה
חתכים למגירה
חתכים למגירה
חתכים למגירה

עכשיו נתחיל לבנות את המגירה (a.k.a תא סודי).

  • חותכים שני צדדים בגודל 4 "x 1", קוטר 3 "x 1" (קצה אחורי), 4 "x 1" (קצה קדמי), ו -4 "x 3" (פלטפורמה).
  • הדבק את הצד הראשון בגודל 4 "x 1" לאורך הצד 4 "של הרציף. הנחתי כמה מקופלים מניירות מתחת לרציף כך שהוא הרים מעט, כך שזה לא ייגרר על החור שחתכתי בלוח ה- LS. מניחים לייבוש למשך 30 דקות.
  • באופן דומה, הדבק את 3 "x 1" לאורך קצה 3 "" של הרציף. מניחים לייבוש למשך 30 דקות. לאחר מכן הדבק את הצד השני בגודל 4 אינץ 'על הצד הנגדי של הראשון. מניחים לייבוש למשך 30 דקות.
  • שים בצד את הקצה הקדמי לעת עתה. זה יהיה הדבר האחרון המודבק על המגירה.
  • בסיום, בדוק אם הוא משתלב בתוך החור שפיצית לתוך קרש ה- LSM. אם לא, משייפים את החור עד שהמגירה מחליקה פנימה והחוצה בקלות, ואין גרירה.

שלב 3: חיבור המסגרת יחד

חיבור המסגרת ביחד
חיבור המסגרת ביחד
חיבור המסגרת ביחד
חיבור המסגרת ביחד
חיבור המסגרת ביחד
חיבור המסגרת ביחד

עם השלמת כל החלקים נוכל להתחיל להרכיב את כל המסגרת.

  • הדביקו את לוח ה- LSM במרכזו עם חור הזכוכית עם ½ אינץ 'מכל צד. וודא שהוא מודבק במרחק של חצי אינץ 'מהחור (כפי שמוצג בתמונה 1). מניחים לייבוש למשך 30 דקות.
  • הדביקו את לוח ה- SSM הראשון כשהקצה נוגע בחלק הפנימי של לוח ה- LSM שהודבק זה עתה. (השתמש בסרגל כדי לוודא שהוא מודבק על ישר). מניחים לייבוש למשך 30 דקות.
  • קח את הצד השני של ה- LSM והדבק בדומה לראשון. וודא שהוא נמצא במרחק של ½ אינץ 'מהחור וכי ה- SSM שהוצמד זה עתה מודבק על החלק הפנימי של הקרש. מניחים לייבוש למשך 30 דקות.
  • הדבק את ה- SSM האחרון בקצה העליון. מכיוון שיש לך שני LSM משני הצדדים, תלוי כמה ישר חיברת אותם, ייתכן שיהיה עליך לשייף את דפנות ה- SSM למטה כדי לוודא שהוא מתאים (החיתוך שלי כבוי לפעמים). מניחים לייבוש למשך 30 דקות.
  • מדוד את החלל הקטן בין תחתית המגירה למסגרת. חותכים פיסת עץ MDF במידה זו, בגודל 4 ". אתה רוצה להפוך את החלק הזה קרוב למגירה אבל לא נוגע בו. הוא נועד לתמוך במגירה בחיכוך מינימלי.
  • בסיום, ריססתי את המסגרת רק כך שכל החלקים יתאימו.

שלב 4: למראה

בשביל המראה
בשביל המראה
בשביל המראה
בשביל המראה
בשביל המראה
בשביל המראה
בשביל המראה
בשביל המראה

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

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

שלב 5: התקן את Raspbian Stretch

זו הייתה הפעם הראשונה שאני מתעמק בסביבת Raspberry Pi והתחלתי לחפש הוראות כיצד להתקין את מערכת ההפעלה. בסופו של דבר מצאתי הדרכה פשוטה ב- Youtube של TeCoEd שעברה את תהליך ההתקנה של Stretch על כרטיס ה- SD (גם עם מבוא די מקסים). להלן הקישור לאותו מדריך:

בעיקרו של דבר, כל שעליך לעשות הוא:

  • פרמט את כרטיס ה- SD על ידי בחירת הכונן שלך >> כלי הכונן >> פורמט. הורד את קובץ ה- ZIP עבור Raspian Stretch (נמצא כאן:
  • הבזק את תמונת מערכת ההפעלה לכרטיס ה- SD. TeCoEd השתמשה ב- Win32 Disk Imager כדי להשלים זאת. בסופו של דבר התקנתי את balenaEtcher שנראה קצת יותר פשוט. (הנה קישור ההורדה של balenaEtcher:
  • לאחר שהיית ב- balenaEtcher בחר "Flash From File" ובחר את קובץ ה- ZIP שהורדת בעבר. לאחר מכן, בחר את כרטיס ה- SD הרצוי (אם לא נבחר אוטומטית). לאחר מכן לחץ על כפתור ההבזק העסיסי וחכה עד שהקסם יקרה.

לאחר ההתקנה על כרטיס ה- SD אתה יכול להכניס אותו ל- Raspberry Pi ולעבור את תהליך ההתקנה הגנרי של Pi.

שלב 6: התקן את OpenCV

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

התקנת OpenCV הייתה החלק המפרך ביותר בהיבט התוכנה בשבילי. אבל לאחר שמצאתי הוראות רבות מצאתי סוף סוף הדרכה מאת Emmet מ- PiMyLifeUp שעשתה את הטריק שנמצא כאן:

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

שלב 7: הפעל/בדוק את המצלמה

הפעל/בדוק את המצלמה
הפעל/בדוק את המצלמה
הפעל/בדוק את המצלמה
הפעל/בדוק את המצלמה

לאחר התקנת OpenCV שאר המסע שלי הושלם באמצעות הדרכה של MJRoBot ב- Hackster.io שנמצאה כאן:

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

כדי להתחיל, עלינו לבדוק את המצלמה כדי לוודא שנוכל לצלם וידאו על המסך. ביליתי כשעה בניסיון להריץ את התסריט שסופק בשלב 3 של MJRoBot. כפי שהחיים יראו זאת, עלינו למעשה לאפשר את המצלמה ב- Raspberry Pi (מסתבר שאולי כדאי לקרוא הוראות שניתנו … mmm nah). אז לאחר חיבור המצלמה ליציאה הנכונה בצע את השלבים הבאים:

  • פתח מסוף פקודות והקלד sudo raspi-config
  • בחר "אפשר מצלמה" (זה עשוי להימצא באפשרות מכשירים)
  • הקש על "Enter"
  • עבור אל "סיום" ותתבקש לאתחל מחדש

לאחר מכן בצע את השלבים הבאים:

  • עבור לתפריט הראשי של הפטל (למעלה משמאל)
  • העדפות
  • תצורת פטל פטל
  • ממשקים
  • לאחר מכן במצלמה, בחר "מופעל"
  • אז בסדר"

עכשיו אתה אמור להיות מסוגל להריץ את הסקריפט הזה בהצלחה מהמדריך של MJRoBot כדי לבדוק את המצלמה (זכור שכל הקוד הזה ועוד תיאור מעמיק יותר נמצא בקישור המצורף למעלה להדרכה של MJRobot):

ייבא numpy כמו np

ייבוא cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Width cap.set (4, 480) # set Height while (True): ret, frame = cap.read () frame = cv2. flip (מסגרת, -1) # הפוך מצלמה אפורה אנכית = cv2.cvtColor (frame, cv2. COLOR_BGR2GRAY) cv2.imshow ('frame', frame) cv2.imshow ('אפור', אפור) k = cv2.waitKey (30) & 0xff אם k == 27: # הקש על 'ESC' כדי להפסיק את ההפסקה של cap.release () cv2.destroyAllWindows ()

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

שלב 8: איסוף נתונים ונתוני הדרכה

איסוף נתונים ונתוני הדרכה
איסוף נתונים ונתוני הדרכה
איסוף נתונים ונתוני הדרכה
איסוף נתונים ונתוני הדרכה
איסוף נתונים ונתוני הדרכה
איסוף נתונים ונתוני הדרכה

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

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

פתח שורת פקודה ועשה ספרייה חדשה ששמה אותה למשהו מהנה (קראתי ל- FaceRec שלי)

mkdir FaceRec

כעת, שנה את הספרייה ל- FaceRec והקפד על תת -ספרייה הקפד לתת לו שם נתונים

תקליטור FaceRec

מערך נתונים mkdir

בזמן שאנחנו בעניין, אנו יכולים גם להפוך את תת הספרייה האחרת בשם מאמן

מאמן mkdir

עכשיו אתה יכול לרוץ ולפעול לפי ההוראות של הסקריפט הראשון שיצלם תמונות של משתמש. (רק ראש בראש, הקפד להזין את מזהה המשתמש כ- 1, 2, 3 וכו ')

יבוא cv2import os cam = cv2. VideoCapture (0) cam.set (3, 640) # set video width cam.set (4, 480) # set video height face_detector = cv2. CascadeClassifier ('haarcascade_frontalface_default.xml') # עבור כל אדם, הזן מזהה פנים מספרי אחד face_id = input ('\ n הזן מזהה משתמש הקש ==>') הדפס ("\ n [INFO] אתחול לכידת פנים. הסתכל במצלמה והמתן …") # אתחל ספירת פנים בודדת של דגימה בודדת. count = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # הפוך תמונת וידאו אפורה אנכית = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) פנים = face_detector.detectMultiScale (אפור, 1.3, 5) עבור (x, y, w, h) בפנים: cv2.lectangle (img, (x, y), (x+w, y+h), (255, 0, 0), 2) count + = 1 # שמור את התמונה שצולמה בתיקיית מערכי הנתונים cv2.imwrite ("dataset/User." + Str (face_id) + '.' + Str (count) + ".jpg", אפור [y: y +h, x: x+w]) cv2.imshow ('image', img) k = cv2.waitKey (100) & 0xff # לחץ על 'ESC' ליציאה מהסרטון אם k == 27: הפרת מספר elif> = 30: # קח 30 דגימת פנים והפסק את הפסקת הווידיאו k print ("\ n [INFO] יציאה מתוכנית וניקוי דברים") cam.release () cv2.destroyAllWindows ()

בשלב זה וודא שהתקנת כרית בפי. אם לא, הפעל את הפקודה:

פיפ להתקין כרית

לאחר השלמת זה תוכל להריץ את סקריפט האימון (סקריפט שני) שיספק לך בצורה חלקה קובץ.yaml שישמש בתסריט הסופי

יבוא cv2import numpy כמו np מ- PIL יבוא תמונות יבוא OS # נתיב עבור מסד נתונים של תמונת פנים = 'dataset' מזהה = cv2.face. LBPHFaceRecognizer_create () גלאי = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); פונקציה # כדי לקבל את התמונות ולתייג נתוני def getImagesAndLabels (נתיב): imagePaths = [os.path.join (נתיב, f) עבור f ב- os.listdir (נתיב)] faceSamples = ids = עבור imagePath ב- imagePaths: PIL_img = Image.open (imagePath).convert ('L') # המר אותו לגווני אפור img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [-1]. פיצול (".") [1]) פנים = detector.detectMultiScale (img_numpy) עבור (x, y, w, h) בפנים: faceSamples.append (img_numpy [y: y+h, x: x+w]) ids.append (id) return faceSamples, ids print ("\ n [INFO] פרצופי אימון. ייקח כמה שניות. המתן …") פנים, ids = getImagesAndLabels (נתיב) מזהה.טראן (פנים, np.array (ids)) # שמור את הדגם ב- trainer/trainer.yml מזהה.כתב ('trainer/trainer.yml') # מזהה.שמור () עבד ב- Mac, אך לא ב- Pi # הדפס את מספר הפנים המאומנות וסיים את הדפסת התוכנית ("\ n [INFO] {0} פנים מאומנות. פורמט תוכנית". פורמט (len (np.unique (ids))))

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

למטה יש לי את סקריפט לכידת הנתונים ותסריט ההדרכה זמינים להורדה.

שלב 9: זמן זיהוי פנים

זמן זיהוי פנים
זמן זיהוי פנים
זמן זיהוי פנים
זמן זיהוי פנים

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

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

ייבא numpy כמו np

זמן יבוא os יבוא זמן ייבוא RPi. GPIO כ- GPIO GPIO.setwarnings (False) GPIO.setmode (GPIO. BCM)

הרשימה הבאה בשם ControlPin היא מערך מספרים המייצג סיכות פלט שישמשו עבור מנוע הצעד שלנו.

ControlPin = [14, 15, 18, 23]

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

GPIO.setup (ControlPin , GPIO. OUT)

GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN)

שני המשתנים הבאים הם רצפים בהם נשתמש כדי להניע את המנוע. למדתי את המידע הזה מסרטון נפלא של גאבן מקדונלד שאני מאוד ממליץ לצפות בו כשהוא מעמיק לא רק בקוד אלא במנוע בפועל (נמצא כאן: https://www.youtube.com/embed/Dc16mKFA7Fo). בעיקרו של דבר, כל רצף יחזור על ידי שימוש בלולאות המקוננות לולאות בפונקציות openComp ו- closeComp הקרובות. אם אתה מסתכל מקרוב seq2 הוא בדיוק ההפך מ seq1. כן, ניחשתם נכון. האחד נועד להניע את המנוע קדימה והשני הוא לאחור.

seq1 =

seq2 =

החל מפונקציית openComp שלנו אנו יוצרים לולאת for-lop שתחזור על עצמה 1024 פעמים. על פי הווידאו של מקדונלד'ס 512 איטרציות יספקו סיבוב מלא של המנוע ומצאתי כי כשני סיבובים הם באורך טוב אך ניתן להתאים זאת בהתאם לגודלו של הפרט. הלולאה הבאה מורכבת מ -8 איטרציות על מנת להסביר את 8 המערכים שנמצאו ב- seq1 ו- seq2. ולבסוף, הלולאה האחרונה חוזרת ארבע פעמים על ארבעת הפריטים שנמצאים בכל אחד מהמערכים הללו, כמו גם על 4 סיכות GPIO שאליהן המנוע שלנו מחובר. השורה שמתחת לכאן בוחרת את סיכת ה- GPIO ולאחר מכן מפעילה או מכבה אותה בהתאם לאיטרציה שהיא מופעלת. הקו שאחרי מספק קצת זמן חיץ שמא המנוע שלנו לא יסתובב כלל. לאחר שהמנוע מסתובב כדי להזיז את המגירה החוצה הוא ישן במשך 5 שניות לפני שהוא ממשיך הלאה. ניתן לכוונן את הזמן הזה כאן או להפעיל את קוד ההערה המאפשר שימוש בכפתור לחיצה להעביר עם התסריט ולא טיימר.

לטווח טווח (1024):

עבור חצי צעד בטווח (8): לפין בטווח (4): פלט GPIO.output (ControlPin [pin], seq1 [halfstep] [pin]) time.sleep (.001) '' 'בעוד True: if GPIO.input (2) == GPIO. LOW: הפסקה; '' 'time.sleep (5)

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

לטווח טווח (1024):

לחצי צעד בטווח (8): לסיכה בטווח (4): פלט GPIO.output (ControlPin [pin], seq2 [halfstep] [pin]) time.sleep (.001) הדפסה ("תא סגור") GPIO.output (ControlPin [0], 0) פלט GPIO.output (ControlPin [3], 0) time.sleep (3)

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

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

names = ['None', 'Daniel', 'None', 'None', 'None', 'None']

שורות הקוד האחרונות שלנו מיושמות ב- thicc for-loop. יצרתי משתנה לאחסון הביטחון כמספר שלם (intConfidence) לפני שהביטחון המשתנה יהפוך למחרוזת. לאחר מכן אני משתמש ב- if-statement כדי לבדוק אם הביטחון גדול מ- 30 ואם המזהה (איזה אדם המחשב מזהה, במקרה זה, "דניאל") שווה לשמי.לאחר אישור זה נקראת הפונקציה openComp אשר (כפי שהוסבר קודם) מניע את המנוע, בועט החוצה לאחר 5 שניות ולאחר מכן ממשיך לסגור את המנוע אשר מניע את המנוע בכיוון ההפוך ומבצע ניקוי כלשהו לפני שתמשיך בלולאת הטיק.

אם intConfidence> 30 ו- id == 'Daniel':

openComp () closeComp ()

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

להלן התסריט כולו במקום אחד (ורק מתחת לזה ניתן להורדה):

יבוא cv2

יבוא numpy כמו np יבוא os זמן ייבוא RPi. GPIO כ- GPIO GPIO.setwarnings (False) GPIO.setmode (GPIO. BCM) ControlPin = [14, 15, 18, 23] עבור i בטווח (4): GPIO.setup (ControlPin , GPIO. OUT) GPIO.output (ControlPin , 0) GPIO.setup (2, GPIO. IN, pull_up_down = GPIO. PUD_DOWN) seq1 =

שלב 10: הרכבת ה- Pi וחיבור המנוע

הרכבה של ה- Pi וחיבור המנוע
הרכבה של ה- Pi וחיבור המנוע
הרכבה של ה- Pi וחיבור המנוע
הרכבה של ה- Pi וחיבור המנוע
הרכבה של ה- Pi וחיבור המנוע
הרכבה של ה- Pi וחיבור המנוע

הרכבת ה- Raspberry Pi למסגרת הייתה פשוטה למדי. עיצבתי מרפק קטן של 90 מעלות עם פנים אחד בעל חור והצד השני שטוח לחלוטין. לאחר הדפסת תלת מימד אלה ניתן לחבר אותם באמצעות ברגים ל- Raspberry Pi על חורי ההרכבה שלו (השתמשתי בשני החורים בכל צד של סיכות ה- GPIO).

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

עכשיו פשוט חבר את נהג המנוע ל- PI עם חיבור IN1, IN2, IN3, IN4 ל- GPIO 14, 15, 18, 23 בהתאמה. לבסוף, חבר את סיכות 5v וקרקע של לוח הבקר לפלט 5v ולסיכות הארקה של ה- Pi.

להלן קישור ל- Pinout של ה- Pi לעיון כלשהו:

שלב 11: הרכבת המצלמה

הרכבה של המצלמה
הרכבה של המצלמה
הרכבה של המצלמה
הרכבה של המצלמה
הרכבה של המצלמה
הרכבה של המצלמה

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

שלב 12: יצירה והתקנה של מנגנון הנעת המגירות

יצירה והתקנה של מנגנון הנעת המגירות
יצירה והתקנה של מנגנון הנעת המגירות
יצירה והתקנה של מנגנון הנעת המגירות
יצירה והתקנה של מנגנון הנעת המגירות
יצירה והתקנה של מנגנון הנעת המגירות
יצירה והתקנה של מנגנון הנעת המגירות

צעד זה נעשה קל הודות למתנות הנדיבות של קהילת היצרנים. לאחר חיפוש מהיר ב- Thingiverse הצלחתי למצוא מפעיל לינארי שנוצר על ידי TucksProjects (נמצא כאן: https://www.thingiverse.com/thing:2987762). כל שנותר לעשות היה להטעין אותו על כרטיס SD ולתת למדפסת לבצע את העבודה.

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

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

שלב 13: הוספת קרטון מאחורי המראה

הוספת קרטון מאחורי המראה
הוספת קרטון מאחורי המראה
הוספת קרטון מאחורי המראה
הוספת קרטון מאחורי המראה
הוספת קרטון מאחורי המראה
הוספת קרטון מאחורי המראה

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

שלב 14: לשים את החלק האחרון

לשים את החלק האחרון
לשים את החלק האחרון
לשים את החלק האחרון
לשים את החלק האחרון

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

שלב 15: סיום

סִיוּם
סִיוּם
סִיוּם
סִיוּם

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

דירוג כולל: 10/10

הערות: #WouldNotTryAgain … אלא אם כן יכולתי לעקוב אחר ההנחיות;)

אתגר התא הסודי
אתגר התא הסודי
אתגר התא הסודי
אתגר התא הסודי

פרס גדול באתגר התא הסודי

מוּמלָץ: