• Nenhum resultado encontrado

Κεφάλαιο 3 Ανίχνευση Ακμών

3.6 Gaussian

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

μεταβολές (π.χ. ακμές, ή όρια διαφορετικών περιοχών της εικόνας) αντιστοιχούν σε ψηλές συχνότητες.

Η Gaussian κατανομή σε 1-D έχει τη μορφή:

όπου σ είναι η τυπική απόκλιση της κατανομής. Έχουμε επίσης υποθέσει ότι η κατανομή έχει μέσο μηδέν (δηλαδή είναι επικεντρωμένη στη γραμμή x = 0). Η κατανομή φαίνεται στο Σχήμα 23.

Σχήμα 23: Gaussian κατανομή με μέση τιμή 0 και σ= 1 Σε 2-D, μια ισότροπη (δηλαδή κυκλικά συμμετρική) Gaussian έχει τη μορφή:

Η κατανομή αυτή φαίνεται στο Σχήμα 24.

Σχήμα 24: Gaussian κατανομή με μέση τιμή (0,0) και σ= 1

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

(α) (β)

Σχήμα 25: (α) Κανονική εικόνα, (β) εικόνα που έχει υποστεί φιλτράρισμα Gaussian σ= 2.0 (και το μέγεθος του πυρήνα 9 Χ 9).

3.7 Προσδιορισμός σημε ί ων ακμών με χρήση φί λτρων

Είναι επιθυμητό ο υπολογισμός του μεγέθους της κλίσης για την έυρεση τωνακμών. Ωστόσο δεν υπάρχει κανένας αντικειμενικός τρόπος καθορισμού των σημείων ακμών [4].

Το μέγεθος κλίσης, τώρα μπορεί να θεωρηθεί σαν μια αλυσίδα χαμηλών υπερυψώσεων. Σημειώνοντας τοπικά μέγιστα σημειώνουμε κάποια απομονωμένα σημεία, τις λεγόμενες κορυφές των υπερυψώσεων. Ένα καλύτερο κριτήριο είναι να τεμαχιστεί το μέγεθος κλίσης κατά μήκος της κατεύθυνσης κλίσης η οποία να είναι κάθετη στην ακμή και να σημειωθούν τα σημεία κατά μήκος του κάθε τμήματος όπου το μέγεθος της κλίσης είναι μέγιστο. Αυτή η διαδικασία καλείται μη-μέγιστη καταστολή (non-maximum suppression)[5].

Ουσιαστικά, αναμένεται η εμφάνιση των σημείων ακμών κατά μήκος αλυσίδων που έχουν τη μορφή της καμπύλης. Τα σημαντικά βήματα σε μια μη μέγιστη καταστολή είναι:

Καθορισμός εάν ένα συγκεκριμένο σημείο είναι ένα σημείο ακμής

και, εάν είναι, η εύρεση του επόμενου σημείου ακμής

Με αυτά τα βήματα, είναι εύκολο να απαριθμηθούν όλες οι αλυσίδες ακμών.

Μετά την εύρεση του μέσου σημείου του κάθε χαρακτηριστικού, όπως έγινε

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

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

3.8 Μέθοδοι με βάση τη χρήση ορίου (Thresholding)

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

Αλγόριθμος:

Για όλα τα pixel (i,j) της εικόνας

Αν f(i,j)≥T τότε pixel ανήκει στο αντικείμενο αλλιώς ανήκει στο φόντο

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

Σπάνια μια τέτοια μέθοδος μπορεί να είναι επιτυχημένη όταν χρησιμοποιείται σταθερό κατώφλι Τ για το σύνολο των pixel της εικόνας. Για αυτό το λόγο χρησι- μοποιούνται τοπικά όρια τα οποία εξαρτώνται από τη θέση, δηλαδή το όριο είναι T=T(Pc) όπου Pc είναι το τμήμα της εικόνας για το οποίο τμήμα καθορίστηκε το κατώφλι. Η υπόλοιπη διαδικασία παραμένει η ίδια όπως αναφέρθηκε παραπάνω.

Επίσης η μέθοδος κατωφλίου μπορεί να εφαρμοστεί και σε άλλες ιδιότητες της εικόνας εκτός από τη φωτεινότητα όπως στην τοπική υφή, κλίση κ.α.

Extract ROI Convert to Grayscale Threshold Find contour

Σχήμα 26: Εύρεση σημείων ματιού

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

Κεφάλαιο 4

Υλικά-Κυκλώματα-Λογισμικό Ανάπτυξης

4.1

M.A.V_FFD

Ο M.A.V_FFD πήρε το όνομα από τα αρχικά Monocular Autonomie Vehicle Face Features Detection, τα οποία σημαίνουν μιας κάμερας, αυτόνομο όχημα, λόγω το ότι κινείται αυτόνομα με εντοπισμό χαρακτηριστικών προσώπου. Ζυγίζει 2,5 κιλά περίπου (χωρίς την υπολογιστική μονάδα) και έχει κατασκευαστεί από λεπτή λαμαρίνα.

Σχήμα 27: M.A.V_FFD

M.A.V_FFD

(Monocular Autonomie Vehicle Face Features Detection)

4.2 Κινητήρες

Οι κινητήρες που χρησιμοποιήθηκαν σε αυτή την κατασκευή είναι τύπου DC, η τάση που απαιτείται για τη λειτουργία τους είναι 12V. Ο κάθε ένας από αυτούς συνδέεται με έναν κωδικοποιητή και έναν μειωτήρα για τη μείωση των στροφών σε μια συμπαγή κατασκευή. Είναι ένας ιδανικός κινητήρας για τέτοιες ρομποτικές εφαρμογές καθώς η ροπή του είναι ιδανική για κινήσει ένα όχημα μέχρι και 5 κιλά.

Σχήμα 28 : Κινητήρας (EMG30)

