Πίνακας περιεχομένων:

Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα: 15 βήματα (με εικόνες)
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα: 15 βήματα (με εικόνες)

Βίντεο: Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα: 15 βήματα (με εικόνες)

Βίντεο: Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα: 15 βήματα (με εικόνες)
Βίντεο: OK Mag: Η Ιωάννα Τούνη κάνει πεντικιούρ και θηλάζει τον γιο της 2024, Ιούλιος
Anonim
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα
Καθρέπτης αναγνώρισης προσώπου με μυστικό διαμέρισμα

Πάντα με ενθουσίαζαν τα πάντα δημιουργικά μυστικά διαμερίσματα που χρησιμοποιούνται σε ιστορίες, ταινίες και άλλα παρόμοια. Έτσι, όταν είδα τον διαγωνισμό Secret Compartment αποφάσισα να πειραματιστώ με την ιδέα και να φτιάξω έναν συνηθισμένο καθρέφτη που ανοίγει ένα μυστικό συρτάρι όταν το κοιτάξει ο κατάλληλος άνθρωπος.

Χρησιμοποιώντας ένα Raspberry Pi, κάποιες γνώσεις προγραμματισμού python και μια τάξη καταστήματος 8ης τάξης, μπορούμε να δημιουργήσουμε αυτήν την άκαμπτη συσκευή για να κρύβουμε αντικείμενα σε απλή θέα, στα οποία μόνο ο σωστός χρήστης θα έχει πρόσβαση.

Θα ήθελα να ευχαριστήσω ιδιαίτερα αυτούς τους ανθρώπους/πλατφόρμες από τις οποίες πήρα επίσης τις πληροφορίες και τους πόρους μου:

TeCoEd - Κανάλι Youtube

Emmet από το PiMyLifeUp

MJRoBot στο Hackster.io (προφίλ)

Gaven MacDonald - Κανάλι Youtube

Tucker Shannon στο Thingiverse (προφίλ)

Προμήθειες

