Verkehrszeichenerkennung: Unterschied zwischen den Versionen
Zeile 22: | Zeile 22: | ||
cd C:\Users\IronMan | cd C:\Users\IronMan | ||
obj = VideoReader('Schilder.MTS'); | obj = VideoReader('Schilder.MTS'); | ||
Die Funktion VideoReader unterstützt relativ viele Formate und speichert diese auch meist zuverlässig ab. Das MTS-Format, das hier eingelesen wird, ist ein sehr rechenintensives Format und umfasst in diesem Fall 50 Frames pro Sekunde. Das hat in diesem Fall ein | Die Funktion VideoReader unterstützt relativ viele Formate und speichert diese auch meist zuverlässig ab. Das MTS-Format, das hier eingelesen wird, ist ein sehr rechenintensives Format und umfasst in diesem Fall 50 Frames pro Sekunde. Das hat in diesem Fall ein Volllaufen des für Matlab reservierten Arbeitsspeichers geführt und es wurden nicht alle Frames eingelesen und auch nicht ganz in der richtigen Reihenfolge. | ||
Die erwähnten 50fps sind natürlich mehr als genug für die Verkehrszeichenerkennung. Daher sollte man nun den Datenstrom mit Matlab verringern, indem man nur alle 20 Bilder abspeichert. Damit diese auch gescheit geordnet werden, ist dies eine gute Lösung: | Die erwähnten 50fps sind natürlich mehr als genug für die Verkehrszeichenerkennung. Daher sollte man nun den Datenstrom mit Matlab verringern, indem man nur alle 20 Bilder abspeichert. Damit diese auch gescheit geordnet werden, ist dies eine gute Lösung: | ||
for k = 1 : 380 | for k = 1 : 380 | ||
Zeile 39: | Zeile 39: | ||
end | end | ||
end | end | ||
Mit "read" wird aus obj das Frame k+p ausgelesen und "imwrite" schreibt | Mit "read" wird aus obj das Frame k+p ausgelesen und "imwrite" schreibt dieses Frame in eine jpg-Datei. "sprintf" hilft uns bei der Namensgebung. | ||
=== Finden des Verkehrszeichen === | |||
Im eigentlichen Programm können nun die abgespeicherten Bilder aufgerufen werden und in einer Datenbank abgespeichert werden um dann mit der Verkehrszeichenerkennung beginnen zu können. In diesem Projekt sollen dabei Geschwindigkeitsschilder erkannt werden und die Geschwindigkeit ausgelesen werden.<br /> | |||
[[Datei:70.gif|150px|thumb|right|70er Verkehrszeichen]] | |||
Wenn man sich nun so ein Geschwindigkeitsschild beschreibt, kann man einen roten Kreis erkennen und zwei oder drei schwarze Ziffern. Also könnte man nach Zahlen,Kreisen oder einer Farbe im Bild suchen suchen. Zahlen kann man sehr gut durch TemplateMatching finden, allerdings ist es hier am besten, wenn die Größe und die Rotation des Templates mit der Zahl im Bild übereinstimmt. Also sollte man diesen Schritt nicht zuerst durchführen, da dies zu rechenaufwendig wär,weil man in diesem Fall das Template auf verschiedene Größen ziehen würde um eine Zahl zu erkennen. Wahrscheinlich wäre es auch zu ungenau. Kreise zu finden könnte man durchaus auch in Betracht ziehen, allerdings wie soll gewährleistet werden dass dies wirklich ein Verkehrszeichen ist und nicht ein ungünstig liegender Fußball. Eine Farberkennung führt zum Ziel, wie man in den folgenden Zeilen erkennen wird. | |||
Der RGB-Farbraum teilt sich in drei Bereiche ein. Es gibt eine rote, eine grüne und eine blaue Matrix. Erst könnte man denken es würde reichen nur die rote Matrix zu betrachten, allerdings ist in der Farbe weiß jeder Farbanteil zu 100 Prozent enthalten, weshalb es von Vorteil ist die Farben miteinander zu vergleichen. Im Matlabcode kann dies folgendermaßen aussehen: | |||
if Rot(x,y)>Blau(x,y) && Rot(x,y)>Gruen(x,y) && abs(Rot(x,y) - Gruen(x,y))>40 && abs(Rot(x,y) - Blau(x,y))>40 | |||
Pic(x,y)=1; | |||
end | |||
== Siehe auch == | == Siehe auch == |
Version vom 20. Juni 2014, 19:54 Uhr
Autor: Michael Deitel
Betreuer: Prof. Schneider
Motivation
Bei monotonen Autofahrten entgeht einem Fahrer gelegentlich ein Verkehrszeichen. Diese Matlab-"App" soll den Fahrer über eine Anzeige an das aktuell gültige Verkehrszeichen erinnern.
Ziel
Darstellung des aktuell gültigen Verkehrszeichens während einer aufgezeichneten Fahrt.
Aufgabe
- Lesen Sie das aufgezeichnete Video in Matlab ein.
- Zerlegen Sie diesen Film in Einzelframes.
- Extrahieren Sie die Verkehrszeichen auf diesen Frames mit Matlab.
- Schreiben Sie eine Schleife über alle Frames und zeigen Sie das aktuell gültige Verkehrszeichen automatisch neben dem Video an.
Hinweis: Die Verkehrszeichenerkennung muss robust für beliebige am Tag gefilmte Sequenzen funktionieren.
Lösung
Einlesen und Zerlegen des Videos
Zum Einlesen eines Bildes in Matlab kann man das Tool VideoReader benutzen. Dazu navigiert man als aller erstes zum Speicherort des Videos und kann dann durch das Tool die Videodatei in den Workspace laden. Dies kann wie folgt aussehen:
cd C:\Users\IronMan obj = VideoReader('Schilder.MTS');
Die Funktion VideoReader unterstützt relativ viele Formate und speichert diese auch meist zuverlässig ab. Das MTS-Format, das hier eingelesen wird, ist ein sehr rechenintensives Format und umfasst in diesem Fall 50 Frames pro Sekunde. Das hat in diesem Fall ein Volllaufen des für Matlab reservierten Arbeitsspeichers geführt und es wurden nicht alle Frames eingelesen und auch nicht ganz in der richtigen Reihenfolge. Die erwähnten 50fps sind natürlich mehr als genug für die Verkehrszeichenerkennung. Daher sollte man nun den Datenstrom mit Matlab verringern, indem man nur alle 20 Bilder abspeichert. Damit diese auch gescheit geordnet werden, ist dies eine gute Lösung:
for k = 1 : 380 this_frame = read(obj,k+p); p=p+20; if k<100 && k>9 imwrite(this_frame,sprintf('Schilder0%u.jpg' ,k)); end if k<10 imwrite(this_frame,sprintf('Schilder00%u.jpg' ,k)); end if k>99 imwrite(this_frame,sprintf('Schilder%u.jpg' ,k)); end end
Mit "read" wird aus obj das Frame k+p ausgelesen und "imwrite" schreibt dieses Frame in eine jpg-Datei. "sprintf" hilft uns bei der Namensgebung.
Finden des Verkehrszeichen
Im eigentlichen Programm können nun die abgespeicherten Bilder aufgerufen werden und in einer Datenbank abgespeichert werden um dann mit der Verkehrszeichenerkennung beginnen zu können. In diesem Projekt sollen dabei Geschwindigkeitsschilder erkannt werden und die Geschwindigkeit ausgelesen werden.
Wenn man sich nun so ein Geschwindigkeitsschild beschreibt, kann man einen roten Kreis erkennen und zwei oder drei schwarze Ziffern. Also könnte man nach Zahlen,Kreisen oder einer Farbe im Bild suchen suchen. Zahlen kann man sehr gut durch TemplateMatching finden, allerdings ist es hier am besten, wenn die Größe und die Rotation des Templates mit der Zahl im Bild übereinstimmt. Also sollte man diesen Schritt nicht zuerst durchführen, da dies zu rechenaufwendig wär,weil man in diesem Fall das Template auf verschiedene Größen ziehen würde um eine Zahl zu erkennen. Wahrscheinlich wäre es auch zu ungenau. Kreise zu finden könnte man durchaus auch in Betracht ziehen, allerdings wie soll gewährleistet werden dass dies wirklich ein Verkehrszeichen ist und nicht ein ungünstig liegender Fußball. Eine Farberkennung führt zum Ziel, wie man in den folgenden Zeilen erkennen wird. Der RGB-Farbraum teilt sich in drei Bereiche ein. Es gibt eine rote, eine grüne und eine blaue Matrix. Erst könnte man denken es würde reichen nur die rote Matrix zu betrachten, allerdings ist in der Farbe weiß jeder Farbanteil zu 100 Prozent enthalten, weshalb es von Vorteil ist die Farben miteinander zu vergleichen. Im Matlabcode kann dies folgendermaßen aussehen:
if Rot(x,y)>Blau(x,y) && Rot(x,y)>Gruen(x,y) && abs(Rot(x,y) - Gruen(x,y))>40 && abs(Rot(x,y) - Blau(x,y))>40 Pic(x,y)=1; end
Siehe auch
Weblinks
Kein Blitzer-Bußgeld mit Verkehrszeichen Erkennung
BSD-Lizenzbedingung BSD-Lizenz
Copyright (c) 2014, Hochschule Hamm-Lippstadt, Dep. Lip. 1, Prof. Schneider
Hochschule Hamm-Lippstadt. Alle Rechte vorbehalten.
→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2014