Προδιαγραφές:

Ονομαστική τάση : 12 V Ονομαστική ροπή : 1.5 kg.cm Ονομαστική ταχύτητα : 170 rpm Ονομαστικό ρεύμα: 530 mA Ταχύτητα χωρίς φορτίο : 216 rpm Ρεύμα φορτίου: 150 mA

Ονομαστική ισχύς: 4.22 W 4.3 Ρόδες

Οι ρόδες που χρησιμοποιήθηκαν έχουν διάμετρο 100 χιλιοστά, συνδέονται πολύ εύκολα με τους κινητήρες και είναι από καουτσούκ.

Σχήμα 29 : Ρόδα οχήματος 4.4 MD23 Motor Driver

O MD23 είναι ένας διπλός οδηγός κινητήρων (dual motor driver) το οποίο κατασκευάστηκε αποκλειστικά για να οδηγήσει τον κινητήρα EMG30. Ο MD23 επικοινωνεί με την υπολογιστική μονάδα μέσω του πρωτόκολλου I2C. Μπορούν να

συνδεθούν μέχρι και δυο κινητήρες επάνω του, η ονομαστική του τάση είναι 12V και το μέγιστο ρεύμα το οποίο μπορεί να αντλήσει είναι 3A. Το σήμα συγχρονισμού που στέλνει ταυτόχρονα και στους δυο κινητήρες επιτρέπει τη δημιουργία σε αξιόπιστων συστημάτων.

Σχήμα 30 : MD23 - Dual 12Volt 3Amp H Bridge Motor Drive 4.5 Trust WB-8600R Webcam

Η Trust WB-8600R είναι μια αξιόπιστη κάμερα η οποία είναι κατάλληλη για επεξεργασία εικόνας, έχει ανάλυση 1600 x 1200 Ultra High Definition, 8 megapixel snapshot και δυνατότητα αυτόματης εστίασης (2 megapixel με 25fps). Έχει ενσωματωμένο φως για καλύτερες φωτογραφίες σε περιπτώσεις που δεν υπάρχει φωτισμός, λειτουργία «face tracking», USB 2.0, και Zoom 4x ψηφιακό.

Σχήμα 31 : Trust WB-8600R Webcam

4.6 I2C Πρωτόκολλο

Το I2C είναι ένα πρωτόκολλο πολλαπλών masters, το οποίο σχεδιάστηκε από τη Phillips και χρησιμοποιείται για να συνδέσει χαμηλής ταχύτητας περιφερικά σε μια μητρική πλακέτα, σε μια embedded συσκευή ή σε ένα κινητό. Το I2C χρησιμοποιεί

μόνο δυο open drain, διπλής κατεύθυνσης γραμμές. Η μια ονομάζεται Serial Data Line (SDA) και είναι η γραμμή των δεδομένων και η άλλη λέγεται Serial Clock Line (SCL) και είναι η γραμμή χρονισμού. Τυπικές τιμές των τάσεων που χρησιμο- ποιούνται είναι +5V ή 3,3V. Ο χώρος διευθύνσεων στο I2C καθορίζεται από 7 bit.

Από αυτές τις διευθύνσεις 16 είναι δεσμευμένες επομένως το μέγιστο πλήθος συσκευών που μπορούν να συνδεθούν είναι 112. Συνηθισμένες ταχύτητες είναι 100Kbit/s και 10Kbit/s. Πρέπει να σημειωθεί ότι αυτές είναι οι μέγιστες ταχύτητες μετάδοσης για όλα τα απαιτούμενα δεδομένα, όπως για παράδειγμα διευθύνσεις, σήματα επιβεβαιώσεων κ.α. Άρα η ταχύτητα μετάδοσης δεδομένων του χρήστη είναι μικρότερη. Η χωρητικότητα της γραμμής δεν μπορεί να ξεπεράσει τα 100pF.

Οι κόμβοι στο πρωτόκολλο I2C ανήκουν σε δυο κατηγορίες, στους κόμβους master και στους κόμβους slaves. Ένας κόμβος master μπορεί να επηρεάσει την γραμμή του χρονισμού, ενώ ένας κόμβος slave δεν μπορεί. Το πρωτόκολλο είναι πολλαπλών master γιατί μπορούν να υπάρχουν περισσότεροι από ένας. Επιπλέον ένας κόμβος, που είναι master κάποια στιγμή μπορεί να γίνει slave κάποια άλλη.

Υπάρχουν τέσσερεις τρόποι λειτουργίας για μια συσκευή. Η πρώτη είναι η master transmit κατά την οποία ο κόμβος είναι master και μεταδίδει πληροφορίες σε έναν άλλο κόμβο που είναι slave. Η δεύτερη είναι η master receive κατά την οποία ο κόμβος είναι πάλι master άλλα αυτήν την φορά δέχεται δεδομένα από κάποιον slave κόμβο. Η τρίτη είναι η slave transmit κατά την οποία ο κόμβος είναι slave και στέλνει δεδομένα σε κάποιον master και τέλος η τέταρτη είναι η slave receive κατά την οποία ο κόμβος είναι slave και δέχεται δεδομένα.

Ο κόμβος master είναι αρχικά σε κατάσταση master transmit και στέλνει ένα bit εκκίνησης ακολουθούμενο από 7 bit που αντιπροσωπεύουν τη διεύθυνση του παραλήπτη slave και τέλος υπάρχει και ένα ακόμα bit το οποίο καθορίζει αν ο master θέλει να γράψει (0) ή να διαβάσει κάτι (1) από τον κόμβο slave. Στις διευθύνσεις και στα δεδομένα στέλνονται πρώτα τα πιο σημαντικά bits. Αν ο κόμβος λάβει το μήνυμα τότε απαντάει με ένα ACK bit. Ο master τότε συνεχίζει είτε μεταδίδοντας είτε λαμβάνοντας δεδομένα. Η κάθε αποστολή δεδομένων ξεκινάει με ένα start bit το οποίο υποδηλώνεται από μετάβαση της γραμμής SDA από ψηλά σε χαμηλά και με την γραμμή SCL ψηλά. Η λήξη κάθε αποστολής σηματοδοτείται με την μετάβαση από χαμηλά σε υψηλά της SDA και με την SCL ψηλά. Αν ο master επιθυμεί να στείλει δεδομένα στον slave τότε στέλνει ένα ένα τα bytes αφού πρώτα λάβει κάθε φορά ένα bit ACK από τον slave. Αντίστοιχα πραγματοποιείται και η λήψη δεδομένων από τον master. Μόλις ολοκληρωθεί η αποστολή των δεδομένων στέλνεται ένα STOP bit.

Το I2C καθορίζει τρεις βασικούς τύπους μηνυμάτων καθένα από τα οποία ξεκινάει με ένα start bit και τελειώνει με ένα end bit. Ο πρώτος τύπος είναι μονό μήνυμα, όπου ο master στέλνει δεδομένα στον slave. Ο δεύτερος είναι μονό μήνυμα, όπου ο master διαβάζει μηνύματα από τον slave. O τρίτος είναι πολλαπλά μηνύματα στα οποία ο master πραγματοποιεί τουλάχιστον δυο αποστολές ή λήψεις

δεδομένων σε έναν η περισσότερους slaves. Στα πολλαπλά μηνύματα κάθε αποστολή ή λήψη ξεκινάει με ένα START και την διεύθυνση του slave. Μετά από το πρώτο start ακολουθούν και άλλα χωρίς όμως να συνοδεύονται με STOP. Με αυτόν τον τρόπο γνωρίζουν οι slaves ότι η επόμενη μετάδοση είναι τμήμα του ίδιου μηνύματος

Στο φυσικό επίπεδο και οι δύο γραμμές SDA και SCL είναι open – drain και για αυτό χρειάζονται αντιστάσεις ανόρθωσης τάσης. Η γείωση της γραμμής θεωρείται λογικό μηδέν, ενώ αν η γραμμή αφεθεί να αιωρείται θεωρείται ότι βρίσκεται στην κατάσταση 1. Για συστήματα υψηλής ταχύτητας εφαρμόζονται επιπλέον τεχνικές για την ταχύτερη ανόρθωση των γραμμών τουλάχιστον για αυτή του ρολογιού. Οι αλλαγές στα δεδομένα πραγματοποιούνται πάντα, όταν το ρολόι είναι χαμηλά, ενώ όταν είναι υψηλά μεταφέρονται START και STOP bits.

Σχήμα 32: Οι γραμμές στο I2C είναι open drain και χρειάζονται pull up αντιστάσεις όπως το Rp

Όταν ένας κόμβος μεταδίδει ένα λογικό 1 και ένας άλλος μεταδίδει ένα λογικό 0, τότε ο πρώτος μπορεί να αντιληφθεί την διαφορά γιατί δεν είναι στο λογικό 1. Όταν αυτό πραγματοποιείται στην γραμμή SCL, τότε λέγεται ότι πραγματοποιείται επιμήκυνση ρολογιού (clock stretching) και προσφέρει στους slaves έναν μηχανισμό ελέγχου ροής. Όταν χρησιμοποιείται στο SDA, τότε λέγεται διαιτησία(arbitration) και εξασφαλίζει ότι υπάρχει ένας κόμβος που μεταδίδει πληροφορίες. Στην επιμήκυνση ρολογιού ένας κόμβος ο οποίος επιλέγεται για την μετάδοση πληροφοριών, μπορεί να κρατήσει την γραμμή SCL χαμηλά, αφού λάβει ή αποστείλει τα δεδομένα δείχνοντας με αυτόν τον τρόπο ότι δεν είναι έτοιμος να επεξεργαστεί καινούρια δεδομένα. Ένας master ο οποίος επιθυμεί να επικοινωνήσει με κάποιον slave, προσπαθεί να ανεβάσει την γραμμή SCL για να μεταδώσει το επόμενο bit. Πριν όμως ξεκινήσει πρέπει να επιβεβαιώσει ότι η γραμμή του ρολογιού έχει όντως ξεκινήσει. Αν ο slave πραγματοποιεί επιμήκυνση ρολογιού τότε το ρολόι θα είναι χαμηλά και επομένως ο master δεν θα πραγματοποιήσει την ενέργεια που επιθυμεί. Κάθε master παρακολουθεί τις γραμμές για START και STOP bits και δεν ξεκινάει κάποιο μήνυμα όσο υπάρχει κάποιος άλλος που μεταδίδει. Παρόλα αυτά υπάρχει η περίπτωση δυο masters να μεταδώσουν σχεδόν παράλληλα. Σε αυτήν την περίπτωση πραγματοποιείται διαιτησία. Κάθε κόμβος που μεταδίδει ελέγχει το επίπεδο της γραμμής δεδομένων

και συγκρίνει με τα επίπεδα που αναμένει, αν δεν ταιριάζουν τότε ο κόμβος έχει χάσει την διαιτησία και σταματάει την μετάδοση του.

Σχήμα 33: Διάγραμμα Χρονισμού Γραμμών I2C

Η μετάδοση ξεκινάει με ένα START bit (S), όταν η SDA μεταβαίνει από τα υψηλά στα χαμηλά, όσο η SCL γραμμή είναι υψηλά. Στην SDA τίθενται τα μεταδιδόμενα bits, κάθε φορά που το ρολόι γίνεται χαμηλό και τα δεδομένα δειγματοληπτούνται κάθε φορά που το ρολόι ανεβαίνει. Όταν η μετάδοση τελειώσει, τότε ένα STOP bit μεταδίδεται (P), ανεβάζοντας την γραμμή SDA ψηλά όσο το ρολόι είναι υψηλά[7].

