SigSys15 Start- und Stopplinienerkennung: Unterschied zwischen den Versionen
Zeile 35: | Zeile 35: | ||
=== Einlesen in Endlosschleife === | === Einlesen in Endlosschleife === | ||
<source lang="matlab"> | |||
%% In Endlosschleife über Bilder laufen | |||
while 1 % Endlosschleife über alle Frames ohne Ende | |||
Frame_Name = ['Frame_',num2str(Frame_Counter(1)), ... % Bildname bestimmen | |||
num2str(Frame_Counter(2)),num2str(Frame_Counter(3)), ... % Zusammensetzung aus Elementen des Arrays "Frame_Counter" | |||
num2str(Frame_Counter(4))]; | |||
</source> | |||
<source lang="matlab"> | |||
%% Frame hochzählen | |||
Frame_Counter(4) = Frame_Counter(4) + Zeitschritte; % z.B. '+2': 2*(1/30) Sekunden zwischen den Bildern, da 30 Frames/sek | |||
if Frame_Counter(4) == 10 % Auswirkung von letzter Stelle prüfen, daher nur Zeitschritte 1;2;5;10 erlaubt | |||
Frame_Counter(4) = 0; % Letzte Stelle resetten | |||
Frame_Counter(3) = Frame_Counter(3) + 1; % Dafür 3. Stelle inkrementieren | |||
if Frame_Counter(3) == 10 % Auswirkung auf 2. Stelle prüfen | |||
Frame_Counter(3) = 0; % 3. Stelle resetten | |||
Frame_Counter(2) = Frame_Counter(2) + 1; % 2. Stelle inkrementieren | |||
if Frame_Counter(2) == 10 % Auswirkung auf 1. Stelle prüfen | |||
Frame_Counter(2) = 0; % 2. Stelle resetten | |||
Frame_Counter(1) = Frame_Counter(1) + 1; % 1. Stelle inkrementieren | |||
end | |||
end | |||
end | |||
%% Zurücksetzen wenn alle Frames durchlaufen wurden | |||
if Frame_Counter(1) * 1000 + Frame_Counter(2) * 100 + ... % Wenn alle Frames durchlaufen wurden | |||
Frame_Counter(3) * 10 + Frame_Counter(4) >= 2331 | |||
Frame_Counter(1) = 0; % alle Zähler zurücksetzen und von vorne beginnen | |||
Frame_Counter(2) = 0; | |||
Frame_Counter(3) = 0; | |||
Frame_Counter(4) = 0; | |||
end | |||
</source> | |||
=== Algorithmus zur Linienerkennung === | === Algorithmus zur Linienerkennung === | ||
=== Laufzeitbetrachtung === | === Laufzeitbetrachtung === |
Version vom 11. Mai 2015, 15:52 Uhr
Autor:
Betreuer: Prof. Schneider
Motivation
Eine Aufgabe beim Carolo Cup ist der "Rundkurs mit Hindernissen". Hierbei ist eine Startlinie zu überfahren und an eienr Stopplinie zu halten.
Ziel
Die Start- und Stoppline soll robust erkannt und unterschieden werden.
Aufgabe
- Zeichnen Sie die Kamerasicht eines Rundkurses auf.
- Lesen Sie diesen als Endlosschleife in Matlab ein.
- Identifizieren Sie während der virtuellen Fahrt Start- und Stopplinien mit Matlab.
- Vermeiden Sie Fehler ("false-positives").
- Optimieren Sie die Rechenzeit Ihres Algorithmus.
Lösungen
Vorverarbeitende Maßnahmen
Video in einzelne Frames aufteilen
Video-Dateien belegen in Matlab sehr viel Arbeitsspeicher. Um während der eigentlichen Bildverarbeitung für Entlastung zu sorgen, ist es allerdings möglich das Video in seine einzelnen Frames zu zurlegen und diese jeweils abzuspeichern. Diese Bilder können dann während der Verarbeitung geladen werden. Auf diese Weise wird bei der Verarbeitung nicht mehr Speicher benötigt als für diesen Durchlauf erforderlich. Unter realen Bedingungen spielen diese Umstände allerdings keine Rolle, da es unsinnig wäre von der Kamara aufgenommene Bilder erst zwischenzuspeichern, um sie anschließend wieder zu laden. Hierbei könnten die Bilddaten direkt verarbeitet werden.
Der Arbeitsschritt das Video in Bilder zu teilen wird durch die Funktion Video2Img.m durchgeführt. Diese Funktion übernimmt dabei zusätzlich die Aufgabe den einzelnen Frames Namen zu geben anhand derer sie während der noch folgenden Schritte identifiziert werden können. Diese Namen setzen sich aus einer Zeichenkette zusammen deren Elemente "Frame_" und eine fortlaufende vierstellige Nummer z.B. "0001" sind.
Bild für die Verarbeitung vorbereiten
Bevor mit der eigentlichen Bildverarbeitung begonnen werden kann sind noch einige Schritte nötig. Dazu gehört auch das nächste zu verarbeitende Bild auszuwählen und zu laden. Dies geschieht anhand der fortlaufenden Nummerieriung die zuvor durchgeführt wurde.
Im Anschluss daran wird das Bild mit Hilfe der Kameraparameter VRM_Calib_15_05_14 entzerrt. Damit ist sicher, dass horizontale Linien im Bild auch wirklich horizontal sind und nicht durch die Verzerrung der Kamera gewölbt dargestellt sind. Der Effekt tritt zwar in den Randbereichen des Bildes stärker auf als in der Bildmitte, jedoch lässt sich auf diese Weise ausschließen, dass die Verzerrung einen Einfluss auf die weiteren Ergebnisse hat. Dieser Schritt kann bei älteren Matlab Versionen als 2014b zu Komplikationen führen, da diese womöglich die verwendete Funktion nicht bereitstellen.
Die Frames liegen zunächst im RGB-Format vor, welches für das weitere Vorgehen nicht benötigt wird. Die Aufgabenstellung erfordert das Suchen von weißen Linien auf schwarzem Hintergrund. Die überflüssigen Information, die ein Farbbild enthält, werden zunächst durch eine Konvertierung in ein Graustufenbild reduziert. Danach folgt eine Reduktion der Daten durch die Funktion Gray2BW.m, die die Konvertierung von Graufstufen zu einem Schwarz-Weiß-Bild vornimmt. Das Fahrzeug selbst ist im unteren Drittel des Bildes nach diesem Schritt immer noch zu sehen. Um "mitfahrende weiße Linien" zu verhindern, wird der Teil des Bildes, der durch das Fahrzeug verdeckt wird ausmaskiert. Dies geschieht mit Hilfe des Bildes Maske_Fahrzeug. Zuletzt werden durch Anwenden des Sobel-Operators die Kanteninformationen aus dem Bild gewonnen.
Einlesen in Endlosschleife
%% In Endlosschleife über Bilder laufen
while 1 % Endlosschleife über alle Frames ohne Ende
Frame_Name = ['Frame_',num2str(Frame_Counter(1)), ... % Bildname bestimmen
num2str(Frame_Counter(2)),num2str(Frame_Counter(3)), ... % Zusammensetzung aus Elementen des Arrays "Frame_Counter"
num2str(Frame_Counter(4))];
%% Frame hochzählen
Frame_Counter(4) = Frame_Counter(4) + Zeitschritte; % z.B. '+2': 2*(1/30) Sekunden zwischen den Bildern, da 30 Frames/sek
if Frame_Counter(4) == 10 % Auswirkung von letzter Stelle prüfen, daher nur Zeitschritte 1;2;5;10 erlaubt
Frame_Counter(4) = 0; % Letzte Stelle resetten
Frame_Counter(3) = Frame_Counter(3) + 1; % Dafür 3. Stelle inkrementieren
if Frame_Counter(3) == 10 % Auswirkung auf 2. Stelle prüfen
Frame_Counter(3) = 0; % 3. Stelle resetten
Frame_Counter(2) = Frame_Counter(2) + 1; % 2. Stelle inkrementieren
if Frame_Counter(2) == 10 % Auswirkung auf 1. Stelle prüfen
Frame_Counter(2) = 0; % 2. Stelle resetten
Frame_Counter(1) = Frame_Counter(1) + 1; % 1. Stelle inkrementieren
end
end
end
%% Zurücksetzen wenn alle Frames durchlaufen wurden
if Frame_Counter(1) * 1000 + Frame_Counter(2) * 100 + ... % Wenn alle Frames durchlaufen wurden
Frame_Counter(3) * 10 + Frame_Counter(4) >= 2331
Frame_Counter(1) = 0; % alle Zähler zurücksetzen und von vorne beginnen
Frame_Counter(2) = 0;
Frame_Counter(3) = 0;
Frame_Counter(4) = 0;
end
Algorithmus zur Linienerkennung
Laufzeitbetrachtung
Nachverarbeitende Maßnahmen
Weblinks
Carolo Cup 2012 - Spatzenhirn (Uni Ulm)
→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2015