Skip to content
Snippets Groups Projects
Select Git revision
  • c0b1f23342fa949a2ac425aa6c287484b5f078bb
  • Bachelorarbeit default protected
2 results

implementation.tex

Blame
  • implementation.tex 12.98 KiB
    \chapter{Fahrspurerkennung} \label{chap: implementation}
    
    	Dieses Kapitel thematisiert, wie die Erkennung der Fahrspurmarkierungen umgesetzt wir. Begonnen wird mit einer konzeptionellen Version in
    	Python, mit der der Ablauf des Algorithmus geplant und getestet wird. Danach wird die Logik in einer \gls{C++} \gls{ROS Node} umgesetzt, um die
    	best möglichst Performance zu erhalten.
    
    	\begin{figure}
    		\includegraphics[page=1,scale=.85]{svg/Topics_makerDetection.pdf}
    		\caption{Zusammenhang der Fahrspurmarkierung-Erkennungs \gls{ROS Node} mit den bestehenden \glspl{ROS Node}}
    		\label{fig: topics marker detection}
    	\end{figure}
    
    	Wie diese neuen \glspl{ROS Node} mit den bestehenden \glspl{ROS Node} in Beziehung stehen soll, ist in \autoref{fig: topics marker detection}
    	grafisch dargestellt. Neu ist dabei, dass diese \gls{ROS Node} das korrigierte Schwarz-Weiß Bild von der in \autoref{sec: undistort Node}
    	beschriebenen entzerrer \gls{ROS Node} abonniert und die eigenen Ergebnis als neues \gls{Topic} zur Verfügung stellt.
    
    	\section{Konzeptionierung in Python}
    
    		Die Entwicklung und Konzeptionierung des Algorithmus Erfolg in \gls{python}, da diese Sprache nicht kompiliert werden muss, was das Testen
    		beschleunigt, und generell einfacher zu verwenden ist.
    
    		Der Algorithmus lässt sich in mehre Einzelschritte aufteilen und wird daher in den folgen Unterkapitel beschreiben. Zur Übersicht
    		ist aber der gesamte Ablauf in \autoref{fig: PAP} vereinfacht skizziert. Angefangen wird dort mit dem Erhalten des Bildes, womit sowohl
    		manuelles laden eines Beispielbildes, als auch das Erhalten des Bildes über ein \gls{Topic} gemeint ist.
    
    		\begin{figure}
    			\includegraphics[scale=.85]{svg/PAP_marker_erkennung.pdf}
    			\caption{Ablauf des Algorithmus zur Erkennung von Fahrspurmarkierungen}
    			\label{fig: PAP}
    		\end{figure}
    
    		Während einer Testfahrt des \glspl{JetBot} wurden von der entzerrer \gls{ROS Node} veröffentlichte Bilder abgespeichert, sodass sie zum
    		lokalen Testen zur Verfügung stehen. Diese wurden unter \cite{git:dataset-strassen} abgelegt. In \autoref{fig: beispiel bild} ist eines dieser
    		Bilder gezeigt, mit dem im Folgenden die Einzelschritte demonstriert werden.
    
    		\begin{figure}
    			\includegraphics[width=.6\textwidth]{img/Marks_original.png}
    			\caption{Ein Beispiel Bild an dem der Ablauf demonstriert wird}
    			\label{fig: beispiel bild}
    		\end{figure}
    
    
    		\pagebreak
    		\subsection{Kantenerkennung mittels Canny-Edge-Detektor}
    
    			Begonnen wird mit der Detektion von Kante im Bild. Dazu wird das Bild zuerst mit \gls{OpenCV} geladen. \todo{Absatz Ja/Nein?}
    
    			Um kleine Störungen im Bild, welche bestehende Kanten verzerren oder als falsche Kante erkannt werden könnten, zu reduzieren, wird das
    			Bild mit einem \glslink{gauss-filter}{Gaußschen Filter} geglättet. Es wird ein $3\!\times\!3$ \gls{Kernel} mit einer Normalverteilung von
    			$\sigma=1,5$ verwendet. \gls{OpenCV} stell hierzu die Funktion \lstinline{GaussianBlur()} zur Verfügung, der das geladene Bild, die
    			Kegelgröße und der Wert für $\sigma$ übergeben wird.
    
    			Die eigentliche Kantenerkennung wird mittels eines \glspl{canny} durchgeführt. Dabei handelt es sich um einen von John Canny 19983
    			entwickelten und in \cite{Canny:computationAlapproachEdgeDetection} veröffentlichten Algorithmus. Dieser bestimmt für jeden Pixel den
    			Gradientenbetrag der Gradienten in X- und Y-Richtung. Dann werden diejenigen Pixel unterdrückt, welche entlang der Gradientenrichtung kein
    			Maximum darstellen. Zum Abschluss wird das Bild mit einem Hysterese-Schwellwert binarisiert. Das bedeutet, dass alle Pixel über einem
    			initialen, oberen Schwellwert als Kanten gesetzt werden und mittels eines zweiten, niedrigeren Schwellwerte, Lücken zwischen diesen Pixeln
    			geschlossen werden. \cite{Nischwitz:Computergrafik2}
    
    			Auch dieser Algorithmus ist in \gls{OpenCV} bereits implementiert und wird für den ersten Entwurf verwendet. Die Funktion bekommt das
    			geladene und geglättet Bild sowie die beiden Hysterese-Schwellwerte übergeben. Diese ist auch in \autoref{code: canny} gezeigt.
    
    			\begin{lstlisting}[
    				float,
    				style=example,
    				caption={Laden, glätten eines Bildes und durchführen der Kantenerkennung mit \gls{OpenCV}},
    				label=code: canny,
    				language=Python
    			]
    				# load image (should be gray, so convert)