Προμήθειες πλαισίου:

  • Wood Plank (Οι διαστάσεις αυτής της σανίδας ήταν 42 "επί 7,5" επί 5/16 ")
  • Μολύβι Πλαίσιο Εικόνας (με γυαλί)
  • Σπρέι μπογιά
  • Μονόδρομος αντανακλαστική κόλλα
  • Καθαριστικό & κουρέλι γυαλιού
  • MDF Ξύλο

Αναλώσιμα Αναγνώρισης Προσώπου:

  • Raspberry Pi (χρησιμοποίησα το Pi 3 B+ αλλά υπάρχουν και άλλες επιλογές)
  • Ενότητα κάμερας
  • Stepper Motor

Εργαλεία:

  • Επιτραπέζιο πριόνι
  • Jig Saw
  • Γυαλόχαρτο Ξύλο
  • GlueTape
  • Μετρήσει
  • Ψαλίδι
  • Μπουκάλι ψεκασμού
  • Τρισδιάστατος εκτυπωτής
  • Υπερκόλλα

Βήμα 1: Περικοπές για το πλαίσιο πλαισίου

Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού
Περικοπές για το πλαίσιο κουτιού

Αγόρασα μια κορνίζα από μεταχειρισμένο κατάστημα. Απλώς μια προειδοποίηση, βεβαιωθείτε ότι οι σανίδες που αποτελούν το πλαίσιο έχουν πλάτος τουλάχιστον 1 1/2 . Αυτό είναι έτσι ώστε να κολλήσετε άλλες σανίδες ξύλου πάνω του με αρκετό χώρο για εργασία. Επίσης, βεβαιωθείτε ότι το γυαλί είναι το πλαίσιο είναι εντελώς καθαρό. Αγόρασα ένα παγωμένο τυχαία και στη συνέχεια έπρεπε να αγοράσω ένα άλλο πλαίσιο μόνο για το διάφανο γυαλί. Επειδή χρησιμοποιείται το πλαίσιο μου, οι μετρήσεις για το πλαίσιο του κουτιού μπορεί να διαφέρουν.

  • Τοποθετήστε το πλαίσιο σε κατακόρυφο προσανατολισμό. Μετρήστε τις μακριές πλευρές (LS) της πλευράς γυάλινης οπής στο πλαίσιο με ένα επιπλέον ½”τόσο στο πάνω όσο και στο κάτω μέρος. (δηλ. προσθέστε μια ίντσα στη μεγάλη πλευρά της μέτρησης της τρύπας γυαλιού. Καταγράψτε αυτό και επισημάνετε το LSM (Long Side Measurement).
  • Ομοίως, μετρήστε την επάνω πλευρά της τρύπας και προσθέστε επιπλέον 1 ". Καταγράψτε αυτό και επισημάνετε το SSM (Short Side Measurement).
  • Πάρτε την πλακέτα σας και με ένα επιτραπέζιο πριόνι κόψτε δύο LSM x 2”και δύο SSM x 2”.
  • Πάρτε μία από τις περικοπές LSM και μετρήστε ένα ορθογώνιο 2 "x1" που είναι 1 "από το κάτω μέρος και ½" από την αριστερή και δεξιά πλευρά (όπως φαίνεται στην εικόνα 3).
  • Χρησιμοποιήστε ένα παζλ για να κόψετε την τρύπα. Στη συνέχεια, χρησιμοποιήστε το γυαλόχαρτο για να τρίψετε τις άκρες.

Βήμα 2: Περικοπές για το συρτάρι

Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι
Περικοπές για το συρτάρι

Τώρα θα αρχίσουμε να κατασκευάζουμε το συρτάρι (γνωστό και ως μυστικό διαμέρισμα).

  • Κόψτε δύο πλευρές 4 "x 1", 3 "" x 1 "(πίσω άκρη), 4" "x 1 ¼" (μπροστινό άκρο) και 4 "x 3 ⅜" (πλατφόρμα).
  • Κολλήστε την πρώτη πλευρά 4 "x 1" κατά μήκος της πλευράς 4 "της πλατφόρμας. Έβαλα μερικά διπλωμένα χαρτιά κάτω από την πλευρά της πλατφόρμας ώστε να σηκωθεί ελαφρώς, με αυτόν τον τρόπο δεν θα σύρθηκε στην τρύπα που έκοψα στη σανίδα LS. Στεγνώστε για 30 λεπτά.
  • Ομοίως, κολλήστε το 3 ⅜ "x 1" κατά μήκος του άκρου 3 ⅜ "της πλατφόρμας. Στεγνώστε για 30 λεπτά. Στη συνέχεια κολλήστε τη δεύτερη πλευρά 4 "x 1" στην αντίθετη πλευρά της πρώτης. Στεγνώστε για 30 λεπτά.
  • Αφήστε στην άκρη το μπροστινό άκρο προς το παρόν. Θα είναι το τελευταίο πράγμα που κολλάει στο συρτάρι.
  • Όταν τελειώσετε, ελέγξτε αν ταιριάζει στην τρύπα που πατήσατε στη σανίδα LSM. Εάν όχι, τρίψτε την τρύπα έως ότου το συρτάρι γλιστρήσει εύκολα μέσα και έξω και δεν υπάρχει αντίσταση.

Βήμα 3: Τοποθέτηση του πλαισίου μαζί

Τοποθέτηση του πλαισίου μαζί
Τοποθέτηση του πλαισίου μαζί
Τοποθέτηση του πλαισίου μαζί
Τοποθέτηση του πλαισίου μαζί
Τοποθέτηση του πλαισίου μαζί
Τοποθέτηση του πλαισίου μαζί

Με όλα τα μέρη ολοκληρωμένα μπορούμε να αρχίσουμε να συναρμολογούμε ολόκληρο το πλαίσιο.

  • Κολλήστε τη σανίδα LSM στο κέντρο της γυάλινης οπής με ½”σε κάθε πλευρά. Βεβαιωθείτε ότι είναι κολλημένο με ½”μακριά από την τρύπα (όπως φαίνεται στην εικόνα 1). Στεγνώστε για 30 λεπτά.
  • Κολλήστε την πρώτη σανίδα SSM με την άκρη να αγγίζει το εσωτερικό της σανίδας LSM που μόλις κολλήθηκε. (Χρησιμοποιήστε ένα χάρακα για να βεβαιωθείτε ότι είναι κολλημένο σε ευθεία). Στεγνώστε για 30 λεπτά.
  • Πάρτε την άλλη πλευρά LSM και κολλήστε παρόμοια με την πρώτη. Βεβαιωθείτε ότι είναι ½”μακριά από την τρύπα και ότι ο SSM που μόλις προσαρτήθηκε είναι κολλημένος στο εσωτερικό της σανίδας. Στεγνώστε για 30 λεπτά.
  • Κολλήστε το τελευταίο SSM στο επάνω άκρο. Δεδομένου ότι έχετε δύο LSM και στις δύο πλευρές, ανάλογα με το πόσο ίσια τα συνδέσατε, ίσως χρειαστεί να τρίψετε τις πλευρές του SSM προς τα κάτω για να βεβαιωθείτε ότι ταιριάζει (η κοπή μου είναι μερικές φορές απενεργοποιημένη). Στεγνώστε για 30 λεπτά.
  • Μετρήστε τον μικρό χώρο μεταξύ του κάτω μέρους του συρταριού και του πλαισίου. Κόψτε ένα κομμάτι ξύλου MDF με αυτή τη μέτρηση, κατά 4 ". Θέλετε να κάνετε αυτό το κομμάτι κοντά στο συρτάρι αλλά δεν το αγγίζετε. Έχει σκοπό να στηρίξει το συρτάρι με ελάχιστη τριβή.
  • Όταν τελειώσω, έβαψα με σπρέι το πλαίσιο έτσι ώστε όλα τα κομμάτια να ταιριάζουν.

Βήμα 4: Για τον καθρέφτη

Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη
Για τον καθρέφτη

Το μονόδρομο συγκολλητικό φιλμ που αγόρασα από το Amazon ήταν περίπου 10 $. Υπάρχουν καλύτερης ποιότητας που είναι λίγο πιο ακριβά αν σας ενδιαφέρει. Αυτό που χρησιμοποιώ αντανακλά, αλλά μπορείτε να πείτε ότι δεν είναι ένας κανονικός καθρέφτης που θα βλέπατε σε ένα σπίτι. Τα πιο ακριβά θα σας δώσουν αυτό το βλέμμα.

  • Καθαρίστε το γυαλί με καθαριστικό γυαλιού και στις δύο πλευρές.
  • Ξετυλίξτε την κόλλα μονής κατεύθυνσης και βάλτε το γυαλί από πάνω. Κόψτε την κόλλα έτσι ώστε να υπάρχει τουλάχιστον ½”περίσσεια σε κάθε πλευρά του γυαλιού.
  • Αφήστε το ποτήρι στην άκρη και βρέξτε τη μία πλευρά του με νερό. Στη συνέχεια, αφαιρέστε το πλαστικό παλτό από την κόλλα μονής κατεύθυνσης και ψεκάστε με νερό την πρόσφατα εκτεθειμένη πλευρά.
  • Τοποθετήστε την υγρή πλευρά του γυαλιού στην υγρή πλευρά της κόλλας. Αφήστε να καθίσει για 30 λεπτά.
  • Αναποδογυρίστε και χρησιμοποιήστε τον αντίχειρά σας για να ισιώσετε τυχόν φυσαλίδες μεταξύ της κόλλας και του γυαλιού. Στη συνέχεια κόψτε την περίσσεια κόλλας από τις άκρες.

Βήμα 5: Εγκαταστήστε το Raspbian Stretch

Αυτή ήταν η πρώτη μου φορά που βυθίστηκα στο περιβάλλον Raspberry Pi και άρχισα να ψάχνω για οδηγίες σχετικά με τον τρόπο εγκατάστασης του λειτουργικού συστήματος. Βρήκα τελικά ένα απλό σεμινάριο στο Youtube από το TeCoEd που πέρασε από τη διαδικασία εγκατάστασης του Stretch στην κάρτα SD (με μια αρκετά όμορφη εισαγωγή επίσης). Εδώ είναι ο σύνδεσμος σε αυτό το σεμινάριο:

Στην ουσία, το μόνο που χρειάζεται να κάνετε είναι:

  • Διαμορφώστε την κάρτα SD επιλέγοντας το Drive >> Drive Tools >> Format. Κατεβάστε το αρχείο 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 όχι). Έτσι, μετά τη σύνδεση της κάμερας στη σωστή θύρα ακολουθήστε τα εξής βήματα:

  • Ανοίξτε ένα τερματικό εντολών και πληκτρολογήστε sudo raspi-config
  • Επιλέξτε "Ενεργοποίηση κάμερας" (αυτό μπορεί να βρεθεί στην επιλογή συσκευών)
  • Πατήστε "Enter"
  • Μεταβείτε στο "Τέλος" Και θα σας ζητηθεί να κάνετε επανεκκίνηση

Στη συνέχεια, ακολουθήστε αυτά τα βήματα:

  • Μεταβείτε στο κύριο μενού του Raspberry (επάνω αριστερά)
  • Προτιμήσεις
  • Διαμόρφωση Raspberry Pi
  • Διεπαφές
  • Στη συνέχεια, στην Κάμερα, επιλέξτε "Ενεργοποιημένο"
  • Εντάξει τότε"

Τώρα θα πρέπει να είστε σε θέση να εκτελέσετε με επιτυχία αυτό το σενάριο από το σεμινάριο του MJRoBot για να δοκιμάσετε την κάμερα (θυμηθείτε ότι όλος αυτός ο κώδικας συν μια πιο εμπεριστατωμένη περιγραφή βρίσκεται στον παραπάνω σύνδεσμο για το σεμινάριο του MJRobot):

εισαγωγή numpy ως np

εισαγωγή cv2 cap = cv2. VideoCapture (0) cap.set (3, 640) # set Πλάτος cap.set (4, 480) # set ightψος ενώ (True): ret, frame = cap.read () frame = cv2. flip (καρέ, -1) # Αναστροφή κάμερας κάθετα γκρι = cv2.cvtColor (πλαίσιο, cv2. COLOR_BGR2GRAY) cv2.imshow ("πλαίσιο", πλαίσιο) cv2.imshow ("γκρι", γκρι) k = cv2.waitKey (30) & 0xff αν k == 27: # πατήστε 'ESC' για να κλείσετε το cap cap.release () cv2.destroyAllWindows ()

Ο προηγούμενος κώδικας θα πρέπει να εμφανίζει δύο παράθυρα, το ένα έγχρωμο και το άλλο σε κλίμακα του γκρι. Αν τα καταφέρατε μέχρι εδώ νομίζω ότι αξίζετε ένα ωραίο σάντουιτς.

Βήμα 8: Συλλογή δεδομένων και δεδομένων κατάρτισης

Συλλογή δεδομένων και δεδομένων εκπαίδευσης
Συλλογή δεδομένων και δεδομένων εκπαίδευσης
Συλλογή δεδομένων και δεδομένων εκπαίδευσης
Συλλογή δεδομένων και δεδομένων εκπαίδευσης
Συλλογή δεδομένων και δεδομένων εκπαίδευσης
Συλλογή δεδομένων και δεδομένων εκπαίδευσης

Στο παρεχόμενο σεμινάριο, ο συγγραφέας εμβαθύνει πολύ περισσότερο στις διαδικασίες του κώδικα που πρόκειται να παρασχεθεί σύντομα, αλλά επειδή αυτές είναι οδηγίες για το πώς φτιάχτηκε αυτός ο καθρέφτης, δεν θα μπω σε βάθος για την ιστορία ούτε για τις περίπλοκες μηχανικές. Σας συνιστώ ωστόσο να αφιερώσετε ένα μήνα στη ζωή σας διαβάζοντας αυτά τα δύο πράγματα, καθώς μπορούν να εξυπηρετήσουν καλά το μυαλό σας.

Υπάρχουν μόνο περίπου τρία ακόμη σενάρια για να μπορέσουμε να λειτουργήσουμε όλο αυτό. Το πρώτο είναι για τη συλλογή δεδομένων, το δεύτερο είναι για την εκπαίδευση και το τελευταίο είναι για αναγνώριση. Η συλλογή δεδομένων απαιτεί τη λήψη και την αποθήκευση πραγματικών εικόνων του προσώπου σε συγκεκριμένο μέρος για προπόνηση. Ο δημιουργός αυτού του κώδικα το έκανε πολύ απλό να γίνει όλο αυτό, γι 'αυτό συνιστώ να ακολουθήσετε αυτές τις οδηγίες για να αποφύγετε τον πονοκέφαλο.

Ανοίξτε μια γραμμή εντολών και δημιουργήστε έναν νέο κατάλογο που θα το ονομάζει κάτι διασκεδαστικό (κάλεσα το δικό μου FaceRec)

mkdir FaceRec

Τώρα, αλλάξτε τον κατάλογο σε FaceRec και κάντε έναν υποκατάλογο που θα είναι βέβαιο ότι θα ονομάσει το σύνολο δεδομένων

cd 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 = είσοδο ('\ n εισαγωγή αναγνωριστικού χρήστη πατήστε ==>') εκτύπωση ("\ n [ΠΛΗΡΟΦΟΡΙΕΣ] Αρχικοποίηση λήψης προσώπου. Κοιτάξτε την κάμερα και περιμένετε …") # Αρχικοποίηση ατομικού αριθμού δειγματοληψίας προσώπου count = 0 while (True): ret, img = cam.read () img = cv2.flip (img, -1) # flip video video vertually grey = cv2.cvtColor (img, cv2. COLOR_BGR2GRAY) πρόσωπα = face_detector.detectMultiScale (γκρι, 1,3, 5) για (x, y, w, h) στις όψεις: cv2. ορθογώνιο (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: break elif count> = 30: # Πάρτε 30 δείγματα προσώπου και σταματήστε το βίντεο brea k print ("\ n [INFO] Exiting Program and cleanup stuff") cam.release () cv2.destroyAllWindows ()

Σε αυτό το σημείο, βεβαιωθείτε ότι έχετε εγκαταστήσει μαξιλάρι στο Pi. Εάν όχι, εκτελέστε την εντολή:

μαξιλάρι εγκατάστασης pip

Αφού ολοκληρωθεί αυτό, μπορείτε να εκτελέσετε το σενάριο εκπαίδευσης (δεύτερο σενάριο) το οποίο θα σας παρέχει απρόσκοπτα ένα αρχείο.yaml που θα χρησιμοποιηθεί στο τελικό σενάριο

import cv2import numpy as np from PIL import Image import os # Path for face image path path = 'dataset' αναγνώριση = cv2.face. LBPHFaceRecognizer_create () detector = cv2. CascadeClassifier ("haarcascade_frontalface_default.xml"); # λειτουργία για λήψη εικόνων και ετικετών def getImagesAndLabels (path): imagePaths = [os.path.join (path, f) for f in os.listdir (path)] faceSamples = ids = for imagePath in imagePaths: PIL_img = Image.open (imagePath).convert ('L') # μετατρέψτε το σε κλίμακα του γκρι img_numpy = np.array (PIL_img, 'uint8') id = int (os.path.split (imagePath) [-1]. split (".") [1]) face = 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 [ΠΛΗΡΟΦΟΡΙΕΣ] Εκπαιδευτικά πρόσωπα. Θα χρειαστούν λίγα δευτερόλεπτα. Περιμένετε …") πρόσωπα, ids = getImagesAndLabels (διαδρομή) αναγνωριστικό. εκπαίδευση (πρόσωπα, np.array (ids)) # Αποθηκεύστε το μοντέλο σε trainer/trainer.yml αναγνωριστικό.write ('trainer/trainer.yml') # αναγνωριστικό.αποθήκευση () σε Mac, αλλά όχι σε Pi # Εκτύπωση του αριθμού των προσώπων που έχουν εκπαιδευτεί και τερματισμός εκτύπωσης προγράμματος ("\ n [INFO] {0} εκπαιδεύονται πρόσωπα. Έξοδος από το πρόγραμμα".format (len (np.unique (id))))

Αυτό που είναι ωραίο σε αυτό το σύνολο σεναρίων είναι ότι μπορούν να εισαχθούν πολλαπλά πρόσωπα στο σύστημα, πράγμα που σημαίνει ότι πολλά άτομα μπορούν να έχουν πρόσβαση στα εσωτερικά του καθρέφτη, αν το επιθυμούν.

Πιο κάτω έχω το σενάριο Data Capture και το Training script διαθέσιμο για λήψη.

Βήμα 9: Χρόνος αναγνώρισης προσώπου

Χρόνος αναγνώρισης προσώπου
Χρόνος αναγνώρισης προσώπου
Χρόνος αναγνώρισης προσώπου
Χρόνος αναγνώρισης προσώπου

Τέλος, μπορούμε να εκτελέσουμε το σενάριο αναγνώρισης. Προστέθηκε περισσότερος κώδικας σε αυτό το σενάριο για να καταστεί η διαδικασία του κινητήρα λειτουργική, οπότε θα εξηγήσω αυτά τα μέρη λίγο πιο διεξοδικά. Θα το χωρίσω σε ενότητες, αλλά θα βάλω ολόκληρο το σενάριο στο τέλος του βήματος, αν αυτό επιδιώκετε.

Θα ξεκινήσουμε με την εισαγωγή όλων των ενοτήτων που θα χρειαστούμε και στη συνέχεια με τη ρύθμιση της λειτουργίας GPIO σε GPIO. BCM

εισαγωγή numpy ως np

εισαγωγή και εισαγωγή χρόνου εισαγωγής RPi. GPIO ως GPIO GPIO.setwarnings (False) GPIO.setmode (GPIO. BCM)

Αυτή η επόμενη λίστα με το όνομα ControlPin είναι μια σειρά αριθμών που αντιπροσωπεύει ακίδες εξόδου που θα χρησιμοποιηθούν για το βηματικό μοτέρ μας.

ControlPin = [14, 15, 18, 23]

Ο βρόχος for-loop ορίζει αυτές τις ακίδες ως Έξοδοι και στη συνέχεια βεβαιώνεται ότι είναι απενεργοποιημένες. Έχω ακόμα κάποιον κωδικό εδώ για να αφήσω το συρτάρι να κλείσει με το πάτημα ενός κουμπιού, αλλά αποφάσισα να χρησιμοποιήσω ένα χρονόμετρο αντ 'αυτού.

GPIO.setup (ControlPin , GPIO. OUT)

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

Οι επόμενες δύο μεταβλητές είναι ακολουθίες που θα χρησιμοποιήσουμε για να οδηγήσουμε τον κινητήρα. Έμαθα αυτές τις πληροφορίες από ένα υπέροχο βίντεο του Gaven MacDonald το οποίο συνιστώ ανεπιφύλακτα να παρακολουθήσετε καθώς εμβαθύνει όχι μόνο στον κώδικα αλλά και στον πραγματικό κινητήρα (βρίσκεται εδώ: https://www.youtube.com/embed/Dc16mKFA7Fo) Το Ουσιαστικά, κάθε ακολουθία θα επαναληφθεί χρησιμοποιώντας τους ένθετους βρόχους στις επερχόμενες συναρτήσεις openComp και closeComp. Αν κοιτάξετε προσεκτικά το seq2 είναι ακριβώς το αντίθετο του seq1. Ναι, το μαντέψατε. Το ένα είναι για τη μετακίνηση του κινητήρα προς τα εμπρός και το άλλο για την όπισθεν.

seq1 =

seq2 =

Ξεκινώντας με τη λειτουργία openComp, δημιουργούμε έναν βρόχο for που θα επαναλαμβάνεται 1024 φορές. Σύμφωνα με το βίντεο του MacDonald's, οι επαναλήψεις 512 θα παρέχουν πλήρη περιστροφή του κινητήρα και διαπίστωσα ότι περίπου δύο περιστροφές είχαν καλό μήκος, αλλά αυτό μπορεί να ρυθμιστεί ανάλογα με το μέγεθος του ατόμου. Ο επόμενος βρόχος για επάνω αποτελείται από 8 επαναλήψεις προκειμένου να ληφθούν υπόψη οι 8 πίνακες που βρέθηκαν στην seq1 και seq2. Και τέλος, ο τελευταίος βρόχος επαναλαμβάνεται τέσσερις φορές για τα τέσσερα αντικείμενα που βρίσκονται σε κάθε έναν από αυτούς τους πίνακες, καθώς και για τις 4 καρφίτσες GPIO στις οποίες έχουμε συνδέσει το μοτέρ μας. Η παρακάτω γραμμή επιλέγει την καρφίτσα GPIO και στη συνέχεια την ενεργοποιεί ή απενεργοποιεί ανάλογα με την επανάληψη που είναι ενεργοποιημένη. Η γραμμή μετά παρέχει λίγο χρόνο αποθήκευσης για να μην περιστρέφεται καθόλου ο κινητήρας μας. Αφού ο κινητήρας περιστραφεί για να μετακινήσει το συρτάρι έξω, κοιμάται για 5 δευτερόλεπτα πριν προχωρήσει. Αυτός ο χρόνος μπορεί να ρυθμιστεί εδώ ή μπορείτε να ενεργοποιήσετε τον κωδικό που σχολιάζεται και επιτρέπει τη χρήση ενός κουμπιού για προώθηση με το σενάριο και όχι με χρονοδιακόπτη.

για i στην περιοχή (1024):

για μισό βήμα στην περιοχή (8): για ακίδα στην περιοχή (4): GPIO.output (ControlPin [pin], seq1 [halfstep] [pin]) time.sleep (.001) "" "while True: if GPIO.input (2) == GPIO. LOW: διάλειμμα; "" time.sleep (5)

Η λειτουργία closeComp λειτουργεί με παρόμοιο τρόπο. Αφού ο κινητήρας γυρίσει πίσω, προχωράω στο να θέσω τους τελευταίους ακροδέκτες GPIO σε χαμηλά επίπεδα, για να βεβαιωθώ ότι δεν σπαταλάμε ενέργεια και στη συνέχεια προσθέτω άλλα τρία δευτερόλεπτα πριν συνεχίσω.

για i στην περιοχή (1024):

για μισό βήμα στο εύρος (8): για καρφίτσα στην περιοχή (4): GPIO.output (ControlPin [pin], seq2 [halfstep] [pin]) time.sleep (.001) print ("Compartment Closed") GPIO.output (ControlPin [0], 0) GPIO.output (ControlPin [3], 0) time.sleep (3)

Το μεγαλύτερο μέρος του επόμενου μέρους χρησιμοποιείται για τη ρύθμιση της κάμερας και την έναρξη της αναγνώρισης προσώπου. Και πάλι, οι οδηγίες του MKRoBot μπαίνουν στα μέρη περισσότερο, αλλά προς το παρόν, απλώς δείχνω τα μέρη που χρησιμοποιούνται για τον καθρέφτη.

Πρώτα άλλαξα τα ονόματα της λίστας έτσι ώστε το όνομά μου να βρίσκεται στο ευρετήριο που του ανέθεσα κατά τη συλλογή των δεδομένων (στην περίπτωσή μου 1). Και έπειτα έθεσα τις υπόλοιπες τιμές σε Καμία αφού δεν είχα άλλα πρόσωπα στο σύνολο δεδομένων.

ονόματα = ['Κανένας', 'Ντάνιελ', 'Κανένας', 'Κανένας', 'Κανένας', 'Κανένας]

Οι τελευταίες γραμμές κώδικα εφαρμόζονται στο thicc for-loop. Δημιούργησα μια μεταβλητή για να αποθηκεύσω την εμπιστοσύνη ως ακέραιο (intConfidence) πριν η μεταβλητή εμπιστοσύνη μετατραπεί σε συμβολοσειρά. Στη συνέχεια, χρησιμοποιώ μια δήλωση if για να ελέγξω εάν η εμπιστοσύνη είναι μεγαλύτερη από 30 και αν το αναγνωριστικό (ποιο άτομο εντοπίζει ο υπολογιστής, στην περίπτωση αυτή, "Daniel") είναι ίσο με το όνομά μου. Αφού επιβεβαιωθεί αυτό, καλείται η λειτουργία openComp η οποία (όπως εξηγήθηκε προηγουμένως) μετακινεί τον κινητήρα, ξεκινάει μετά από 5 δευτερόλεπτα και μετά προχωράει στο κλείσιμο του Comp, το οποίο κινεί τον κινητήρα προς την αντίθετη κατεύθυνση και κάνει λίγο καθαρισμό πριν προχωρήσει με το βρόχο thicc.

εάν intConfidence> 30 και id == 'Daniel':

openComp () closeComp ()

Ένα σφάλμα που βρήκα εδώ είναι ότι μερικές φορές μετά την επιστροφή του closeComp, ο κώδικας συνεχίζεται, αλλά η δήλωση if-condition υπό όρους διαπιστώνεται ότι είναι ξανά αληθής σαν να διαβάζει ροή βίντεο που βρίσκεται ακόμα στο buffer. Αν και δεν συμβαίνει κάθε φορά που δεν έχω βρει ακόμα έναν τρόπο να διασφαλίσω ότι δεν θα συμβεί ποτέ, οπότε αν κάποιος έχει ιδέες, ενημερώστε με στα σχόλια.

Εδώ είναι ολόκληρο το σενάριο όλα σε ένα μέρος (και ακριβώς κάτω από αυτό είναι το αρχείο με δυνατότητα λήψης):

εισαγωγή 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).

Στη συνέχεια, χρησιμοποίησα σούπερ κόλλα στις αντίθετες όψεις των τρισδιάστατων αγκώνων για να κολλήσω το Pi ακριβώς πάνω από το συρτάρι στο πλαίσιο. Αφού άφησα την κόλλα να στεγνώσει, μπόρεσα να αφαιρέσω ή να αντικαταστήσω το Pi στη θέση του απλά και βολικά μόνο με τις δύο βίδες. Έχω το.stl για τον αγκώνα που συνδέεται παρακάτω.

Τώρα απλά συνδέστε το πρόγραμμα οδήγησης κινητήρα στο PI με IN1, IN2, IN3, IN4 που συνδέονται με GPIO 14, 15, 18, 23 αντίστοιχα. Τέλος, συνδέστε τις ακίδες 5v και Ground της πλακέτας ελεγκτή στην έξοδο 5v και τις ακίδες γείωσης του Pi.

Ακολουθεί ένας σύνδεσμος προς το Pinout Pinout για κάποια αναφορά:

Βήμα 11: Τοποθέτηση της κάμερας

Τοποθέτηση της κάμερας
Τοποθέτηση της κάμερας
Τοποθέτηση της κάμερας
Τοποθέτηση της κάμερας
Τοποθέτηση της κάμερας
Τοποθέτηση της κάμερας

Η τοποθέτηση της κάμερας ήταν ελαφρώς λιγότερο ανθεκτική από την Pi, αλλά η μέθοδος τελείωσε. Αφού σχεδίασα και εκτύπωσα μια λεπτή δέσμη με 2 οπές σε κάθε άκρο, στερέωσα τη δέσμη στο Rasberry Pi μέσω της οπής στερέωσής της. Στη συνέχεια, απλά συνδέστε την κάμερα στο αντίθετο άκρο της δέσμης με μια άλλη βίδα. Τα-ντα! Φαίνεται αρκετά μύγα.

Βήμα 12: Δημιουργία και τοποθέτηση μηχανισμού συρταριού-μετακίνησης

Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης
Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης
Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης
Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης
Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης
Δημιουργία και τοποθέτηση του συρταριού-μηχανισμός κίνησης

Αυτό το βήμα έγινε εύκολο χάρη στα πάντα καλοπροαίρετα δώρα της κοινότητας των δημιουργών. Μετά από μια γρήγορη αναζήτηση στο Thingiverse μπόρεσα να βρω έναν γραμμικό ενεργοποιητή που δημιουργήθηκε από την TucksProjects (που βρίσκεται εδώ: https://www.thingiverse.com/thing:2987762). Το μόνο που έμενε ήταν να το χτυπήσουμε σε μια κάρτα SD και να αφήσουμε τον εκτυπωτή να κάνει τη δουλειά.

Κατέληξα να μπω στο Fusion 360 και επεξεργάστηκα το κίνητρο αφού ο άξονας του κινητήρα μου ήταν πολύ μεγάλος για αυτόν που παρέχεται από το TucksProjects. Έχω το.stl για αυτό παρακάτω. Αφού ολοκληρωθεί η εκτύπωση, το μόνο που χρειάζεται είναι να το συναρμολογήσουμε τοποθετώντας το εξάρτημα στον άξονα του κινητήρα, στη συνέχεια συνδέοντας τις πλευρές του κινητήρα και του περιβλήματος με 2 βίδες (βεβαιωθείτε ότι έχετε τοποθετήσει το ράφι ενδιάμεσα πριν το κλείσετε). Κατέληξα να κόψω μια ίντσα από το ράφι έτσι ώστε να ταιριάζει ανάμεσα στο συρτάρι και το πλαίσιο.

Τώρα το μόνο που απομένει είναι η σύνδεση του μηχανισμού στο πλαίσιο και το συρτάρι. «ΑΛΛΑΞΕ ΠΩΣ ΘΑ ΤΟ ΚΑΝΟΥΜΕ;» ρωτάς … ναι, πες το μαζί μου: Super Glue. Όπως φαίνεται στις παραπάνω εικόνες, απλώς τοποθετήστε τον μηχανισμό στο κάτω μέρος του πλαισίου και σπρώξτε τον προς τα πάνω στο ξύλο στο οποίο γλιστράει το συρτάρι. Είναι ζωτικής σημασίας εδώ να προσπαθήσετε να πάρετε το ράφι/μηχανισμό όσο το δυνατόν πιο παράλληλα με το πλαίσιο έτσι ώστε όταν ο μηχανισμός κινείται να σπρώχνει το συρτάρι ευθεία και όχι υπό γωνία. Αφού στεγνώσει η κόλλα, τοποθετήστε άλλη κόλλα στην άκρη της σχάρας και μετακινήστε το συρτάρι στη θέση του και αφήστε το να στεγνώσει. Μόλις ολοκληρωθεί, έχουμε έναν ανθεκτικό μηχανισμό για να σύρετε το μυστικό μας συρτάρι μέσα και έξω.

Βήμα 13: Προσθήκη χαρτονιού πίσω από τον καθρέφτη

Προσθήκη χαρτονιού πίσω από τον καθρέφτη
Προσθήκη χαρτονιού πίσω από τον καθρέφτη
Προσθήκη χαρτονιού πίσω από τον καθρέφτη
Προσθήκη χαρτονιού πίσω από τον καθρέφτη
Προσθήκη χαρτονιού πίσω από τον καθρέφτη
Προσθήκη χαρτονιού πίσω από τον καθρέφτη

Προκειμένου αυτή η αμφίδρομη ταινία να μοιάζει περισσότερο με καθρέφτη, διαπίστωσα ότι εξυπηρετεί τον σκοπό μας να τοποθετήσουμε χαρτόνι πίσω από το γυαλί. Το χαρτόνι που χρησιμοποιείται είναι αυτό που συνοδεύει το πλαίσιο αλλά οποιοδήποτε κομμάτι κομμένο για να ταιριάξει θα λειτουργήσει. Αυτό εξασφαλίζει επίσης ότι δεν υπάρχει φως από τη λυχνία LED της κάμερας, το χειριστήριο του μοτέρ ή τις ενδείξεις Pi στην άλλη πλευρά του καθρέφτη. Με τα πάντα στη θέση τους χρησιμοποιήστε ένα μολύβι για να σημειώσετε πού κάθεται η κάμερα στο χαρτόνι. Στη συνέχεια, χρησιμοποιήστε ένα ξυράφι για να κόψετε ένα ορθογώνιο, έτσι ώστε η κάμερα να μπορεί να κοιτάξει όταν είναι στη θέση της.

Βήμα 14: Τοποθέτηση του τελικού κομματιού

Βάζοντας το τελικό κομμάτι
Βάζοντας το τελικό κομμάτι
Βάζοντας το τελικό κομμάτι
Βάζοντας το τελικό κομμάτι

Το τελευταίο πράγμα που πρέπει να κάνετε είναι να βάλετε το μπροστινό μέρος του συρταριού που είχε παραμεριστεί νωρίτερα. Μετακινήστε τον κινητήρα έτσι ώστε το συρτάρι να βγει έξω. Στη συνέχεια κολλήστε το μπροστινό μέρος έτσι ώστε το κομμάτι του συρταριού να είναι κεντραρισμένο (θα πρέπει να υπάρχει λίγο κρέμασμα από όλες τις πλευρές. Στη συνέχεια, μπορείτε απλά να το κρεμάσετε σε έναν τοίχο.

Βήμα 15: Τελικό

Τελικό
Τελικό
Τελικό
Τελικό

Ορίστε το! Υπάρχουν αρκετές βελτιώσεις που θα μπορούσαν να γίνουν, όπως η προσθήκη του κουμπιού, η αγορά καλύτερης αμφίδρομης ταινίας και η διόρθωση αυτού του σφάλματος στον κώδικα, αλλά συνολικά, η δουλειά γίνεται: μοιάζει με καθρέφτη, αναγνωρίζει το προκαθορισμένο πρόσωπο του χρήστη και ανοίγει εκείνο το χαριτωμένο μικρό συρτάρι. Όπως πάντα, θα ήθελα να ακούσω τις σκέψεις, τις ερωτήσεις και τα απομνημονεύματά σας στα σχόλια παρακάτω.

Συνολική βαθμολογία: 10/10

Σχόλια: #Don'tNotTryAgain… εκτός αν μπορούσα να ακολουθήσω αυτό το διδακτικό;)

Πρόκληση Μυστικού Διαμερίσματος
Πρόκληση Μυστικού Διαμερίσματος
Πρόκληση Μυστικού Διαμερίσματος
Πρόκληση Μυστικού Διαμερίσματος

Μεγάλο Βραβείο στο Secret Compartment Challenge

Συνιστάται: