Objekterkennung mit Kamera: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
 
(36 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=='''Einleitung und Ziel'''==
=='''Einleitung und Ziel'''==
In diesem Kapitel geht es um die Erkennung von Objekten mit Hilfe der am Fahrzeug verbauten Kamera. Bei der Kamera handelt es sich um das von der Firma [http://www.vrmagic.com/de/ VRmagic GmbH] vertriebene Modul [http://www.vrmagic.com/fileadmin/downloads/imaging/Camera_Datasheets/intelligent_cameras/VRmDC-12_OEM_COB.pdf VRmDC-12 COB]. Diese beruht auf einem CMOS-Sensor liefert eine Auflösung von 754 x 480 Pixeln, eine maximale Bildrate von 70 fps und sowohl Farb- als auch Monochrombilder. Der integrierte 600 MHz C64x+ DSP wurde aufgrund der benötigten Einarbeitungszeit in die Linux-Programmierung nicht genutzt. Die Bilder der Kamera wurden via Ethernet-Schnittstelle an den im Fahrzeug verbauten Computer versendet. Die mitgelieferten Bibliotheken erlaubten einen Zugriff auf die Bilder in Visual Studio.
In diesem Kapitel geht es um die Erkennung von Objekten mit Hilfe der am Fahrzeug verbauten Kamera. Bei der Kamera handelt es sich um das von der Firma [http://www.vrmagic.com/de/ VRmagic GmbH] vertriebene Modul [http://www.vrmagic.com/fileadmin/downloads/imaging/Camera_Datasheets/intelligent_cameras/VRmDC-12_OEM_COB.pdf VRmDC-12 COB]. Dieses beruht auf einem CMOS-Sensor, liefert eine Auflösung von 754 x 480 Pixeln, eine maximale Bildrate von 70 fps und sowohl Farb- als auch Monochrombilder. Der integrierte 600 MHz C64x+ DSP wurde, aufgrund der benötigten Einarbeitungszeit in die Linux-Programmierung, nicht genutzt. Die Bilder der Kamera wurden via Ethernet-Schnittstelle an den im Fahrzeug verbauten Computer versendet. Die mitgelieferten Bibliotheken erlaubten einen Zugriff auf die Bilder in Visual Studio.


Für die Erarbeitung eines optimalen Algorithmus wurde im ersten Schritt eine Offline-Umgebung in Matlab erstellt. Hier galt es die mit der Kamera aufgenommen Bilder so zu verarbeiten, dass die darauf zu sehenden Objekte erkannt werden.
Für die Erarbeitung eines optimalen Algorithmus wurde im ersten Schritt eine Offline-Umgebung in Matlab erstellt. Hier galt es die mit der Kamera aufgenommen Bilder so zu verarbeiten, dass die darauf zu sehenden Objekte erkannt werden.
Erst im zweiten Schritt folgte die online Anwendung auf dem Computer des Fahrzeuges.
Erst im zweiten Schritt folgte die online Anwendung auf dem Computer des Fahrzeuges.
Autor: [[Benutzer:Christian Hauke|Christian Hauke]] ([[Benutzer Diskussion:Christian Hauke|Diskussion]]) 14:30, 5. Feb. 2014 (CET)


=='''Objekterkennung in Matlab'''==
=='''Objekterkennung in Matlab'''==
In diesem Abschnitt wird die Objekterkennung mit Hilfe von Matlab beschrieben. Es handelt sich um eine Offline-Umgebung die mit aufgenommenen Bildern arbeitet.
In diesem Abschnitt wird die Objekterkennung mit Hilfe von Matlab beschrieben. Es handelt sich um eine Offline-Umgebung, die mit aufgenommenen Bildern arbeitet.
=== Bild einlesen ===
=== Bild einlesen ===
Im ersten Schritt wird in Matlab das benötigte Bild in den Workspace geladen, wo es dann als Matrix vorliegt:
Im ersten Schritt wird in Matlab das benötigte Bild in den Workspace geladen, wo es dann als Matrix vorliegt:
Zeile 28: Zeile 26:
=== Region of Interest ===
=== Region of Interest ===


Aufgrund des weitwinkeligen Sichtbereiches der Kamera wird der für die Objekterkennung relevante Bereich mit einer Region of Interest (ROI) eingeschränkt. Insbesondere der obere Teil des Bildes, sowie der untere Teil auf dem das Fahrzeug zu sehen ist, sind für die Objekterkennung nicht relevant. Somit wurde die ROI auf folgenden Bereich des Bild festgelegt:
Aufgrund des weitwinkeligen Sichtbereiches der Kamera wird der für die Objekterkennung relevante Bereich mit einer Region of Interest (ROI) eingeschränkt. Insbesondere der obere Teil des Bildes, sowie der untere Teil auf dem das Fahrzeug zu sehen ist, sind für die Objekterkennung nicht relevant. Somit wurde die ROI auf folgenden Bereich des Bildes festgelegt:
* y-Achse: 100-360
* y-Achse: 100-360
* x-Achse: 1-500
* x-Achse: 1-500
Zeile 40: Zeile 38:
=== Vorverarbeitung ===
=== Vorverarbeitung ===


Da das auffinden der weißen Objekte mit Hilfe eines Schwellwertes geschehen soll, wurden Überlegungen angestellt, wie die weißen Linien der Fahrspur im Bild auszulöschen sind. Hierzu wurde in Matlab eine Funktion gefunden, die mit einem festgelegten Filterkern das Bild glättet und die Fahrspuren somit nicht mehr vorhanden sind, da diese zu schmal sind. Als Kern wurde ein Quadrat mit 20 Pixeln Kantenlänge gewählt.
Da das Auffinden der weißen Objekte mit Hilfe eines Schwellwertes geschehen soll, wurden Überlegungen angestellt, wie die weißen Linien der Fahrspur im Bild auszulöschen sind. Hierzu wurde in Matlab eine Funktion gefunden, die mit einem festgelegten Filterkern das Bild glättet und die Fahrspuren somit nicht mehr vorhanden sind, da diese zu schmal sind. Als Kern wurde ein Quadrat mit 20 Pixeln Kantenlänge gewählt.


  %Bild glätten
  %Bild glätten
Zeile 51: Zeile 49:
=== Schwellwertbetrachtung ===
=== Schwellwertbetrachtung ===


In dem nun vorhandenen Bild ist lediglich der weißte Karton, also das Objekt, zu erkennen. Mit Hilfe eines Schwellwertes sollen nun nur die zum Karton zugehörigen Pixel übernommen und alle anderen Pixel ignoriert werden. Als Schwellwert wurde nach ein wenig Experimentieren der Grauwert 220 festgelegt. Alle Pixel die unterhalb dieses Wertes liegen werden zu 0, alle anderen zu 1.
In dem vorhandenen Bild ist lediglich der weißte Karton, also das Objekt, zu erkennen. Mit Hilfe eines Schwellwertes sollen nun nur die zum Karton zugehörigen Pixel übernommen und alle anderen Pixel ignoriert werden. Als Schwellwert wurde der Grauwert 220 festgelegt. Alle Pixel die unterhalb dieses Wertes liegen werden zu 0, alle anderen zu 1.
  %Schwellwertbetrachtung
  %Schwellwertbetrachtung
  Schwellwert = (Bild_glatt <220);
  Schwellwert = (Bild_glatt <220);
Zeile 67: Zeile 65:
=== Labeling ===
=== Labeling ===


Im nächsten Schritt geht es darum, zusammenhängende Bereiche als einen zu definieren. Hierzu wird das entsprechende Schwellwertbild verwendet. Alle Pixel die über eine 8-Nachbarschaft miteinander verbunden sind werden einem Objekt zugeordnet. Gibt es weitere Pixel im Bild so werden diese einem neuem Objekt zugeordnet.
Im nächsten Schritt geht es darum, zusammenhängende Bereiche als einen zu definieren. Hierzu wird das entsprechende Schwellwertbild verwendet. Alle Pixel die über eine 8-Nachbarschaft miteinander verbunden sind, werden einem Objekt zugeordnet. Gibt es weitere Pixel im Bild, so werden diese einem neuem Objekt zugeordnet.
Desweiteren erfolgt ein Größenvergleich der gefundenen Labels. Erst ab einer Größe von mehr als 1000 zugehörigen Pixeln wird ein Label als Objekt gewertet und dargestellt. So können kleine helle Flecken im Bild ausgeschlossen werden.
Des Weiteren erfolgt ein Größenvergleich der gefundenen Labels. Erst ab einer Größe von mehr als 1000 zugehörigen Pixeln wird ein Label als Objekt gewertet und dargestellt. So können kleine helle Flecken im Bild ausgeschlossen werden.
  %Schwellwertbild labeln
  %Schwellwertbild labeln
  L = bwlabel(Bild_schwell, 8);
  L = bwlabel(Bild_schwell, 8);
Zeile 89: Zeile 87:
[[Datei:Label.png|1000px|Aufgenommenes Bild]]
[[Datei:Label.png|1000px|Aufgenommenes Bild]]


Die Abbildung unterscheidet sich in diesem Falle nicht von der der Schwellwertbetrachtung, da nur ein Objekt auf dem Bild zu sehen ist und somit nur ein Label gesetzt wird. Am Ende dieses Abschnittes folgt ein weiteres Beispiel, in dem mehrer Obejkte zu sehen sind und somit auch mehrer Labels erstellt werden.
Die Abbildung unterscheidet sich in diesem Falle nicht von der der Schwellwertbetrachtung, da nur ein Objekt auf dem Bild zu sehen ist und somit nur ein Label gesetzt wird. Am Ende dieses Abschnittes folgt ein weiteres Beispiel, in dem mehrere Obejkte zu sehen sind und somit auch mehrer Labels erstellt werden.


=== Darstellung der Objekte ===
=== Darstellung der Objekte ===


Zur Darstellung der Objekte werden aus den gefundenen Labels die minimalen und maximalen Werte in x- und y-Richtung bestimmt.
Zur Darstellung der Objekte, werden aus den gefundenen Labels die minimalen und maximalen Werte in x- und y-Richtung bestimmt.
  %for i=1:counter-1
  %for i=1:counter-1
  [y_Kiste,x_Kiste] = find(L==index(i));
  [y_Kiste,x_Kiste] = find(L==index(i));
Zeile 102: Zeile 100:
  end
  end


Anhand dieser vier Variablen lassen sich alle Ecken des gefundenen Objektes beschreiben und das Objekt kann als Recheck eingezeichnet werden.
Anhand dieser vier Variablen lassen sich alle Ecken des gefundenen Objektes beschreiben und das Objekt kann als Rechteck eingezeichnet werden.
[[Datei:Objekt.png|1000px|Aufgenommenes Bild]]
[[Datei:Objekt.png|1000px|Aufgenommenes Bild]]


Soll das Objekt in das ursprüngliche Bild eingezeichnet werden, so ist darauf zu achten, dass die Beschränkung der ROI wieder herausgerechnet werden muss. Was anfangs weggeschnitten wurde muss nun wieder auf die Koordinaten addiert werden.
Soll das Objekt in das ursprüngliche Bild eingezeichnet werden, so ist darauf zu achten, dass die Beschränkung der ROI wieder herausgerechnet werden muss. Was anfangs weggeschnitten wurde, muss nun wieder auf die Koordinaten addiert werden.


[[Datei:ObjektBild.png|1000px|Aufgenommenes Bild]]
[[Datei:ObjektBild.png|1000px|Aufgenommenes Bild]]


=== Koordinatentransformation ===
 
=== Beispiel mit zwei Objekten ===
=== Beispiel mit zwei Objekten ===
[[Datei:ZweiObjekte.png|1000px|Aufgenommenes Bild]]
[[Datei:ZweiObjekte.png|1000px|Aufgenommenes Bild]]
=== Koordinatentransformation ===
Für die Koordinatentransformation wurden mit Hilfe der Camera Calibration Toolbox for Matlab die intrinsischen und extrinsischen Parameter der Kamera bestimmt.
Bei der Kalibrierung ergab sich für die intrinsische Kameramatrix A folgendes Ergebnis:
<math>A=\begin{pmatrix}
f_{x} & 0 & c_{x} \\
0 & f_{y} & c_{y}\\
0 & 0 & 1\\
\end{pmatrix}=\begin{pmatrix}
481.25 & 0 & 375.5 \\
0 & 481.25 & 238.5\\
0 & 0 & 1\\
\end{pmatrix}</math>
mit
*<math>f_{x}</math> fokale Länge in x-Richtung in Pixel
*<math>f_{y}</math> fokale Länge in y-Richtung in Pixel
*<math>c_{x}</math> Position der optischen Achse in x-Richtung in Pixel
*<math>c_{y}</math> Position der optischen Ache in y-Richtung in Pixel
Die Kamera ist in diesem Falle mit einem Nickwinkel '''<math>\Theta</math>''' von 11° zum Boden geneigt, einen Gierwinkel '''<math>\Psi</math>''' von 1.4° zur rechten Fahrzeugseite und einem Rollwinkel '''<math>\Phi</math>''' von 2° verbaut.
Für die extrinsischen Transformationsparameter ergaben sich die Rotationsvektor <math>R</math> in rad und der Translationsvektor <math>T</math> zu folgendem:
<math>R=\begin{pmatrix}
\Theta\\
\Phi\\
\Psi\\
\end{pmatrix}=\begin{pmatrix}
1.7632\\
0.0340\\
-0.0244\\
\end{pmatrix}</math>
<math>T=\begin{pmatrix}
t_{x}\\
t_{y}\\
t_{z}\\
\end{pmatrix}=\begin{pmatrix}
-452.4129\\
129.9002\\
726.9537\\
\end{pmatrix}</math>
Eine inverse perspektivische Transformation ist nun mit folgenden Formeln durchführbar:
<math>\begin{pmatrix}
x_{c}\\
y_{c}\\
z_{c}\\
\end{pmatrix}=\begin{pmatrix}
x_{p} \cdot z_{c}\\
y_{p} \cdot z_{c}\\
z_{c}\\
\end{pmatrix}</math>
<math>\begin{pmatrix}
x_{w}\\
y_{w}\\
z_{w}\\
\end{pmatrix} = (A \cdot (R|T))^{-1} \cdot \begin{pmatrix}
x_{c}\\
y_{c}\\
z_{c}\\
\end{pmatrix}</math>


=='''Implementierung in C++'''==
=='''Implementierung in C++'''==
Die Objekterkennung via Kamera wurde zusammen mit der Objekterkennung via Lidar und der Spurerkennung in ein Visual Studio Projekt zusammengeführt. Für die kamerabasierte Objekterkennung sind die Headerdatei CamObjekt.h und die Quelldatei CamObject.cpp, die im Hauptprogramm SpurerkennungV01.cpp aufgerufen wird, von Bedeutung.
Am Anfang der Datei CamObject.cpp können einige Einstellungen vorgenommen werden. Zuerst besteht die Möglichkeit zu wählen, welcher Verarbeitungsschritt angezeigt wird. Ebenfalls werden Konstanten festgelegt.
#define SHOW_CAM_GAUSSIAN  0
#define SHOW_CAM_THRESHHOLD 0
#define SHOW_CAM_CLEARLANE  0
#define SHOW_CAM_LABEL      0
#define SHOW_CAM_OBJECTS    0
#define CAM_MIN_PIXELSIZE  1000 // Anzahl Pixel die ein Objekt mindestens benötigt
#define CAM_RECT_FIT        0.6  // Prozentsatz der Pixelzahl eines Rechtecks
#define CAM_MIN_PIXELLENGTH 20  // minimale Breite einer weißen Pixelzeile um als potentielles Objekt erkannt zu werden
#define CAM_OBJ_THRESHOLD  230  // Schwellwert
Im Anschluss ähnelt der Algorithmus der oben gezeigten Matlab-Lösung. Es werden folgende Schritte nacheinander ausgeführt:
* ROI festlegen
* Schwellwert
* Spurlinien entfernen
* Labeling
* Objekte bilden
Der Quellcode ist im SVN unter folgendem [http://193.175.248.52/usvn/svn/MTR_SDE_Praktikum/trunk/Software/ObjektSpurFusion/SpurerkennungV01/CamObject.cpp Link] zu finden.
=='''Ausblick'''==
Das weitere Vorgehen besteht darin, die Koordinatentransformation zu implementieren, um eine Entfernung zu den Objekten zu bestimmen und die Objekte mit denen der Lidar-Messung zu vergleichen bzw. mit Hilfe eines Kalman-Filters zu fusionieren.
Ebenfalls ist über eine detaillierte Beschreibung der Objekte nachzudenken, in denen die notwendigen Informationen in einer Struktur vorhanden sind.
Autor: [[Benutzer:Christian Hauke|Christian Hauke]] ([[Benutzer Diskussion:Christian Hauke|Diskussion]]) 19:00, 7. Feb. 2014 (CET)

Aktuelle Version vom 7. Februar 2014, 18:56 Uhr

Einleitung und Ziel

In diesem Kapitel geht es um die Erkennung von Objekten mit Hilfe der am Fahrzeug verbauten Kamera. Bei der Kamera handelt es sich um das von der Firma VRmagic GmbH vertriebene Modul VRmDC-12 COB. Dieses beruht auf einem CMOS-Sensor, liefert eine Auflösung von 754 x 480 Pixeln, eine maximale Bildrate von 70 fps und sowohl Farb- als auch Monochrombilder. Der integrierte 600 MHz C64x+ DSP wurde, aufgrund der benötigten Einarbeitungszeit in die Linux-Programmierung, nicht genutzt. Die Bilder der Kamera wurden via Ethernet-Schnittstelle an den im Fahrzeug verbauten Computer versendet. Die mitgelieferten Bibliotheken erlaubten einen Zugriff auf die Bilder in Visual Studio.

Für die Erarbeitung eines optimalen Algorithmus wurde im ersten Schritt eine Offline-Umgebung in Matlab erstellt. Hier galt es die mit der Kamera aufgenommen Bilder so zu verarbeiten, dass die darauf zu sehenden Objekte erkannt werden. Erst im zweiten Schritt folgte die online Anwendung auf dem Computer des Fahrzeuges.

Objekterkennung in Matlab

In diesem Abschnitt wird die Objekterkennung mit Hilfe von Matlab beschrieben. Es handelt sich um eine Offline-Umgebung, die mit aufgenommenen Bildern arbeitet.

Bild einlesen

Im ersten Schritt wird in Matlab das benötigte Bild in den Workspace geladen, wo es dann als Matrix vorliegt:

%Bild einlesen
Bild = imread('Name.png');

Aufgenommenes Bild

Um die Datenmenge zu reduzieren, wird das in Farbe aufgenommene Bild in ein Graustufenbild umgewandelt:

%Umwandlung in Graustufen
Bild_grau = rgb2gray(Bild);

Aufgenommenes Bild Aufgenommenes Bild

Zur späteren Nutzung der Algorithmen müssen die Informationen der Bild-Matrix als Daten vom Typ double vorliegen. Hierzu wird die folgende Umwandlung durchgeführt:

%Umwandeln in double
Bild_grau = double(Bild_grau)

Region of Interest

Aufgrund des weitwinkeligen Sichtbereiches der Kamera wird der für die Objekterkennung relevante Bereich mit einer Region of Interest (ROI) eingeschränkt. Insbesondere der obere Teil des Bildes, sowie der untere Teil auf dem das Fahrzeug zu sehen ist, sind für die Objekterkennung nicht relevant. Somit wurde die ROI auf folgenden Bereich des Bildes festgelegt:

  • y-Achse: 100-360
  • x-Achse: 1-500

In Matlab wird dazu die Matrix des Bildes auf den entsprechenden Bereich zugeschnitten:

%ROI
Bild_grau = Bild_grau(100:360,1:500);

Aufgenommenes Bild Aufgenommenes Bild

Vorverarbeitung

Da das Auffinden der weißen Objekte mit Hilfe eines Schwellwertes geschehen soll, wurden Überlegungen angestellt, wie die weißen Linien der Fahrspur im Bild auszulöschen sind. Hierzu wurde in Matlab eine Funktion gefunden, die mit einem festgelegten Filterkern das Bild glättet und die Fahrspuren somit nicht mehr vorhanden sind, da diese zu schmal sind. Als Kern wurde ein Quadrat mit 20 Pixeln Kantenlänge gewählt.

%Bild glätten
se = strel('square',20);
Bild_glatt = imopen(Bild_grau,se);


Aufgenommenes Bild

Schwellwertbetrachtung

In dem vorhandenen Bild ist lediglich der weißte Karton, also das Objekt, zu erkennen. Mit Hilfe eines Schwellwertes sollen nun nur die zum Karton zugehörigen Pixel übernommen und alle anderen Pixel ignoriert werden. Als Schwellwert wurde der Grauwert 220 festgelegt. Alle Pixel die unterhalb dieses Wertes liegen werden zu 0, alle anderen zu 1.

%Schwellwertbetrachtung
Schwellwert = (Bild_glatt <220);
Schwellwert = ~Schwellwert;

Da es aufgrund der Lichtverhältnisse vorkommen kann, dass innerhalb des Kartons Pixel unterhalb des Schwellwertes liegen und somit "Löcher" im Bild auftauchen, wurde die von Matlab gelieferte Funktion imfill genutzt um diese zu füllen.

%Löcher füllen
Bild_schwell = imfill(Schwellwert,'holes');

Die Funktion schaut dabei, ob ein oder mehrere Pixel mit dem Wert 0 komplett von Pixeln des Wertes 1 umgeben sind. Falls dies der Fall ist werden diese ebenfalls auf 1 gesezt.


Aufgenommenes Bild

Labeling

Im nächsten Schritt geht es darum, zusammenhängende Bereiche als einen zu definieren. Hierzu wird das entsprechende Schwellwertbild verwendet. Alle Pixel die über eine 8-Nachbarschaft miteinander verbunden sind, werden einem Objekt zugeordnet. Gibt es weitere Pixel im Bild, so werden diese einem neuem Objekt zugeordnet. Des Weiteren erfolgt ein Größenvergleich der gefundenen Labels. Erst ab einer Größe von mehr als 1000 zugehörigen Pixeln wird ein Label als Objekt gewertet und dargestellt. So können kleine helle Flecken im Bild ausgeschlossen werden.

%Schwellwertbild labeln
L = bwlabel(Bild_schwell, 8);
Anzahl = max(max(L));
counter = 1;
%Label auf Größe abgleichen
for n = 1:1:Anzahl
   Menge = size(find(L==n),1);
   if Menge > 1000
      index(counter)=n
      [x_index,y_index] = find(L==index(counter));
      Koord_x(counter) = x_index(1,1);
      Koord_y(counter) = y_index(1,1);
      counter = counter+1;
   end
end
%Passende Bereiche im Bild beibehalten
Bild_select = bwselect(Bild_schwell,Koord_y,Koord_x,8);

Aufgenommenes Bild

Die Abbildung unterscheidet sich in diesem Falle nicht von der der Schwellwertbetrachtung, da nur ein Objekt auf dem Bild zu sehen ist und somit nur ein Label gesetzt wird. Am Ende dieses Abschnittes folgt ein weiteres Beispiel, in dem mehrere Obejkte zu sehen sind und somit auch mehrer Labels erstellt werden.

Darstellung der Objekte

Zur Darstellung der Objekte, werden aus den gefundenen Labels die minimalen und maximalen Werte in x- und y-Richtung bestimmt.

%for i=1:counter-1
[y_Kiste,x_Kiste] = find(L==index(i));
x_Kiste_min(i) = min(x_Kiste);
x_Kiste_max(i) = max(x_Kiste);
y_Kiste_min(i) = min(y_Kiste);
y_Kiste_max(i) = max(y_Kiste);
end

Anhand dieser vier Variablen lassen sich alle Ecken des gefundenen Objektes beschreiben und das Objekt kann als Rechteck eingezeichnet werden. Aufgenommenes Bild

Soll das Objekt in das ursprüngliche Bild eingezeichnet werden, so ist darauf zu achten, dass die Beschränkung der ROI wieder herausgerechnet werden muss. Was anfangs weggeschnitten wurde, muss nun wieder auf die Koordinaten addiert werden.

Aufgenommenes Bild


Beispiel mit zwei Objekten

Aufgenommenes Bild

Koordinatentransformation

Für die Koordinatentransformation wurden mit Hilfe der Camera Calibration Toolbox for Matlab die intrinsischen und extrinsischen Parameter der Kamera bestimmt. Bei der Kalibrierung ergab sich für die intrinsische Kameramatrix A folgendes Ergebnis:

mit

  • fokale Länge in x-Richtung in Pixel
  • fokale Länge in y-Richtung in Pixel
  • Position der optischen Achse in x-Richtung in Pixel
  • Position der optischen Ache in y-Richtung in Pixel

Die Kamera ist in diesem Falle mit einem Nickwinkel von 11° zum Boden geneigt, einen Gierwinkel von 1.4° zur rechten Fahrzeugseite und einem Rollwinkel von 2° verbaut. Für die extrinsischen Transformationsparameter ergaben sich die Rotationsvektor in rad und der Translationsvektor zu folgendem:

Eine inverse perspektivische Transformation ist nun mit folgenden Formeln durchführbar:

Implementierung in C++

Die Objekterkennung via Kamera wurde zusammen mit der Objekterkennung via Lidar und der Spurerkennung in ein Visual Studio Projekt zusammengeführt. Für die kamerabasierte Objekterkennung sind die Headerdatei CamObjekt.h und die Quelldatei CamObject.cpp, die im Hauptprogramm SpurerkennungV01.cpp aufgerufen wird, von Bedeutung.

Am Anfang der Datei CamObject.cpp können einige Einstellungen vorgenommen werden. Zuerst besteht die Möglichkeit zu wählen, welcher Verarbeitungsschritt angezeigt wird. Ebenfalls werden Konstanten festgelegt.

#define SHOW_CAM_GAUSSIAN   0
#define SHOW_CAM_THRESHHOLD 0
#define SHOW_CAM_CLEARLANE  0
#define SHOW_CAM_LABEL      0
#define SHOW_CAM_OBJECTS    0
#define CAM_MIN_PIXELSIZE   1000 // Anzahl Pixel die ein Objekt mindestens benötigt
#define CAM_RECT_FIT        0.6  // Prozentsatz der Pixelzahl eines Rechtecks
#define CAM_MIN_PIXELLENGTH 20   // minimale Breite einer weißen Pixelzeile um als potentielles Objekt erkannt zu werden
#define CAM_OBJ_THRESHOLD   230  // Schwellwert

Im Anschluss ähnelt der Algorithmus der oben gezeigten Matlab-Lösung. Es werden folgende Schritte nacheinander ausgeführt:

  • ROI festlegen
  • Schwellwert
  • Spurlinien entfernen
  • Labeling
  • Objekte bilden

Der Quellcode ist im SVN unter folgendem Link zu finden.


Ausblick

Das weitere Vorgehen besteht darin, die Koordinatentransformation zu implementieren, um eine Entfernung zu den Objekten zu bestimmen und die Objekte mit denen der Lidar-Messung zu vergleichen bzw. mit Hilfe eines Kalman-Filters zu fusionieren. Ebenfalls ist über eine detaillierte Beschreibung der Objekte nachzudenken, in denen die notwendigen Informationen in einer Struktur vorhanden sind.

Autor: Christian Hauke (Diskussion) 19:00, 7. Feb. 2014 (CET)