4.7 USB to I2C Interface module

Είναι μια μονάδα η οποία παρέχει μια πλήρη διασύνδεση μεταξύ του υπολογιστή και του dual driver motors. Η μονάδα είναι αυτόνομη και το τροφοδοτείται από το USB καλώδιο και μπορεί να παρέχει 70 mA σε 5V.

Σχήμα 34: USB to I2C Interface module

4.8 OpenCV

Η OpenCV (Open Source Computer Vision Library) είναι μια βιβλιοθήκη λειτουργιών που περιλαμβάνει πάνω από 500 ρουτίνες με τη βοήθεια των οποίων μπορεί να πραγματοποιηθεί αναγνώριση χειρονομιών, παρακολούθηση αντικει- μένων ή και αναγνώριση προσώπου, πάντα μέσα από έναν υπολογιστή. Διαθέτει δικό της interface και μπορεί να εφαρμοστεί σε πάρα πολλές πλατφόρμες ανάπτυ- ξης, αρκεί να χτιστεί προτού αρχίσει η οικοδόμηση του λογισμικού.

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

4.9 Πλατφόρμα Ανάπτυξης

Το λογισμικό έχει υλοποιηθεί στο ολοκληρωμένο περιβάλλον ανάπτυξης Visual Studio 2010 στη γλώσσα προγραμματισμού υψηλού επιπέδου C/C++. Ο βασικότερος λόγος που επιλέχθηκε το συγκεκριμένο περιβάλλον ανάπτυξης είναι η εύκολη σύνδεση με την OpenCV.

Κεφάλαιο 5

Ανάλυση προγράμματος και συστήματος

5.1 Λογισμικό Εφαρμογής

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

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

Ο χρήστης μέσω interfaces μπορεί να πειραματιστεί με κάποιες παραμέτρους, αν και ρυθμίζονται μέσα από το πρόγραμμα.

5.2 Αρχική κατάσταση συστήματος

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

Σχήμα 35: Διάγραμμα λειτουργίας συστήματος Ο κώδικας με τον οποίο γίνεται έλεγχος εάν υπάρχει η κάμερα είναι:

CvCapture *capture;

/* initialize camera */

capture = cvCaptureFromCAM( 0 );

/* always check */

assert( cascade && storage && capture );

Υπολογιστική

Μονάδα Robot

Κάμερα

Κινητήρες Dual

motor driver

if (!assert)

printf("No Camera");

Ο κώδικας με τον οποίο γίνεται έλεγχος εάν υπάρχει σύνδεση μεταξύ της υπολογιστικής μονάδας και του οχήματος είναι:

BOOL GetUSB_I2CVersion() {

BOOL ret;

DWORD n;

BYTE sbuf[100];

sbuf[0] = 0x5A;

sbuf[1] = 0x01;

sbuf[2] = 0x00;

sbuf[3] = 0x00;

ret = WriteFile(hCom, &sbuf, 4, &n, NULL);

ret = ReadFile(hCom, &sbuf, 1, &n, NULL);

ret = (sbuf[0] != 90);//no usb_i2c returns 90!

if (!ret) printf("Error in USB_I2C ");

return ret;

}

Ο κώδικας με τον οποίο ρυθμίζουμε τις παραμέτρους του πρωτόκολου I2C είναι:

void SetupCommPort(LPCTSTR comport) {

DCB dcb;

COMMTIMEOUTS ct;

CloseHandle(hCom);

hCom = CreateFile( comport, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);

GetCommState(hCom, &dcb);

dcb.BaudRate = CBR_19200; //BaudRate dcb.fParity = FALSE; //Parity

dcb.fOutxCtsFlow = FALSE;

dcb.fOutxDsrFlow = FALSE;

dcb.fDtrControl = DTR_CONTROL_DISABLE;

dcb.fDsrSensitivity = FALSE;

dcb.fOutX = FALSE;

dcb.fInX = FALSE;

dcb.fRtsControl = RTS_CONTROL_DISABLE;

dcb.fAbortOnError = FALSE;

dcb.ByteSize = 8; //ByteSize dcb.Parity = NOPARITY;

dcb.StopBits = TWOSTOPBITS; //StopBits SetCommState(hCom, &dcb);

GetCommTimeouts(hCom, &ct);

ct.ReadIntervalTimeout = 500;

SetCommTimeouts(hCom, &ct);

SetCommMask(hCom, EV_RXCHAR);

}

Η συνάρτηση αυτή παίρνει ως όρισμα τη θύρα (Com) με την οποία θα γίνει σύνδεση της υπολογιστικής μονάδας με το όχημα. Αυτό που πρέπει να προσέξουμε είναι οι ρυθμίσεις αυτής της θύρας. Θα πρέπει να βάλουμε της σωστές παραμέτρους που απαιτεί ο controller για την σωστή λειτουργία.

BaudRate:19200

Parity:NO

ByteSize:8

StopBits:2

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

Σχήμα 36: Interface

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

Λήψη Κάμερας

Παράθυρο Στόματος Παράθυρο

Ματιού

Παράθυρο Ματιού (Threshold)

Ρυθμίσεις Δεξιού Ματιού

Ρυθμίσεις Αριστερού Ματιού

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

Παρακάτω δίνεται ο κώδικας για τον εντοπισμό του προσώπου:

#include <stdio.h>

#include "cv.h"

#include "highgui.h"

CvHaarClassifierCascade *cascade;

CvMemStorage *storage;

void detectFaces( IplImage *img );

