- Δημιουργία προτύπων
- Ανίχνευση επιστολών
- Ανίχνευση αριθμού πινακίδων
- Εργασία του συστήματος ανίχνευσης αριθμού πινακίδας κυκλοφορίας οχήματος με χρήση MATLAB
Αναρωτηθήκατε ποτέ πώς λειτουργεί το σύστημα ANPR (Automatic Number Plate Recognition); Επιτρέψτε μου να σας πω την έννοια πίσω από αυτό, η κάμερα του συστήματος ANPR καταγράφει εικόνα της πινακίδας κυκλοφορίας του οχήματος και στη συνέχεια η εικόνα επεξεργάζεται μέσω πολλαπλού αριθμού αλγορίθμων για να παρέχει μια αλφαριθμητική μετατροπή της εικόνας σε μορφή κειμένου. Το σύστημα ANPR χρησιμοποιείται σε πολλά μέρη, όπως Αντλίες Πετρελαίου, Εμπορικά κέντρα, Αεροδρόμια, αυτοκινητόδρομοι, διόδια διοδίων, Ξενοδοχεία, Νοσοκομεία, χώροι στάθμευσης, σημεία ελέγχου άμυνας και στρατιωτικών
Υπάρχουν πολλά εργαλεία επεξεργασίας εικόνας διαθέσιμα για αυτήν την ανίχνευση πινακίδων αριθμού, αλλά εδώ σε αυτό το σεμινάριο θα χρησιμοποιήσουμε το MATLAB Image Processing για να λάβουμε τον αριθμό πινακίδας οχήματος στη μορφή κειμένου. Εάν είστε νέοι με MATLAB ή επεξεργασία εικόνας, ελέγξτε τα προηγούμενα έργα MATLAB:
- Ξεκινώντας με το MATLAB: Μια γρήγορη εισαγωγή
- Ξεκινώντας με την Επεξεργασία Εικόνας χρησιμοποιώντας το MATLAB
Πρώτον, επιτρέψτε μου να σας ενημερώσω για την ιδέα που χρησιμοποιούμε για τον εντοπισμό πινακίδων αριθμού. Υπάρχουν τρία προγράμματα ή αρχεία ".m" για αυτό το έργο.
- Δημιουργία προτύπου ( template_creation.m ) - Χρησιμοποιείται για την κλήση των αποθηκευμένων εικόνων των αλφαριθμητικών και στη συνέχεια την αποθήκευσή τους ως νέο πρότυπο στη μνήμη MATLAB.
- Ανίχνευση γραμμάτων ( Letter_detection.m ) - Διαβάζει τους χαρακτήρες από την εικόνα εισαγωγής και εντοπίζει το αντίστοιχο αλφαριθμητικό με την υψηλότερη αντιστοίχιση.
- Plate Detection ( Plate_detection.m ) - Επεξεργαστείτε την εικόνα και, στη συνέχεια, καλέστε τα παραπάνω δύο m-αρχεία για να εντοπίσετε τον αριθμό.
Τώρα, θα μάθουμε πώς να κωδικοποιούμε αυτά τα m-αρχεία και τι πρέπει να κάνετε πριν ξεκινήσουμε την κωδικοποίηση. Αφού περάσετε αυτό το σεμινάριο, μπορείτε να βρείτε όλα τα αρχεία κώδικα και το βίντεο εξήγησης που λειτουργεί στο τέλος αυτού του έργου.
Δημιουργία προτύπων
Πρώτα δημιουργήστε ένα φάκελο για το έργο (το όνομα του φακέλου μου είναι Number Plate Detection ) για να αποθηκεύσετε και να αποθηκεύσετε τα αρχεία. Έχουμε αποθηκεύσει τις δυαδικές εικόνες όλων των αλφαβήτων και αριθμών στον υποφάκελο που ονομάζεται « άλφα» .
Τώρα, ανοίξτε το παράθυρο του προγράμματος επεξεργασίας στο MATLAB, όπως φαίνεται στην παρακάτω εικόνα,
Εάν δεν είστε εξοικειωμένοι με τη βασική ορολογία του MATLAB, σας προτείνω να ελέγξετε το συνδεδεμένο σεμινάριο.
Τώρα, αντιγράψτε και επικολλήστε τον παρακάτω κώδικα στο αρχείο template_creation.m και αποθηκεύστε το αρχείο στο φάκελο του έργου ( Number Plate Detection ). Όλα τα αρχεία που σχετίζονται με αυτό το έργο, συμπεριλαμβανομένων των αρχείων προτύπων εικόνας, μπορούν να ληφθούν από εδώ. Ελέγξτε επίσης το βίντεο που δόθηκε στο τέλος αυτού του έργου.
% Αλφάβητα A = imread ('alpha / A.bmp'); B = imread ('alpha / B.bmp'); C = imread ('alpha / C.bmp'); D = imread ('alpha / D.bmp'); E = imread ('alpha / E.bmp'); F = imread ('alpha / F.bmp'); G = imread ('alpha / G.bmp'); H = imread ('alpha / H.bmp'); I = imread ('alpha / I.bmp'); J = imread ('alpha / J.bmp'); K = imread ('alpha / K.bmp'); L = imread ('alpha / L.bmp'); M = imread ('alpha / M.bmp'); N = imread ('alpha / N.bmp'); O = imread ('alpha / O.bmp'); P = imread ('alpha / P.bmp'); Q = imread ('alpha / Q.bmp'); R = imread ('alpha / R.bmp'); S = imread ('alpha / S.bmp'); T = imread ('alpha / T.bmp'); U = imread ('alpha / U.bmp'); V = imread ('alpha / V.bmp'); W = imread ('alpha / W.bmp'); X = imread ('άλφα / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('alpha / Z.bmp'); % Φυσικοί αριθμοί ένα = imread ('alpha / 1.bmp'), two = imread ('alpha / 2.bmp'); three = imread ('alpha / 3.bmp'), τέσσερα = imread ('alpha / 4.bmp'); πέντε = imread ('alpha / 5.bmp'); έξι = imread ('alpha / 6.bmp'); επτά = imread ('alpha / 7.bmp'); οκτώ = imread ('alpha / 8.bmp'); εννέα = imread ('alpha / 9.bmp'); μηδέν = imread ('alpha / 0.bmp'); % Δημιουργία συστοιχίας για αλφάβητα γράμμα =; % Δημιουργία συστοιχίας για αριθμούς number =; NewTemplates =; Αποθήκευση ("NewTemplates", "NewTemplates") διαγραφή όλων
Εδώ, στον παραπάνω κώδικα αποθηκεύουμε τις εικόνες σε μια μεταβλητή χρησιμοποιώντας την εντολή « imread () ». Αυτή η λειτουργία χρησιμοποιείται για την κλήση των εικόνων από το φάκελο ή από οποιαδήποτε θέση του υπολογιστή στο MATLAB. Ας πάρουμε ένα παράδειγμα από τον παραπάνω κώδικα:
A = imread ('alpha / A.bmp');
Όπου το Α είναι η μεταβλητή και στο ' alpha / A.bmp' , το 'alpha' είναι το όνομα του φακέλου και το ' A.bmp' είναι το όνομα του αρχείου.
Στη συνέχεια, δημιουργήστε έναν πίνακα " γράμμα " και " αριθμός " και αποθηκεύστε το στη μεταβλητή " NewTemplates " χρησιμοποιώντας την εντολή " αποθήκευση (όνομα αρχείου, μεταβλητές)" .
% Δημιουργία συστοιχίας για αλφάβητα γράμμα =; % Δημιουργία συστοιχίας για αριθμούς number =; NewTemplates =; Αποθήκευση ("NewTemplates", "NewTemplates") διαγραφή όλων
Τώρα ξεκινήστε την κωδικοποίηση Letter_detection.m , σε ένα νέο παράθυρο προγράμματος επεξεργασίας.
Ανίχνευση επιστολών
Εδώ δημιουργούμε το δεύτερο αρχείο κώδικα που ονομάζεται Letter_detection.m . Τώρα, αντιγράψτε και επικολλήστε τον παρακάτω κώδικα σε αυτό το αρχείο και αποθηκεύστε το αρχείο στο φάκελο του έργου με το όνομα Letter_detection. Μπορείτε να κατεβάσετε αυτό το αρχείο από εδώ, αυτό το συνημμένο αρχείο zip περιέχει επίσης άλλα αρχεία που σχετίζονται με αυτό το έργο ανίχνευσης πινακίδων αριθμού.
γράμμα λειτουργίας = readLetter (snap) φόρτωση NewTemplates snap = imresize (snap,); rec =; για n = 1: length (NewTemplates) cor = cor2 (NewTemplates {1, n}, snap); rec =; end ind = εύρεση (rec == max (rec)); οθόνη (εύρεση (rec == max (rec))); % Καταχωρήσεις αλφαβήτων. αν ind == 1 - ind == 2 γράμμα = 'A'; elseif ind == 3 - ind == 4 γράμμα = 'B'; elseif ind == 5 γράμμα = 'C' elseif ind == 6 - ind == 7 γράμμα = 'D'; elseif ind == 8 γράμμα = 'E'; elseif ind == 9 γράμμα = 'F'; elseif ind == 10 γράμμα = 'G'; elseif ind == 11 γράμμα = 'H'; elseif ind == 12 γράμμα = "I"; elseif ind == 13 γράμμα = 'J'; elseif ind == 14 γράμμα = 'K'; elseif ind == 15 γράμμα = 'L'; elseif ind == 16 γράμμα = 'M'; elseif ind == 17 γράμμα = 'N'; elseif ind == 18 - ind == 19 γράμμα = 'O'; elseif ind == 20 - ind == 21 γράμμα = 'P'; elseif ind == 22 - ind == 23 γράμμα = 'Q'; elseif ind == 24 - ind == 25 γράμμα = 'R'; elseif ind == 26 γράμμα = 'S'; elseif ind == 27 γράμμα = 'T'; elseif ind == 28 γράμμα = 'U'; elseif ind == 29 γράμμα = 'V'; elseif ind == 30 γράμμα = 'W'; elseif ind == 31 γράμμα = 'X'; elseif ind == 32 γράμμα = "Y"; elseif ind == 33 γράμμα = 'Z'; % * - * - * - * - * % αριθμητικά καταχωρήσεις. elseif ind == 34 γράμμα = '1'; elseif ind == 35 γράμμα = '2'; elseif ind == 36 γράμμα = '3'; elseif ind == 37 - ind == 38 γράμμα = '4'; elseif ind == 39 γράμμα = '5'; elseif ind == 40 - ind == 41 - ind == 42 γράμμα = '6'; elseif ind == 43 γράμμα = '7'; elseif ind == 44 - ind == 45 γράμμα = '8'; elseif ind == 46 - ind == 47 - ind == 48 γράμμα = '9'; αλλιώς γράμμα = '0'; τέλος τέλος
Εδώ, στον παραπάνω κώδικα έχουμε δημιουργήσει μια συνάρτηση με το όνομα γράμμα που μας δίνει την αλφαριθμητική έξοδο της εικόνας εισόδου από την κλάση « άλφα » χρησιμοποιώντας την εντολή « readLetter ()» . Και, στη συνέχεια, φορτώστε τα αποθηκευμένα πρότυπα χρησιμοποιώντας τη φόρτωση εντολών «NewTemplates .
Μετά από αυτό, έχουμε αλλάξει το μέγεθος της εικόνας εισόδου, ώστε να μπορεί να συγκριθεί με τις εικόνες του προτύπου χρησιμοποιώντας την εντολή «imresize (όνομα αρχείου, μέγεθος)» . Στη συνέχεια, για το βρόχο χρησιμοποιείται για τη συσχέτιση της εικόνας εισαγωγής με κάθε εικόνα στο πρότυπο για την καλύτερη αντιστοίχιση.
Δημιουργείται ένας πίνακας « rec » για την καταγραφή της τιμής συσχέτισης για κάθε αλφαριθμητικό πρότυπο με το πρότυπο χαρακτήρων από την εικόνα εισαγωγής, όπως φαίνεται στον παρακάτω κώδικα,
cor = cor2 (NewTemplates {1, n}, snap);
Στη συνέχεια , η εντολή 'find ()' χρησιμοποιείται για την εύρεση του ευρετηρίου που αντιστοιχεί στον υψηλότερο χαρακτήρα. Στη συνέχεια, σύμφωνα με αυτό το ευρετήριο, ο αντίστοιχος χαρακτήρας εκτυπώνεται χρησιμοποιώντας τη δήλωση «if-else» .
Τώρα, αφού ολοκληρώσετε αυτό, ανοίξτε ένα νέο παράθυρο προγράμματος επεξεργασίας για να ξεκινήσετε τον κωδικό για το κύριο πρόγραμμα.
Ανίχνευση αριθμού πινακίδων
Εδώ είναι το τρίτο και τελευταίο αρχείο κώδικα που ονομάζεται Plate_detection.m αντιγράψτε και επικολλήστε τον παρακάτω κώδικα σε αυτό το αρχείο και αποθηκεύστε το στο φάκελο του έργου. Για γρήγορη εκκίνηση μπορείτε να κατεβάσετε όλα τα αρχεία κώδικα με πρότυπα εικόνας από εδώ.
κλείσ'τα όλα; τα καθαρίζω όλα; im = imread ("Αριθμός πινακίδας / image1.png"); imgray = rgb2gray (im); imbin = imbinarize (imgray); im = edge (imgray, 'prewitt'); Τα παρακάτω βήματα είναι να βρείτε τη θέση της πινακίδας κυκλοφορίας Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image') περιοχή = Iprops.Area; μέτρηση = numel (Iprops); maxa = περιοχή; bindingBox = Iprops.BoundingBox; για i = 1: μέτρηση εάν maxa
Οι βασικές εντολές που χρησιμοποιούνται στον παραπάνω κώδικα αναφέρονται παρακάτω:
imread () - Αυτή η εντολή χρησιμοποιείται για το άνοιγμα της εικόνας στο MATLAB από το φάκελο προορισμού.
rgb2gray () –Αυτή η εντολή χρησιμοποιείται για τη μετατροπή της εικόνας RGB σε μορφή κλίμακας του γκρι.
imbinarize () - Αυτή η εντολή χρησιμοποιείται για την εικόνα Binarize 2-D σε κλίμακα του γκρι ή απλά μπορούμε να πούμε ότι μετατρέπει την εικόνα σε ασπρόμαυρη μορφή.
edge () - Αυτή η εντολή χρησιμοποιείται για την ανίχνευση των άκρων της εικόνας, χρησιμοποιώντας διάφορες μεθόδους όπως οι Roberts, Sobel, Prewitt και πολλές άλλες.
regionprops () - Αυτή η εντολή χρησιμοποιείται για τη μέτρηση των ιδιοτήτων της περιοχής εικόνας.
numel () - Αυτή η εντολή χρησιμοποιείται για τον υπολογισμό του αριθμού των στοιχείων πίνακα.
imcrop () - Αυτή η εντολή χρησιμοποιείται για την περικοπή της εικόνας στο εισαγόμενο μέγεθος.
bwareaopen () - Αυτή η εντολή χρησιμοποιείται για την αφαίρεση μικρών αντικειμένων από δυαδική εικόνα.
Χρησιμοποιώντας τις παραπάνω εντολές στον κώδικα, καλούμε την εικόνα εισόδου και τη μετατρέπουμε σε κλίμακα του γκρι. Στη συνέχεια, η κλίμακα του γκρι μετατρέπεται σε δυαδική εικόνα και το άκρο των δυαδικών εικόνων ανιχνεύεται με τη μέθοδο Prewitt.
Στη συνέχεια, ο παρακάτω κωδικός χρησιμοποιείται για την ανίχνευση της θέσης της πινακίδας αριθμού σε ολόκληρη την εικόνα εισόδου, Iprops = regionprops (im, "BoundingBox", "Περιοχή", "Εικόνα"); περιοχή = Iprops.Area; μέτρηση = numel (Iprops); maxa = περιοχή; bindingBox = Iprops.BoundingBox; για i = 1: μέτρηση εάν maxa
Μετά από αυτό περικόψτε την πινακίδα αριθμών και αφαιρέστε τα μικρά αντικείμενα από τη δυαδική εικόνα χρησιμοποιώντας τις εντολές «imcrop ()» και «bwareaopen ()» αντίστοιχα.
Στη συνέχεια, ο παρακάτω κώδικας χρησιμοποιείται για την επεξεργασία αυτής της περικομμένης εικόνας πινακίδας κυκλοφορίας και για την εμφάνιση του αριθμού που εντοπίστηκε στη μορφή εικόνας και κειμένου (στο παράθυρο εντολών).
Iprops = regionprops (im, "BoundingBox", "Περιοχή", "Εικόνα"); μέτρηση = numel (Iprops); noPlate =; για i = 1: count ow = length (Iprops (i). Εικόνα (1,:)); oh = μήκος (Iprops (i). Εικόνα (:, 1)); εάν ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i). Εικόνα); noPlate = τέλος άκρου
Εργασία του συστήματος ανίχνευσης αριθμού πινακίδας κυκλοφορίας οχήματος με χρήση MATLAB
Στο αρχείο template_creation.m έχουμε σχεδιάσει τον κώδικα για να αποθηκεύσουμε όλες τις δυαδικές εικόνες αλφαριθμητικών σε έναν κατάλογο ή αρχείο που ονομάζεται « NewTemplates ». Στη συνέχεια, αυτός ο κατάλογος καλείται στο Letter_detection.m όπως μπορείτε να δείτε στα παρακάτω
Στη συνέχεια, στο αρχείο κώδικα Plate_detection.m το αρχείο κώδικα Letter_detection.m καλείται όταν επεξεργαζόμαστε την εικόνα όπως φαίνεται στην παρακάτω εικόνα,
Τώρα, κάντε κλικ στο κουμπί "RUN" για να εκτελέσετε το αρχείο.m
Το MATLAB μπορεί να χρειαστεί λίγα δευτερόλεπτα για να απαντήσει, περιμένετε μέχρι να εμφανιστεί μήνυμα απασχολημένου στην κάτω αριστερή γωνία όπως φαίνεται παρακάτω,
Κατά την έναρξη του προγράμματος θα λάβετε το αναδυόμενο παράθυρο της πινακίδας αριθμού και τον αριθμό στο παράθυρο εντολών. Η έξοδος για την εικόνα μου θα μοιάζει με την παρακάτω εικόνα.
Η πλήρης λειτουργία του συστήματος ανίχνευσης πινακίδων αριθμού άδειας οχήματος παρουσιάζεται στο παρακάτω βίντεο και μπορείτε να κατεβάσετε όλα τα αρχεία κώδικα με πρότυπα εικόνας από εδώ.
Επίσης, δείτε όλα τα έργα MATLAB εδώ.