- Vorlagenerstellung
- Buchstabenerkennung
- Nummernschilderkennung
- Funktionieren des Fahrzeugkennzeichen-Erkennungssystems mit MATLAB
Haben Sie sich jemals gefragt, wie ein ANPR-System (Automatic Number Plate Recognition) funktioniert? Lassen Sie mich Ihnen das Konzept dahinter erläutern. Die Kamera des ANPR-Systems erfasst das Bild des Kfz-Kennzeichens. Anschließend wird das Bild durch mehrere Algorithmen verarbeitet, um eine alphanumerische Konvertierung des Bildes in ein Textformat zu ermöglichen. Das ANPR-System wird an vielen Orten wie Benzinpumpen, Einkaufszentren, Flughäfen, Autobahnen, Mautstellen, Hotels, Krankenhäusern, Parkplätzen, Kontrollpunkten für Verteidigung und Militär usw. eingesetzt.
Für diese Kennzeichenerkennung stehen viele Bildverarbeitungswerkzeuge zur Verfügung. In diesem Lernprogramm wird jedoch die MATLAB-Bildverarbeitung verwendet, um das Kfz-Kennzeichen in das Textformat zu bringen. Wenn Sie mit MATLAB oder Bildverarbeitung noch nicht vertraut sind, lesen Sie unsere vorherigen MATLAB-Projekte:
- Erste Schritte mit MATLAB: Eine kurze Einführung
- Erste Schritte mit der Bildverarbeitung mit MATLAB
Lassen Sie mich zunächst auf das Konzept eingehen, mit dem wir Nummernschilder erkennen. Es gibt drei Programme oder '.m'-Dateien für dieses Projekt.
- Vorlagenerstellung ( template_creation.m ) - Hiermit werden die gespeicherten Bilder von alphanumerischen Zeichen aufgerufen und anschließend als neue Vorlage im MATLAB-Speicher gespeichert.
- Buchstabenerkennung ( Letter_detection.m ) - Liest die Zeichen aus dem Eingabebild und findet die am besten übereinstimmende entsprechende alphanumerische Zahl .
- Plattenerkennung ( Plate_detection.m ) - Verarbeiten Sie das Bild und rufen Sie die beiden oben genannten m-Dateien auf, um die Nummer zu erkennen.
Jetzt lernen wir, wie man diese M-Dateien codiert und was Sie tun müssen, bevor Sie mit dem Codieren beginnen. Nachdem Sie dieses Tutorial durchgearbeitet haben, finden Sie am Ende dieses Projekts alle Codedateien und das Video mit den funktionierenden Erklärungen.
Vorlagenerstellung
Erstellen Sie zuerst einen Ordner für das Projekt (mein Ordnername lautet Number Plate Detection ), um die Dateien zu speichern und zu speichern. Wir haben die Binärbilder aller Alphabete und Zahlen im Unterordner ' alpha' gespeichert.
Öffnen Sie nun das Editor-Fenster im MATLAB, wie im folgenden Bild gezeigt.
Wenn Sie mit der grundlegenden Terminologie von MATLAB nicht vertraut sind, empfehlen wir Ihnen, das verknüpfte Tutorial zu überprüfen.
Kopieren Sie nun den folgenden Code, fügen Sie ihn in die Datei template_creation.m ein und speichern Sie die Datei im Projektordner ( Nummernschilderkennung ). Alle Dateien zu diesem Projekt, einschließlich Bildvorlagendateien, können hier heruntergeladen werden. Auch überprüfen Sie das Video am Ende dieses Projektes gegeben.
% Alphabete 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 ('alpha / X.bmp '); Y = imread ('alpha / Y.bmp'); Z = imread ('alpha / Z.bmp'); % Natürliche Zahlen eins = imread ('alpha / 1.bmp'); zwei = imread ('alpha / 2.bmp'); drei = imread ('alpha / 3.bmp'); vier = imread ('alpha / 4.bmp'); fünf = imread ('alpha / 5.bmp'); six = imread ('alpha / 6.bmp'); sieben = imread ('alpha / 7.bmp'); acht = imread ('alpha / 8.bmp'); neun = imread ('alpha / 9.bmp'); Null = Imread ('alpha / 0.bmp'); % Array für Alphabete erstellen letter =; % Array für Zahlen erstellen number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') löscht alles
Hier im obigen Code speichern wir die Bilder mit dem Befehl ' imread () ' in einer Variablen. Diese Funktion wird verwendet, um die Bilder aus dem Ordner oder von einem beliebigen Ort des PCs in das MATLAB aufzurufen. Nehmen wir ein Beispiel aus dem obigen Code:
A = imread ('alpha / A.bmp');
Wobei A die Variable ist, und in ‚ alpha / A.bmp‘, ‚Alpha‘ ist der Ordnername und ‚ A.bmp‘ ist der Dateiname.
Erstellen Sie dann eine Matrix aus ' Buchstaben ' und ' Zahlen ' und speichern Sie sie in der Variablen ' NewTemplates ' mit dem Befehl ' save (Dateiname, Variablen)' .
% Array für Alphabete erstellen letter =; % Array für Zahlen erstellen number =; NewTemplates =; save ('NewTemplates', 'NewTemplates') löscht alles
Beginnen Sie nun mit der Codierung von Letter_detection.m in einem neuen Editorfenster.
Buchstabenerkennung
Hier erstellen wir die zweite Codedatei mit dem Namen Letter_detection.m . Kopieren Sie nun den folgenden Code und fügen Sie ihn in diese Datei ein. Speichern Sie die Datei im Projektordner mit dem Namen Letter_detection. Diese Datei kann von hier heruntergeladen werden. Diese angehängten Zip-Dateien enthalten auch andere Dateien, die sich auf dieses Kennzeichenerkennungsprojekt beziehen.
function letter = readLetter (snap) load NewTemplates snap = imresize (snap,); rec =; für n = 1: Länge (NewTemplates) cor = corr2 (NewTemplates {1, n}, snap); rec =; end ind = find (rec == max (rec)); Anzeige (find (rec == max (rec))); % Alphabete Listings. if ind == 1 - ind == 2 letter = 'A'; elseif ind == 3 - ind == 4 letter = 'B'; elseif ind == 5 letter = 'C' elseif ind == 6 - ind == 7 letter = 'D'; elseif ind == 8 letter = 'E'; elseif ind == 9 letter = 'F'; elseif ind == 10 letter = 'G'; elseif ind == 11 letter = 'H'; elseif ind == 12 letter = 'I'; elseif ind == 13 letter = 'J'; elseif ind == 14 letter = 'K'; elseif ind == 15 letter = 'L'; elseif ind == 16 letter = 'M'; elseif ind == 17 letter = 'N'; elseif ind == 18 - ind == 19 letter = 'O'; elseif ind == 20 - ind == 21 letter = 'P'; elseif ind == 22 - ind == 23 letter = 'Q'; elseif ind == 24 - ind == 25 letter = 'R'; elseif ind == 26 letter = 'S'; elseif ind == 27 letter = 'T'; elseif ind == 28 letter = 'U'; elseif ind == 29 letter = 'V'; elseif ind == 30 letter = 'W'; elseif ind == 31 letter = 'X'; elseif ind == 32 Buchstabe = 'Y'; elseif ind == 33 letter = 'Z'; % * - * - * - * - * % Ziffern Angebote. elseif ind == 34 letter = '1'; elseif ind == 35 letter = '2'; elseif ind == 36 letter = '3'; elseif ind == 37 - ind == 38 letter = '4'; elseif ind == 39 letter = '5'; elseif ind == 40 - ind == 41 - ind == 42 letter = '6'; elseif ind == 43 letter = '7'; elseif ind == 44 - ind == 45 letter = '8'; elseif ind == 46 - ind == 47 - ind == 48 letter = '9'; sonst Buchstabe = '0'; Ende Ende
Hier haben wir im obigen Code eine Funktion namens letter erstellt, die uns die alphanumerische Ausgabe des Eingabebildes aus der Klasse ' alpha ' mit dem Befehl ' readLetter ()' gibt . Laden Sie dann die gespeicherten Vorlagen mit dem Befehl load 'NewTemplates .
Danach haben wir die Größe des Eingabebilds geändert, damit es mit dem Befehl 'imresize (Dateiname, Größe)' mit den Bildern der Vorlage verglichen werden kann. Die for- Schleife wird dann verwendet, um das Eingabebild mit jedem Bild in der Vorlage zu korrelieren, um die beste Übereinstimmung zu erzielen.
Eine Matrix ' rec ' wird erstellt, um den Korrelationswert für jede alphanumerische Vorlage mit der Zeichenvorlage aus dem Eingabebild aufzuzeichnen, wie im folgenden Code gezeigt.
cor = corr2 (NewTemplates {1, n}, snap);
Dann wird der Befehl 'find ()' verwendet, um den Index zu finden, der dem Zeichen mit der höchsten Übereinstimmung entspricht. Dann wird gemäß diesem Index das entsprechende Zeichen mit der Anweisung 'if-else' gedruckt.
Nachdem Sie dies abgeschlossen haben, öffnen Sie ein neues Editorfenster, um den Code für das Hauptprogramm zu starten.
Nummernschilderkennung
Hier ist die dritte und letzte Codedatei mit dem Namen Plate_detection.m. Kopieren Sie den folgenden Code, fügen Sie ihn in diese Datei ein und speichern Sie ihn im Projektordner. Zum schnellen Start können Sie hier alle Codedateien mit Bildvorlagen herunterladen.
alle schließen; alles löschen; im = imread ('Nummernschildbilder / image1.png'); imgray = rgb2gray (im); imbin = imbinarisieren (imgray); im = edge (imgray, 'prewitt'); % Unter den Schritten finden Sie die Position des Nummernschilds Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = Fläche; boundingBox = Iprops.BoundingBox; für i = 1: zähle wenn maxa
Grundlegende Befehle, die im obigen Code verwendet werden, sind unten aufgeführt:
imread () - Mit diesem Befehl wird das Bild aus dem Zielordner in MATLAB geöffnet.
rgb2gray () - Mit diesem Befehl wird das RGB-Bild in das Graustufenformat konvertiert.
imbinarize () - Dieser Befehl wird zum Binarisieren von 2-D-Graustufenbildern verwendet, oder wir können einfach sagen, dass das Bild in das Schwarzweißformat konvertiert wird.
edge () - Mit diesem Befehl werden die Kanten im Bild mithilfe verschiedener Methoden wie Roberts, Sobel, Prewitt und vielen anderen erkannt.
regionprops () - Mit diesem Befehl werden die Eigenschaften des Bildbereichs gemessen.
numel () - Mit diesem Befehl wird die Anzahl der Array-Elemente berechnet.
imcrop () - Mit diesem Befehl wird das Bild in der eingegebenen Größe zugeschnitten.
bwareaopen () - Mit diesem Befehl werden kleine Objekte aus dem Binärbild entfernt.
Mit den obigen Befehlen im Code rufen wir das Eingabebild auf und konvertieren es in die Graustufen. Dann wird die Graustufe in das Binärbild umgewandelt und die Kante der Binärbilder wird durch die Prewitt-Methode erkannt .
Dann wird der Code unten verwendet, um die Position des Nummernschilds in dem gesamten Eingangsbild zu erfassen, Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); area = Iprops.Area; count = numel (Iprops); maxa = Fläche; boundingBox = Iprops.BoundingBox; für i = 1: zähle wenn maxa
Danach das Nummernschild zuschneiden und die kleinen Objekte mit den Befehlen 'imcrop ()' bzw. 'bwareaopen ()' aus dem Binärbild entfernen.
Der folgende Code wird dann verwendet, um das zugeschnittene Kennzeichenbild zu verarbeiten und die erkannte Nummer im Bild- und Textformat (im Befehlsfenster) anzuzeigen.
Iprops = regionprops (im, 'BoundingBox', 'Area', 'Image'); count = numel (Iprops); noPlate =; für i = 1: count ow = length (Iprops (i).Image (1,:)); oh = Länge (Iprops (i).Image (:, 1)); if ow <(h / 2) & oh> (h / 3) letter = Letter_detection (Iprops (i).Image); noPlate = Ende Ende
Funktionieren des Fahrzeugkennzeichen-Erkennungssystems mit MATLAB
In der Datei template_creation.m haben wir den Code entworfen, um alle Binärbilder von alphanumerischen Zeichen in einem Verzeichnis oder einer Datei mit dem Namen ' NewTemplates ' zu speichern . Dann wird dieses Verzeichnis in Letter_detection.m aufgerufen, wie Sie unten sehen können
Dann wird in der Codedatei Plate_detection.m die Codedatei Letter_detection.m aufgerufen, wenn wir das Bild wie im Bild unten gezeigt verarbeiten.
Klicken Sie nun auf die Schaltfläche 'RUN', um die.m-Datei auszuführen
Es kann einige Sekunden dauern, bis MATLAB antwortet. Warten Sie, bis in der unteren linken Ecke eine Besetztmeldung angezeigt wird (siehe unten).
Beim Programmstart erhalten Sie das Nummernschild-Popup und die Nummer im Befehlsfenster. Die Ausgabe für mein Bild sieht wie folgt aus.
Die vollständige Funktionsweise des Kfz-Kennzeichenerkennungssystems wird im folgenden Video gezeigt. Alle Codedateien mit Bildvorlagen können hier heruntergeladen werden.
Überprüfen Sie auch alle MATLAB-Projekte hier.