int main( int argc, char** argv ) {

CvCapture *capture;

IplImage *frame;

int key;

char *filename = "haarcascade_frontalface_alt.xml";

cascade = ( CvHaarClassifierCascade* )cvLoad( filename, 0, 0, 0 );

/* setup memory buffer; needed by the face detector */

storage = cvCreateMemStorage( 0 );

/* initialize camera */

capture = cvCaptureFromCAM( 0 );

/* always check */

assert( cascade && storage && capture );

/* create a window */

cvNamedWindow( "video", 1 );

while( key != 'q' ) { /* get a frame */

frame = cvQueryFrame( capture );

/* always check */

if( !frame ) break;

/* 'fix' frame */

cvFlip( frame, frame, -1 );

frame->origin = 0;

/* detect faces and display video */

detectFaces( frame );

/* quit if user press 'q' */

key = cvWaitKey( 10 );

}

/* free memory */

cvReleaseCapture( &capture );

cvDestroyWindow( "video" );

cvReleaseHaarClassifierCascade( &cascade );

cvReleaseMemStorage( &storage );

return 0;

}

void detectFaces( IplImage *img ) {

int i;

/* detect faces */

CvSeq *faces = cvHaarDetectObjects(

img, cascade, storage, 1.1, 3,

0 /*CV_HAAR_DO_CANNY_PRUNNING*/, cvSize( 40, 40 ) );

/* for each face found, draw a red box */

for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) { CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );

cvRectangle( img, cvPoint( r->x, r->y ),

cvPoint( r->x + r->width, r->y + r->height ), CV_RGB( 255, 0, 0 ), 1, 8, 0 );

}

/* display video */

cvShowImage( "video", img );

}

Κώδικας για τον εντοπισμό του στόματος:

char *file4 = "haarcascade_mcs_mouth.xml";

cascade_b = (CvHaarClassifierCascade*)cvLoad(file4, 0, 0, 0);

/* detect mouth */

if( !cascade_b ) continue;

nested_objects3 = cvHaarDetectObjects(small_img, cascade_b, storage, 1.3, 3,0

//|CV_HAAR_FIND_BIGGEST_OBJECT //|CV_HAAR_DO_ROUGH_SEARCH //|CV_HAAR_DO_CANNY_PRUNING //|CV_HAAR_SCALE_IMAGE ,

cvSize(30, 30) );

