Κώδικας: Χάστε το κεφάλι σας με το OpenCV - 💡 Fix My Ideas

Κώδικας: Χάστε το κεφάλι σας με το OpenCV

Κώδικας: Χάστε το κεφάλι σας με το OpenCV


Συγγραφέας: Ethan Holmes, 2019

Το OpenCV είναι μια "βιβλιοθήκη λειτουργιών προγραμματισμού για όραμα ηλεκτρονικού υπολογιστή σε πραγματικό χρόνο". Ένα έργο ανοιχτού κώδικα υποστηριζόμενο από το Willow Garage, η βιβλιοθήκη περιέχει πάνω από 500 αλγόριθμους για χειρισμό εικόνας, ανίχνευση αντικειμένων, εξαγωγή χαρακτηριστικών και διάφορα άλλα εργαλεία που μπορείτε να χρησιμοποιήσετε γράψτε προγράμματα που μπορούν να "βλέπουν".

Η βιβλιοθήκη OPENCV Processing and Java, ένα έργο που υποστηρίζεται από τον Stéphane Cousot και τον Douglas Edric Stanley στο πανεπιστήμιο d'Art d'Aix-en-Provence, παρέχει ένα περιτύλιγμα που σας επιτρέπει να χρησιμοποιήσετε ένα υποσύνολο OpenCV σε επεξεργασία. Προς τιμήν του Halloween, αυτό το κιβώτιο κώδικα θα σας δείξει πώς μπορείτε να χρησιμοποιήσετε το OpenCV για να αφαιρέσετε τα κεφάλια των ανθρώπων σε πραγματικό χρόνο από μια ροή βίντεο. Για παράδειγμα:

Οι μελλοντικές αναρτήσεις θα καλύπτουν λιγότερο φρικτές εφαρμογές για αυτήν την εκπληκτική βιβλιοθήκη.

Εγκατάσταση επεξεργασίας OpenCV και βιβλιοθήκη Java

Το πρώτο βήμα στη χρήση της βιβλιοθήκης είναι να το κατεβάσετε και να το εγκαταστήσετε από τη διεύθυνση http://ubaa.net/shared/processing/opencv/. Η τεκμηρίωση του ιστότοπου είναι μεγάλη - απλώς ακολουθήστε τα βήματα που αναφέρονται στις "Οδηγίες εγκατάστασης" στην κύρια σελίδα. Μόλις ακολουθήσετε τα βήματα, πυροβολήστε την Επεξεργασία και έπειτα δοκιμάστε τον κώδικα στο παράδειγμα detection (), το οποίο τοποθετεί ένα κόκκινο ορθογώνιο γύρω από οποιαδήποτε όψη (μετωπική όψη) που εντοπίστηκε στην κάμερα web. Θα πρέπει να δείτε κάτι τέτοιο:

Σημείωση για χρήστες των Windows: ίσως χρειαστεί να εγκαταστήσετε τοQuicktime και το WinVDIG για να χρησιμοποιήσετε την κάμερα web στην Επεξεργασία.

Ρύθμιση του σκίτσου

Μόλις έχετε τα βασικά ανιχνεύουν() παράδειγμα εργασίας, μπορείτε να χρησιμοποιήσετε το ακόλουθο σκίτσο.Όπως και με άλλες δημοσιεύσεις αυτής της σειράς, μπορείτε είτε να επισημάνετε όλο το κείμενο στο παρακάτω πλαίσιο και πατήστε ctrl + c ή πηγαίνετε απευθείας στο χώρο αποθήκευσης κώδικα Makezine και αντιγράψτε headless_cam.pde.

Όταν ξεκινάτε το πρόγραμμα, θα πρέπει να δείτε ένα μήνυμα για να "βγείτε από τη σκηνή και να πατήσετε οποιοδήποτε πλήκτρο". Μόλις η ακτή είναι καθαρή, πατήστε οποιοδήποτε πλήκτρο και γυρίστε πίσω στην εικόνα. Εσείς (και οποιοσδήποτε άλλος) θα πρέπει, χάρη στο OpenCV, να είστε απείρως. Καθώς μετακινείτε, θα παρατηρήσετε ότι το κεφάλι σας θα εισβάλει και θα βγαίνει - αυτό συμβαίνει όταν κάτι παρεμβαίνει στον αλγόριθμο ανίχνευσης του OpenCV. Για παράδειγμα, αν βάλετε το χέρι σας μπροστά στο πρόσωπό σας, αυτό θα "σπάσει" τον αλγόριθμο ανίχνευσης OpenCV.

Συζήτηση

