Verkehrszeichenerkennung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 39: Zeile 39:
   end
   end
  end
  end
Mit "read" wird aus obj das Frame k+p ausgelesen und "imwrite" schreibt dises Frame in eine jpg-Datei. "sprintf" hilft uns bei der Namensgebung.


== Siehe auch ==
== Siehe auch ==

Version vom 20. Juni 2014, 18:16 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

  1. Lesen Sie das aufgezeichnete Video in Matlab ein.
  2. Zerlegen Sie diesen Film in Einzelframes.
  3. Extrahieren Sie die Verkehrszeichen auf diesen Frames mit Matlab.
  4. 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 Vollaufen 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 dises Frame in eine jpg-Datei. "sprintf" hilft uns bei der Namensgebung.

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