for( j = 0; j<(nested_objects3 ? nested_objects3->total : 0 ) {

CvRect* r = (CvRect*)cvGetSeqElem( nested_objects3, 1);

cvRectangle(dst, cvPoint(r->x, r->y),

cvPoint(r->x + r->width*scale, r->y + r->height*scale), CV_RGB(0, 0, 255), 5, 8, 0);

}

Ο Haar classifier είναι μια τεχνική της OpenCV βασισμένη σε δέντρα η οποία αναπτύχθηκε ως μια ολοκληρωμένη εφαρμογή αναγνώρισης προσώπου. Παρόλα αυτά, μπορεί να εκπαιδευτεί για να αναγνωρίζει και άλλα αντικείμενα. Η όραση υπολογιστών είναι ένας ευρύς και γρήγορα εξελισσόμενος τομέας. Ωστόσο ο Haar classifier λειτουργεί αρκετά καλά και έχει χρησιμοποιηθεί από πολλές εταιρίες για την ανίχνευση σχετικά άκαμπτων αντικειμένων (π.χ. πρόσωπα, αυτοκίνητα, ποδήλατα), με την εκπαίδευση ανιχνευτών με χιλιάδες εικόνες που περιέχουν το αντικείμενο προς εκμάθηση. Αυτή η τεχνική έχει χρησιμοποιηθεί για να δημιουργηθούν ανιχνευτές, μίας όψης του αντικειμένου, πολύ υψηλής ποιότητας.

Η OpenCV εφαρμόζει μια έκδοση της τεχνικής ανίχνευσης προσώπου που αναπτύ- χθηκε αρχικά από τους Paul Viola και Michel Jones γνωστή ως Viola- Jones detector και αργότερα επεκτάθηκε από τους Rainer Lienhart και Jochen Maydt ώστε να χρησιμοποιεί διαγώνια χαρακτηριστικά.

Η OpenCV αναφέρεται σε αυτόν τον ανιχνευτή ως "Haar classifier" επειδή χρησιμοποιεί Haar χαρακτηριστικά ή ακριβέστερα, όμοια με Haar μικρά κύματα (Haar-like) αποτελούμενα από την προσθήκη και αφαίρεση ορθογώνιων περιοχών εικόνας πριν από την εύρεση του κατωφλίου. Η OpenCV παρέχεται με ένα σύνολο ήδη εκπαιδευμένων αρχείων αναγνώρισης αντικειμένων, αλλά ο κώδικας επιτρέπει την εκπαίδευση και αποθήκευση νέων μοντέλων για τον ανιχνευτή.

Η συνάρτηση cvHaarDetectObjects δέχεται τα εξής ορίσματα:

Image(small_img):Το πρώτο όρισμα είναι η εικόνα όπου θα γίνει ο εντοπισμός του χαρακτηριστικού(στόμα).

cascade_b:Το δεύτερο όρισμα είναι το αρχείο όπου υπάρχει ο ανιχνευτής του αντικειμένου.

Storage:Το τρίτο όρισμα είναι η μνήμη όπου αποθηκεύεται η ακολουθία του ορθογωνίου το οποίο υποδεικνύει το εντοπισμένο χαρακτηριστικό.

scale_factor:Το τέταρτο όρισμα είναι ο παράγοντας κατά τον οποίο το παράθυρο αναζήτησης κλιμακώνεται, στην προκειμένη περίπτωση κατά 30%.

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

Τέλος η μεταβλητή CvRect* r αποθηκεύει τις διαστάσεις όπου θα μαρκαριστεί το χαρακτηριστικό το οποίο έχει εντοπιστεί, και τις οποίες δέχεται η συνάρτηση

cvRectangle.

5.3 Λειτουργία Συστήματος

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

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

Όπως ανεφέρθηκε και πιο πάνω κατά την έναρξη της εφαρμογής, το robot κάνει αναζήτηση κάποιου προσώπου. Όταν εντοπιστεί κινείται προς αυτόν μέχρι ένα σημείο (περίπου 70cm). Στην συνέχεια ακινητοποιείται και κάνει ανίχνευση του στόματος, της μύτης και των ματιών(Σχήμα 37).

Σχήμα 37: Εντοπισμός Προσώπου-Εντοπισμός Μύτης-Έντοπισμός ματιών και Στόματος

Έπειτα αρχίζει να ψάχνει μέσω κάποιων αλγορίθμων (αυτόματη κατωφλίωση), την τιμή η οπόια θα εξάγει το χαρακτηριστικό του ματιού. Ο χρήστης θα πρέπει να

σταθεί κάποια δευτερόλεπτα μπροστά από την κάμερα έτσι ώστε μην υπάρχει λάθος εκτίμηση. Αφού βρεθεί η κατάλληλη τιμή το πρόγραμμα δίνει το «ΟΚ» για τη λήψη της απόφασης(Σχήμα 38). Η διαδικασία αυτή δεν τελειώνει ποτέ μέχρι να βρεθεί το απόλυτο χαρακτηριστικό.

Σχήμα 38: Εύρεση απόλυτου χαρακτηριστικού (Αριστερό μάτι)

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

5.4 Επεξεργασία εικόνας

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

Συνάρτηση που μετατρέπει την έγχρωμη εικόνα σε Grayscale:

cvCvtColor(img,gray,CV_BGR2GRAY);//Converts input image from one color space to another

Η συνάρτηση αυτή παίρνει τρεις παραμέτρους, την εικόνα που λαμβάνει, την εικόνα όπου θα γίνει η μετατροπή και τον τύπο που θέλουμε να μετατρέψουμε την εικόνα. Στην προκειμένη περίπτωση έγχρωμη(RGB) σε Grayscale.

Συνάρτηση που κάνει αποκοπή την ενδιαφέρουσα περιοχή:

cvSetImageROI( IplImage* img, CvRect rect);// Function for Region of Interest

Σχήμα 39: Αποκοπή ενδιαφέρουσας περιοχής

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

Σχήμα 40: Διάγραμμα λειτουργίας για τον εντοπισμό του προσώπου

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

5.5 Εκκίνηση του Robot

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

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

Κώδικας για το υπολογισμό του μεγέθους (πρόσωπο):

//left contour face center15.x = r->x;

center15.y =cvRound((r->y + r->height*0.5)*scale);

//right contour face

center16.x = r->x + r->width*scale;

center16.y =cvRound((r->y + r->height*0.5)*scale);

//distance face

center17.x=center16.x-center15.x;

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

if(center17.x<92 ) {

SetupCommPort("COM2");//open Com2 ret = GetSPEED1();//right wheel(front) ret = GetSPEED2();//left wheel(front) }//if

Σε περίπτωση που το όχημα είναι στη σωστή θέση τότε δεν υπάρχει καμία κίνηση από το όχημα ή διακόπτει τη λειτουργία των τροχών.

Σχήμα 41: Διάγραμμα λειτουργίας για την τοποθέτηση του οχήματος μπροστά από τον άνθρωπο

5.6 Εντοπισμός σημαντικότερων σημείων

Για να ληφθεί μια απόφαση θα πρέπει να προηγηθούν κάποιες λειτουργίες του συστήματος έτσι ώστε να εντοπιστούν τα τέσσερα σημαντικά σημειά του ματιού.

Αυτό επιτυγχάνεται με την αυτόματη κατωφλίωση και το Gaussian φίλτρο, έτσι ώστε να εξαχθεί το απόλυτο χαρακτηριστικό (μάτι).

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

Κώδικας επεξεργασίας ματιού:

//cropping

cvSetImageROI(dst,cvRect(center17.x,center16.y+(r->height/5.5),(r->width/2.0), (r->height/2.5)));

cvSetImageROI(small_img,cvRect(center17.x,center16.y+(r->height/5.5), (r->width/2.0), r->height/2.5));

//right eye if( !cascade_a ) continue;

//cvGetSubRect( small_img, &small_img_roi, *r );

nested_objects = cvHaarDetectObjects(small_img, cascade_a, storage, 1.15, 3, 0

|CV_HAAR_FIND_BIGGEST_OBJECT |CV_HAAR_DO_ROUGH_SEARCH

|CV_HAAR_DO_CANNY_PRUNING |CV_HAAR_SCALE_IMAGE ,

cvSize(25, 25) );

for( j = 0; j<(nested_objects ? nested_objects->total : 0 ) ; j++) {

CvRect* r = (CvRect*)cvGetSeqElem( nested_objects, 1);

cvRectangle(dst, cvPoint(r->x, r->y),

cvPoint(r->x + r->width*scale, r->y + r->height*scale), CV_RGB(255, 0, 0), 5, 8, 0);

//center contour right eye //red

center5.x = cvRound((r->x + r->width*0.5)*scale);

center5.y = cvRound((r->y + r->height*0.5)*scale);

cvCircle( dst, center5, 1, CV_RGB(255, 0, 0), 3, 8, 0 );

//Applies fixed-level threshold to array elements

cvThreshold( small_img, small_img, ok3, thresh8,CV_THRESH_TOZERO_INV );

//Smooths the image in one of several ways

cvSmooth( small_img, small_img, CV_BLUR_NO_SCALE , 10,5,10,5 );

IplConvKernel*kernel;

//Creates structuring element

kernel = cvCreateStructuringElementEx(3,3, 1, 1, CV_SHAPE_CROSS,NULL);

//Performs advanced morphological transformations

cvMorphologyEx(small_img, small_img, NULL, kernel,CV_MOP_OPEN, 3);

//Finds contours in binary image

cvFindContours(small_img,storage,&contours3,sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

if(contours3) {

//Draws contour outlines or interiors in the image cvDrawContours(

dst, contours3, cvScalarAll(255), cvScalarAll(255), 100 ,2, CV_AA);

}

Όπως αναφέρθηκε και παραπάνω πρώτα γίνεται αποκοπή της περιοχής ενδιαφέροντος και στη συνέχεια έχουμε τον εντοπισμό του προσώπου. Έπειτα η συνάρτηση cvThreshold είναι η συνάρτηση για την κατωφλίωση.

cvThreshold(small_img,small_img2, thresha,threshb,CV_THRESH_TOZERO_INV);

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

cvThreshold(), η οποία δίνει ως αποτέλεσμα pixel με τη μέγιστη φωτεινότητα για κάθε pixel μεγαλύτερης τιμής από ένα καθορισμένο όριο. Θα πρέπει να αναφερθεί πως αυτή η μέθοδος ανήκει στους ανχνευτές ανιχνευτές ακμών 2ης παραγώγου.

Η συνάρτηση αυτή παίρνει μια εικόνα γκρι (small_img) και συγκρίνει κάθε επίπεδο φωτεινότητας στη εικόνα γκρι με το κατώφλι Τ(thresha,threshb) και αυτό που προκύπτει είναι μια δυαδική εικόνα (small_img2).

small_img small_img2

Σχήμα 42: Διαδικασία Κατωφλίωσης

Έπειτα από αυτή την διαδικασία έχουμε το λεγόμενο smoothing (εξομάλυνση).

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

cvSmooth( small_img, small_img2,CV_BLUR_NO_SCALE,10,5,10);

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

Οι συναρτήσεις cvMorphologyEx() και CreateStructuringElementEx() :

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

Η συνάρτηση CreateStructuringElementEx() δεσμεύει μνήμη και γεμίζει τη δομή IplConvKernel, η οποία μπορεί να χρησιμοποιηθεί ως δομικό στοιχείο σε μορφολογικούς μετασχηματισμούς. Ουσιαστικά αυτό που αλλάζει στη μορφολογία της εικόνας της διαφοράς των frame είναι η ενοποίηση των λεύκων pixel με μικρό

Τ (Threshold)

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

Σχήμα 43: Αναπαράσταση επεξεργασίας ματιών (Σωστή)

Σχήμα 44: Αναπαράσταση επεξεργασίας ματιών (Λάθος)

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

cvFindContours (small_img, storage,&contours3,sizeof(CvContour),CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );

Δέχεται μια εικόνα η οποία θα πρέπει να είναι οπωσδήποτε 8-bit διαφορετικά εάν είναι έγχρωμη δεν μπορεί να εκτελεστεί αυτή η διαδιακασία. Τέλος στην μεταβλητή

contours αποθηκεύονται όλα τα σημεία που έχουν βρεθεί.

Σχήμα 45: Διάγραμμα λειτουργίας για τον εντοπισμό των σημείων

cvDrawContours(dst,contours3,cvScalarAll(255),cvScalarAll(255),100,2,CV_AA);

Η συνάρτηση cvDrawContours απλά εμφανίζει όλα αυτά τα σημεία.

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

for(i2=0;i2<count;i2++){

contourPoint = (CvPoint *)CV_GET_SEQ_ELEM(CvPoint,contours3,i2);

if( contourPoint->y < center5.y && contourPoint->x <= center5.x){

center65.x=center5.x;

center65.y=contourPoint->y;

center59.x=center65.x;

center59.y=center65.y;

cvCircle( dst, center65, 1, CV_RGB(0, 255, 0), 3, 8, 0 );

}

Αφού εντοπιστεί το σημείο αυτό μέσω της συνάρτησης cvCircle εξάγεται το επιθυμητό σημείο σε μορφή κυκλική στην οθόνη(Σχήμα 45).

Σχήμα 46: Εντοπισμός τεσσάρων σημαντικών σημείων του ματιού

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

(Α) (Β) Σχήμα 47: (Α) Ανέβασμα στόματος (Β) Κατέβασμα στόματος

Σχήμα 48: Λάθος τοποθέτηση του προσώπου ως πρως την κάμερα 5.7 Λήψη απόφασης

Προτού περάσουμε στη λήψη της απόφασης θα πρέπει να αναλύσουμε την αυτόματη κατωφλίωση όπου αναφέρθηκε παραπάνω. Διότι εάν δεν βρεθεί η απόλυτη ιρίδα δεν μπορούμε να προχωρήσουμε σε καμία λήψη απόφασης.

Κώδικας για την εύρεση του απόλυτου χαρακτηριστικού:

if(ok4=1){

if(ok==0){

if( center95.x>=66 && center95.x<=71 && center99.y>=21 && center99.y<=26 ) {

CvFont font;

cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 4, CV_AA);

cvPutText(dst, "OK", cvPoint(100, 30), &font, cvScalar(0, 255, 0, 0));

EmotionRecognition(center95,center99,dst,center108);

ok=1;

} else {

CvFont font;

cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 4, CV_AA);

cvPutText(dst, "NO", cvPoint(100, 30), &font, cvScalar( 255, 0, 0));

if(ok3<=150){

ok3=ok3+1;

} else{

ok3=0;

} }

} else{

CvFont font;

cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0, 0, 4, CV_AA);

cvPutText(dst, "OK", cvPoint(100, 30), &font, cvScalar(0, 255, 0, 0));

EmotionRecognition(center95,center99,dst,center108);

} } }

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