Λοιπόν, πώς λειτουργεί αυτό το πράγμα; Είναι πολύ απλό, στην πραγματικότητα - όλο το σκίτσο κάνει αναζήτηση των προσώπων χρησιμοποιώντας το OpenCV ανιχνεύουν() και στη συνέχεια αντικαταστήστε τα ανιχνευμένα πρόσωπα με τα ίδια (αλλά ελαφρώς μεγαλύτερα) εικονοστοιχεία από την εικόνα φόντου που είναι αποθηκευμένα στην αρχή του σκίτσου. Αυτό κάνει το πρόσωπο «να εξαφανιστεί», ως επί το πλείστον. Οι ελαφρές διαφορές στο φωτισμό δημιουργούν μικρές αλλαγές μεταξύ των νέων και των παλαιών εικόνων, καθιστώντας το αντικατεστημένο πρόσωπο εμφανές μάλλον περιορισμένο. Θεωρητικά, θα πρέπει να είστε σε θέση να εξομαλύνετε μερικά από αυτά με άλλες λειτουργίες OpenCV, αλλά αυτό είναι για μελλοντικά έργα.

Το πρώτο βήμα στο σκίτσο είναι να αποθηκεύσετε μια εικόνα της κενής σκηνής φόντου. Αυτό γίνεται από το αντίγραφο() εντολή στην εντολή keyPressed () μέθοδος:

bg.copy (έκκεντρο, 0,0, πλάτος, ύψος, 0,0, πλάτος, ύψος);

Η εντολή απαιτεί δύο εικόνες: α προορισμός εικόνα, όπου θα αντιγραφούν τα εικονοστοιχεία προς το, και ένα πηγή εικόνα, όπου θα αντιγραφούν τα εικονοστοιχεία από. Για να το χρησιμοποιήσετε, καλείτε το αντίγραφο() στην εικόνα προορισμού (στην περίπτωση αυτή, η μεταβλητή bg) και να παράσχει τα εννέα (!) απαιτούμενα επιχειρήματα, τα οποία είναι:

  • ο πηγή εικόνα από την οποία θέλουμε να δημιουργήσουμε ένα αντίγραφο. Σε αυτή την περίπτωση χρησιμοποιούμε τη μεταβλητή έκκεντρο, το οποίο περιέχει το τρέχον πλαίσιο από την κάμερα web.
  • Η περιοχή στην εικόνα προέλευσης που πρόκειται να αντιγραφεί. Αυτή η περιοχή περιγράφεται από τα επόμενα τέσσερα επιχειρήματα: τις συντεταγμένες x και y της άνω αριστεράς γωνίας της περιοχής και το πλάτος και το ύψος της περιοχής.
  • Η περιοχή στην εικόνα προορισμού όπου θα περάσουν τα αντιγραμμένα εικονοστοιχεία. Αυτά είναι παρόμοια με τα προηγούμενα τέσσερα επιχειρήματα και αποτελούνται από τις συντεταγμένες x και y μαζί με το πλάτος και το ύψος της περιοχής. Εάν οι διαστάσεις είναι διαφορετικές μεταξύ της περιοχής προέλευσης και προορισμού, η επεξεργασία θα κλιμακώσει αυτόματα την εικόνα.

Αφού ολοκληρωθεί αυτή η εντολή, θα αποθηκευτεί στην μεταβλητή ένα αντίγραφο της σκηνής φόντου bg. Το επόμενο βήμα είναι να χρησιμοποιήσετε το OpenCV για να αναζητήσετε πρόσωπα. Όπως περιγράφηκε προηγουμένως, αυτό γίνεται χρησιμοποιώντας το ανιχνεύουν() η οποία επιστρέφει μια σειρά από ορθογώνια. Ένα ορθογώνιο είναι μια κλάση που περιλαμβάνεται στην Java, τη γλώσσα βάσης από την οποία προέρχεται η Επεξεργασία. (Ένα από τα δροσερά πράγματα για την Επεξεργασία είναι ότι μπορεί να χρησιμοποιήσει οποιαδήποτε εντολή που μπορείτε να χρησιμοποιήσετε στην Java, καθιστώντας την μια πολύ ισχυρή γλώσσα πράγματι.) Ένα ορθογώνιο έχει τέσσερα βασικά πεδία που μας αφορούν: τις συντεταγμένες x και y του ανώτερου αριστερή γωνία και πλάτος και ύψος. (Ακούγεται οικείο?)

Αν το μόνο που θέλαμε να κάνουμε είναι να αντικαταστήσουμε μόνο το πρόσωπο, μπορούμε απλά να το χρησιμοποιήσουμε αντίγραφο() εντολή αντιγραφής στις αντίστοιχες περιοχές. (Σημείωση: το loadPixels () και updatePixels () η μέθοδος είναι απαραίτητη όταν θέλουμε να έχουμε πρόσβαση ή να ενημερώσουμε τα εικονοστοιχεία μιας εικόνας.) Εδώ είναι ο κώδικας:

fg.copy (έκκεντρο, 0,0, πλάτος, ύψος, 0,0, πλάτος, ύψος); // Αντιγράψτε την εικόνα της κάμερας σε fg opencv.copy (cam). // Αντιγράψτε την εικόνα στην buffer buffer του openCV Ορθογώνιο [] facees = opencv.detect (); / / ανιχνεύει οτιδήποτε μετασχηματίζει ένα FRONTALFACe για (int i = 0; i

Εδώ είναι η έξοδος:

Όπως βλέπετε, η αφαίρεση μόνο του προσώπου δεν είναι απολύτως σωστό, επειδή μεγάλο μέρος του κεφαλιού παραμένει ορατό. Έτσι, θα χρειαστεί επίσης ένας τρόπος για να αυξήσετε το μέγεθος του κουτιού. Αυτή είναι η δουλειά enlargeFaceBox (), το οποίο χρησιμοποιεί ένα κομμάτι τριγωνομετρίας, μεγεθύνει το κουτί με ένα δεδομένο ποσοστό και το μεταφράζει κατά μήκος της διαγώνιας του. Το παρακάτω διάγραμμα δείχνει τι συμβαίνει:

Η σκανδάλη μπαίνει στο παιχνίδι κατά τον υπολογισμό των σωστών μετατοπίσεων που θα σύρουν το ορθογώνιο μέχρι τη διαγώνιο. Η βασική λειτουργία είναι atan2 (), η οποία υπολογίζει τη γωνία μεταξύ δύο σημείων σε σχέση με τον άξονα x. (Η γωνία αυτή συχνά καλείται θήτα από παλαιούς μαθηματικούς). Μόλις έχεις θήτα, μπορείτε να χρησιμοποιήσετε το cos () και αμαρτία() λειτουργίες για τον υπολογισμό των μετατοπίσεων x και y dx και dy. Εδώ είναι ο κώδικας:

(Float incPct, int x, int y, int w, int h) {float r = dist (0,0, w, h) / 2; // Υπολογίζει την ακτίνα του κεντρικού διαγώνιου πλωτήρα theta = atan2 (h, w). // Υπολογίζει τη γωνία του διαγώνιου πλωτήρα dx = r * incPct * cos (theta). // βρίσκει float dy = r * incPct * sin (theta); επιστρέφει νέο ορθογώνιο ((int) (x - dx), (int) (y - dy), (int) (w + 2 * dx), (int) (h + 2 * dy)). }}

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

faceBox = μεγέθυνσηFaceBox (0.75, πρόσωπα [i] .x, πρόσωπα [i] .y, πρόσωπα [i] .width, πρόσωπα [i] .height); αν (faceBox.x <0) {faceBox.x = 0; } εάν (faceBox.x + faceBox.width> πλάτος) {faceBox.width = πλάτος - faceBox.x; } αν (faceBox.y <0) {faceBox.y = 0; } αν (faceBox.y + faceBox.height> ύψος) {faceBox.height = ύψος - faceBox.y; } ...

Και, αυτό είναι. Ελπίζω να βρείτε μια ανατριχιαστική χρήση για αυτό το Halloween.

PS: Μπορείτε να μάθετε τις πλήρεις λεπτομέρειες σχετικά με τον τρόπο εργασίας με εικόνες από το εξαιρετικό εκπαιδευτικό υλικό Εικόνες και εικονοστοιχεία του Daniel Shiffman στην τοποθεσία Processing.org. (Το κεφάλαιο είναι ένα απόσπασμα από το υπέροχο βιβλίο του, "Επεξεργασία της εκμάθησης: ένας οδηγός αρχαρίων για τον προγραμματισμό εικόνων, κινούμενων εικόνων και αλληλεπιδράσεων, το οποίο συνιστώ ανεπιφύλακτα να σηκώσετε αν θέλετε πραγματικά να κυριαρχήσετε την επεξεργασία").

Στο Σπιτάκι Maker:


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



Μπορεί Να Σας Ενδιαφέρει

Δείτε μια έκθεση φωτισμού στο Grand Central Station που γιορτάζει τις γυναίκες στο STEM

Δείτε μια έκθεση φωτισμού στο Grand Central Station που γιορτάζει τις γυναίκες στο STEM


Crest Hardware Art Show

Crest Hardware Art Show


Βρώσιμες Καινοτομίες: 7 Παραγωγοί Τροφίμων που έρχονται στο Faire της Νέας Υόρκης

Βρώσιμες Καινοτομίες: 7 Παραγωγοί Τροφίμων που έρχονται στο Faire της Νέας Υόρκης


Maker Pro News: Δημιουργία Υγείας στο Maker Faire, Comeback του Ιδρυτή του Pebble, και Περισσότερα

Maker Pro News: Δημιουργία Υγείας στο Maker Faire, Comeback του Ιδρυτή του Pebble, και Περισσότερα