DSB18: Spurerkennung: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
(Eine dazwischenliegende Version von einem anderen Benutzer wird nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
'''Autor:''' <br/> | '''Autor:''' [[Benutzer:Steffen_Topp| Steffen Topp]]<br/> | ||
'''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | '''Betreuer:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]] | ||
Zeile 16: | Zeile 16: | ||
# Wissenschaftliche Dokumentation als HSHL-Wiki Artikel | # Wissenschaftliche Dokumentation als HSHL-Wiki Artikel | ||
# Softwareentwicklung nach SDE Standard in SVN | # Softwareentwicklung nach SDE Standard in SVN | ||
# Funktionsnachweis als YouTube-Video (vgl. [[Veranstaltungsregeln_DSB_SoSe2018|Veranstaltungsregeln]] | # Funktionsnachweis als YouTube-Video (vgl. [[Veranstaltungsregeln_DSB_SoSe2018|Veranstaltungsregeln]]) | ||
== Lösungen == | == Lösungen == | ||
=== Einlesen des Videos und Einstellungen === | |||
[[Datei:Spurerkennung.png|thumb|Ergebnisse des Algorithmus zur Spurerkennung.]] | |||
Im ersten Schritt wird das Video mit der VideoReader-Funktion von Matlab eingelesen, eine Region of Interest wird festgelegt und das Ausgabefenster wird auf Vollbild eingestellt. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
%% Video einlesen + Einstellungen | |||
vid = VideoReader('Rundkurs.mp4'); % Video einlesen | |||
area = [1 220 751 258]; %[xmin, ymin, width, height] | |||
figure('units','normalized','outerposition',[0 0 1 1]); % Vollbild | |||
hold on | |||
</syntaxhighlight> | |||
=== Vorverarbeitung === | |||
Für die Vorverarbeitung wird zunächst ein Frame geladen. Anschließend wird das geladene Frame auf den in den Einstellungen definierten Bereich zugeschnitten und in ein Binärbild konvertiert. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
while hasFrame(vid) | |||
% Frames laden | |||
frame = readFrame (vid); | |||
% Region of Interest eingrenzen | |||
roi = imcrop(frame,area); | |||
% In Schwarz / Weiß konvertieren | |||
bwframe = im2bw(roi, 0.9); | |||
% Eregbnis ausgeben | |||
subplot(2,2,1) | |||
imshow(bwframe); | |||
title('1) ROI + IM2BW') | |||
</syntaxhighlight> | |||
Im nächsten Schritt wird das Fahrzeug aus dem Bildbereich entfernt. Da die Kamera fest auf dem Auto installiert ist und damit statisch im Video die gleichen Pixel belegt, können diese mit dem Wert 0 übeschrieben werden. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
% Entfernen des Fahrzeuges aus dem Bildbereich | |||
bwframe (195:258, 155:625) = 0; % Bereich 1 | |||
bwframe (160:195, 210:445) = 0; % Bereich 2 | |||
bwframe (125:195, 110:215) = 0; % Bereich 3: Gyro | |||
bwframe (110:160, 345:430) = 0; % Bereich 4: Lidar | |||
</syntaxhighlight> | |||
Um die Kanten der Fahrbahnmarkierungen zu filtern wird der Sobel-Operator angewendet. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
% Sobel-Operator zur Kantendetektion anwenden | |||
sobel = edge(bwframe,'sobel',[0.2],'vertical'); | |||
% Zwischenergbnis ausgeben | |||
subplot(2,2,2) | |||
imshow(sobel); | |||
title('2) Sobel-Operator') | |||
</syntaxhighlight> | |||
=== Zusammenführung der Doppelkanten === | |||
Der Sobel-Operator liefert jeweils zwei Kanten einer Fahrbahnmarkierung. Diese werden zu einer Linie zusammengefasst, indem der Abstand x-Richtung zweier Punkte auf den maximalen Wert von 25 Pixeln geprüft wird. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
%% Doppelkanten zu einer Linie zusammenführen | |||
maxgap = 25; % maximaler Abstand zweier Punkte | |||
counter = 0; % Zählvariable zur Abmessung der Lücke | |||
bwframe = zeros(259, 752); % Verwendung vorhandener Matrix | |||
for y = 1:259 | |||
for x = 1:752 | |||
if (sobel(y, x) == 1) | |||
if (counter > 1 && counter < maxgap) | |||
bwframe(y, x) = 1; | |||
end | |||
counter = 0; | |||
else | |||
counter = counter + 1; | |||
end | |||
end | |||
end | |||
% Zwischenergbnis ausgeben | |||
subplot(2,2,3) | |||
imshow(bwframe); | |||
title('3) Linienzusammenführung') | |||
</syntaxhighlight> | |||
=== Hough-Transformation === | |||
Die Hough-Transformation wird zur Detektion von Linien genutzt. | |||
<syntaxhighlight lang="matlab" line='line'> | |||
%% Hough-Transformation | |||
[H,theta,rho] = hough(bwframe,'Theta', -90:0.5:89); | |||
% Maxima in der Transformation ermitteln | |||
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:)))); | |||
% Linien erzeugen | |||
lines = houghlines(bwframe,theta,rho,P,'FillGap',120,'MinLength',3); | |||
% Ergebnis ausgeben | |||
subplot(2,2,4) | |||
imshow(bwframe), hold on | |||
title('Hough-Transformation') | |||
max_len = 0; | |||
for k = 1:length(lines) | |||
xy = [lines(k).point1; lines(k).point2]; | |||
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red'); | |||
end | |||
pause(0.00001) | |||
end | |||
</syntaxhighlight> | |||
=== Ausblick === | |||
Die Spurerkennung kann noch weiter optimiert werden. Aktuell funktioniert der Algorithmus auf geraden Strecken zuverlässig. In Kurven wird die Mittellinie spät erkannt, allerdings würde die äußere Fahrbahnmarkierung zur Berechnung der Fahrstrecke ausreichen. Schwächen werden an Kreuzungen und bei ungünstigen Lichtreflexionen erkennbar. | |||
== Weblinks == | == Weblinks == |
Aktuelle Version vom 6. Juli 2018, 22:58 Uhr
Autor: Steffen Topp
Betreuer: Prof. Schneider
Motivation
Eine Aufgabe beim Carolo Cup ist der "Rundkurs mit Hindernissen". Hierbei ist das Fahrzeug in der erkannten Fahrspur zu halten.
Ziel
Die Fahrspur soll robust erkannt werden.
Anforderungen
- Nutzen Sie die bestehende Aufzeichnung der Kameransicht eines Rundkurses.
- Lesen Sie diesen als Endlosschleife in Matlab ein.
- Identifizieren Sie während der virtuellen Fahrt die Fahrspur mit Matlab.
- Vermeiden Sie Fehler ("false-positives").
- Optimieren Sie die Rechenzeit Ihres Algorithmus.
- Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
- Softwareentwicklung nach SDE Standard in SVN
- Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)
Lösungen
Einlesen des Videos und Einstellungen
Im ersten Schritt wird das Video mit der VideoReader-Funktion von Matlab eingelesen, eine Region of Interest wird festgelegt und das Ausgabefenster wird auf Vollbild eingestellt.
%% Video einlesen + Einstellungen
vid = VideoReader('Rundkurs.mp4'); % Video einlesen
area = [1 220 751 258]; %[xmin, ymin, width, height]
figure('units','normalized','outerposition',[0 0 1 1]); % Vollbild
hold on
Vorverarbeitung
Für die Vorverarbeitung wird zunächst ein Frame geladen. Anschließend wird das geladene Frame auf den in den Einstellungen definierten Bereich zugeschnitten und in ein Binärbild konvertiert.
while hasFrame(vid)
% Frames laden
frame = readFrame (vid);
% Region of Interest eingrenzen
roi = imcrop(frame,area);
% In Schwarz / Weiß konvertieren
bwframe = im2bw(roi, 0.9);
% Eregbnis ausgeben
subplot(2,2,1)
imshow(bwframe);
title('1) ROI + IM2BW')
Im nächsten Schritt wird das Fahrzeug aus dem Bildbereich entfernt. Da die Kamera fest auf dem Auto installiert ist und damit statisch im Video die gleichen Pixel belegt, können diese mit dem Wert 0 übeschrieben werden.
% Entfernen des Fahrzeuges aus dem Bildbereich
bwframe (195:258, 155:625) = 0; % Bereich 1
bwframe (160:195, 210:445) = 0; % Bereich 2
bwframe (125:195, 110:215) = 0; % Bereich 3: Gyro
bwframe (110:160, 345:430) = 0; % Bereich 4: Lidar
Um die Kanten der Fahrbahnmarkierungen zu filtern wird der Sobel-Operator angewendet.
% Sobel-Operator zur Kantendetektion anwenden
sobel = edge(bwframe,'sobel',[0.2],'vertical');
% Zwischenergbnis ausgeben
subplot(2,2,2)
imshow(sobel);
title('2) Sobel-Operator')
Zusammenführung der Doppelkanten
Der Sobel-Operator liefert jeweils zwei Kanten einer Fahrbahnmarkierung. Diese werden zu einer Linie zusammengefasst, indem der Abstand x-Richtung zweier Punkte auf den maximalen Wert von 25 Pixeln geprüft wird.
%% Doppelkanten zu einer Linie zusammenführen
maxgap = 25; % maximaler Abstand zweier Punkte
counter = 0; % Zählvariable zur Abmessung der Lücke
bwframe = zeros(259, 752); % Verwendung vorhandener Matrix
for y = 1:259
for x = 1:752
if (sobel(y, x) == 1)
if (counter > 1 && counter < maxgap)
bwframe(y, x) = 1;
end
counter = 0;
else
counter = counter + 1;
end
end
end
% Zwischenergbnis ausgeben
subplot(2,2,3)
imshow(bwframe);
title('3) Linienzusammenführung')
Hough-Transformation
Die Hough-Transformation wird zur Detektion von Linien genutzt.
%% Hough-Transformation
[H,theta,rho] = hough(bwframe,'Theta', -90:0.5:89);
% Maxima in der Transformation ermitteln
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
% Linien erzeugen
lines = houghlines(bwframe,theta,rho,P,'FillGap',120,'MinLength',3);
% Ergebnis ausgeben
subplot(2,2,4)
imshow(bwframe), hold on
title('Hough-Transformation')
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red');
end
pause(0.00001)
end
Ausblick
Die Spurerkennung kann noch weiter optimiert werden. Aktuell funktioniert der Algorithmus auf geraden Strecken zuverlässig. In Kurven wird die Mittellinie spät erkannt, allerdings würde die äußere Fahrbahnmarkierung zur Berechnung der Fahrstrecke ausreichen. Schwächen werden an Kreuzungen und bei ungünstigen Lichtreflexionen erkennbar.
Weblinks
- Stereo-Webcam
- Stereo Vision mit Matlab
- Behnisch, M.: Stereovision: Grundlagen. Uni-Bielefeld, 2005
- 3D-Geometrieerfassung mit Stereovision
- Stereo Webcam-Übersicht
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 SoSe2018