Η μεταβλητή«οκ4»στην αρχική κατάσταση της είναι μηδέν και όταν ανιχνεύση το στόμα γίνεται 1, στην συνέχεια η μεταβλητή «οκ»είναι αρχικά 0. Η μεταβλητή αυτή αλλάζει όταν βρεθεί η απόλυτη ιρίδα έτσι ώστε το σύστημα να μη συνεχίζει να κάνει αναζήτηση της απόλυτης ιρίδας. Η μεταβλητή«οκ3» είναι η μεταβλητή για την συνάρτηση της κατωφλίωσης έτσι ώστε όταν δεν βρίσκεται η απόλυτη ιρίδα, αυτή αυξάνει κατά ένα. Υπάρχει όμως και η περίπτωση που μπορεί να μην βρεθεί το απόλυτο χαρακτηριστικό τότε στην προκειμένη περίπτωση η μεταβλητή μηδενίζεται.

Σχήμα 49: Σωστή θέση ανθρώπου μπροστά από την κάμερα

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

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

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

(Α) (Β) (Γ)

Σχήμα 50: (Α) Περίγραμμα ματιού (γέλιο) (Β) Περίγραμμα ματιού (έκπληξη) (Γ)Περίγραμμα ματιού (θυμός)

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

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

Σχήμα 51: (Α) Περίγραμμα στόματος (γέλιο) (Β) Περίγραμμα στόματος (έκπληξη) (Γ)Περίγραμμα στόματος (θυμός)

