DSB18: Spurerkennung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
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 20: Zeile 20:
== 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

  1. Nutzen Sie die bestehende Aufzeichnung der Kameransicht eines Rundkurses.
  2. Lesen Sie diesen als Endlosschleife in Matlab ein.
  3. Identifizieren Sie während der virtuellen Fahrt die Fahrspur mit Matlab.
  4. Vermeiden Sie Fehler ("false-positives").
  5. Optimieren Sie die Rechenzeit Ihres Algorithmus.
  6. Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
  7. Softwareentwicklung nach SDE Standard in SVN
  8. Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)

Lösungen

Einlesen des Videos und Einstellungen

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.

%% 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

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