Σχήμα 52: Διάγραμμα λειτουργίας του συστήματος

Κεφάλαιο 6

Μετρήσεις χρόνων-Ποσοστά επιτυχίας

6.1 Μετρήσεις χρόνων απόκρισης του συστήματος-Ποσοστά επιτυχίας

Σχήμα 53: Μετρήσεις χρόνων απόκρισης των χαρακτηριστικών Ο αλγόριθμος που εφαρμόστηκε για τον υπολογισμό του χρόνου είναι:

double t = (double)cvGetTickCount();

t = (double)cvGetTickCount() - t;

t2=t/((double)cvGetTickFrequency()*1000.);

6.2 Ποσοστά αναγνώρισης χαρακτηριστικών

Σχήμα 54: Ποσοστά επιτυχίας χαρακτηριστικών

Χαρακτηριστικά Χρόνος(ms)

Face 390

Left_Eye 392

Right_Eye 396

Nose 400

Mouth 406

Χαρακτηριστικά Ποσοστό %

Face 98

Left_Eye 92

Right_Eye 97

Nose 100

Mouth 93

6.3 Ποσοστά αναγνώρισης συναισθημάτων

.

Σχήμα 55: Ποσοστά επιτυχίας συναισθημάτων

Συναισθήματα Ποσοστό %

Χαρά 91

Έκπληξη 82

Θυμός 76

Κεφάλαιο 7

Συμπεράσματα και μελλοντικές προτάσεις

7.1 Συμπεράσματα

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

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

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

Η θέση του ανθρώπου μπροστά από την κάμερα μπορεί να επηρεάσει το σύστημα. Γι’ αυτό ο χρήστης δεν θα πρέπει να μετακινείται από τη στιγμή που τεθούν σε λειτουργία οι κινητήρες διαφορετικά δεν θα έχουμε το επιθυμητό αποτέλεσμα. Επίσης και το ύψος της κάμερας θα πρέπει να είναι σε τέτοιο σημείο έτσι ώστε να εντοπίσει τα χαρακτηριστικά του προσώπου.

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

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

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

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

Χαρακτηριστικά Συστήματος

Επίδοση Εξαρτάται κατά ένα μεγάλο βαθμό από τον χρόνο ανίχνευσης της απόλυτης ίριδας.

Φωτεινότητα Χρειάζεται κατάλληλο φωτισμό έτσι ώστε να εντοπιστούν τα χαρακτηριστικά και τα σημεία του προσώπου.

Επίδοση και Ακρίβεια Κινητήρων

Σε ανώμαλο δρόμο υπάρχει μεγάλη περίπτωση να συγκλίνει προς λάθος κατεύθυνση.

Κάμερα Ιδανική λύση για τέτοιες εφαρμογές χάρη στην ποιότητα της.

Σχήμα 56: Χαρακτηριστικά Συστήματος 7.2 Μελλοντικές προτάσεις

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

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

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

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

Παράρτημα 1

Λήψη και Εγκατάσταση της OpenCV

Η βιβλιοθήκη της Open Computer Vision, που χρησιμοποιείται στη γλώσσα προγραμματισμού C++, μπορεί να ληφθεί από την ηλεκτρονική διεύθυνση:

Για τα windows:

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/ για τα windows

Αφού γίνει η λήψη του .exe αρχείου στη συνέχεια γίνεται η εγκατάσταση της OpenCV.

Βήμα 1ο

Στο παράθυρο Install Options επιλέγουμε «Add OpenCV to the system PATH for all users» και πατάμε Next >.

Βήμα 2ο

Στο επόμενο παράθυρο καθορίζεται ο φάκελος εγκατάστασης. Ο προεπιλεγμένος φάκελος είναι ο ‘C:\OpenCV2.1’.

Βήμα 3ο

Στο παράθυρο Choose Components επιλέγουμε «type of install: Full», και κάνουμε την εγκατάσταση.

Αφού ολοκληρωθεί η εγκατάσταση θα πρέπει να συνδεθούν οι βιβλιοθήκες της OpenCV που απαιτούνται στο πρόγραμμα μας. Οι βιβλιοθήκες βρίσκονται στο φάκελο «C:\OpenCV2.1\lib\» και για να τις συνδέσουμε με ένα project της C++, αφού ανοίξουμε το project ,θα πρέπει να επιλέξουμε «Project -> Properties», ή να πατήσουμε Alt+F7.

Στο παράθυρο που θα εμφανιστεί επιλεγούμε τη καρτέλα Input από τo

«Configuration Properties-> Linker» και στην επιλογή «Additional Dependencies» να προσθέσουμε της βιβλιοθήκες που χρειαζόμαστε.

Βήμα 4ο

Βήμα 5ο

Documentos relacionados