Bildentzerrung und KOS-Transformation

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autoren: Luca_Di-Lillo, Tim Leonard Bexten
Betreuer: Prof. Schneider

Inbetriebnahme der Kamera

Ansteuerung mit CamLab am Fahrzeug

Bereich zum Download der Software

Um einen ersten Funktionstest der Kamera durchzuführen, wurde die Kamera über einen Ethernetkabel mit dem Laborrechner verbunden und das zugehörige Netzteil für die Stromversorgung angeschlossen. Das VRmagic Programm zum ausgeben des Kamerabildes "CamLab" ist auf allen Laborrechnern bereits installiert.
Falls es nicht installiert sein sollte, kann das Programm von der VRmagic Homepage heruntergeladen werden:
https://www.vrmagic.com/de/vrmagic-imaging/service-support/
Der richtige Typ der Software, für den entspechenden Rechner kann unter dem Punkt "USBPlattform/Software" ausgewählt und heruntergeladen werden, siehe Bild.
Nachdem das Programm heruntergeladen wurde, muss die ZIP-Datei entpackt werden und die "Setup"-Datei ausgeführt werden. Für nähere Informationen zur Installation, ist in der ZIP-Datei eine README-Dokument enthalten.
"WICHTIG: Admin-Rechte von Nöten!!!"
Nachdem die Installation erfolgreich abgeschlossen wurde, kann das Programm "CamLab" ausgeführt werden.
Oberfläche des CamLab Programms
Nachdem das Programm geöffnet wurde kann die VRmagic Kamera mit dem CamLab kommunizieren. Die angeschlossene Kamera kann in dem Dropdown-Menü ausgewählt werden. Dies kann nach dem ersten mal anschließen etwas dauern, bis das Programm die Ethernetverbindung zur Kamera findet. Im Anschluss daran kann die Bildausgabe gestartet werden.

Wenn die Kamera ausgewählt wurde, öffnet sich ein erweiteretes Menü. In diesem Menü können alle möglichen Konfigurationen vorgenommen werden, die die VRmagic Kamera anbietet (Format, Timing, Sensor, Filter etc.). Mit einem Klick auf den Button "Grab" kann die Bildwiedergabe gestartet werden. Es können auch Snapshots erstellt werden, die auf dem Rechner gespeichert werden können.
Mit diesem Programm wurde ein erster Funktionstest der Kamera durchgeführt, welcher Grundlage für weitere Ansterungskonzepte mit Visual Studio ist.

Implementierung der Kamera in Visual Studio

Die Kamera stellt Librarys für die Programmierung in C/C++ bereit, diese sind im SVN Ordner hinterlegt und müssen in die aktuelle Projektmappe im Explorer hinzugefügt werden.
In Visual Studio wählt man in dem Dropdown Menü in der oberen Leiste neben Debug x86 aus (siehe Abbildung Visual Studio auf x86 einstellen rotes Rechteck), ohne diese Einstellung lässt sich das Programm nicht kompilieren. Im nächsten Schritt wählt man in dem Fenster Projektmappen-Explorer mit einem Rechtsklick die Projektmappe aus und öffnet Eigenschaften. Die Konfiguration des Eigenschaftsfensters muss auf Debug eingestellt sein und die Plattform auf Aktiv(Win32) (siehe Abbildung Zusätzliche Includeverzeichnisse rote Rechtecke). In diesem Fenster wählt man als erstes die Registerkarte C/C++ aus (blaues Rechteck), dort fügt man jetzt unter dem Punkt Zusätzliche Includeverzeichnisse (grünes Rechteck), den Dateipfad C:\[Dateipfad auf eigenem Rechner]\VRMagic\include hinzu. Im nächsten Schritt muss man die Library Dateien mit dem Linker verlinken, dazu bleibt man in dem Eigenschaftsfenster und wählt die Registerkarte Linker aus und öffnet dort Allgemein (siehe Abbildung Zusätzliche Bibliotheksverzeichnisse rotes Rechteck). Dort wählt man jetzt den Punkt Zusätzliche Bibliotheksverzeichnisse (siehe grünes Rechteck) und fügt den Dateipfad C:\[Dateipfad auf eigenem Rechner]\VRMagic\lib hinzu. Nun öffnet man auch unter der Registerkarte Linker den Punkt Eingabe (siehe Abbildung Zusätzliche Abhängigkeiten rotes Rechteck), dort fügt man unter dem Punkt Zusätzliche Abhängigkeiten (siehe grünes Rechteck) folgendes hinzu:

  • vrmusbcam2.lib

Bildverarbeitung

Installation von OpenCV

Um das Kamerabild der VRMagic Kamera zu sehen und zu verabeiten wurde OpenCV verwendet. OpenCV bietet zahlreiche Möglichkeiten Bilder zu erkennen und zu verarbeiten.
Für dieses Projekt wurde OpenCV 3.0.0 (Downloadlink zu OpenCV 3.0.0) verwendet, da diese eine x86 (32-Bit) Version enthält, die nötig ist, um OpenCV mit der VRMagic in Visual Studio lauffähig zu machen. Denn die Kamera ist nur mit x86 kompatibel.

Umgebungsvariablen

Nach abgeschlossenem Download, wird die OpenCV.exe gestartet und in einem gewünschten Verzeichnis installiert. Um OpenCV richtig zu implementieren, sucht man im Windows Suchmenü nach Systemsteuerung und dort wählt man die Einstellung System aus. Unter System wählt man nun als Administrator in der oberen linken Ecke Erweiterte Systemeinstellungen aus. Jetzt öffnet sich ein Fenster namens Systemeinstellungen, dort wählt man den Button Umgebungsvariablen aus und sucht dort in Systemvariablen, die Variable Path (siehe Abbildung Umgebungsvariablen) und wählt den Button Bearbeiten aus. Jetzt Öffnet sich das Fenster Umgebungsvariable bearbeiten (siehe Abbildung Umgebungsvariablen bearbeiten), dort betätigt man den Button Neu. Jetzt fügt man den Dateipfad zu den OpenCV bin Dateien hinzu C:\[Dateipfad auf eigenem Rechner]\openCV 3.0.0\opencv\build\x86\vc12\bin, dabei ist darauf zu achten, dass man x86 und vc12 auswählt, andere Konfigurationen sind mit der Kamera nicht lauffähig. Achtung bei einigen Windows Versionen sieht das Fenster Umgebungsvariablen bearbeiten anders aus, dort befindet sich lediglich eine Textbox mit verschiedenen Dateipfaden, sollte dies der Fall sein, trennt man den letzten Pfad mit einem Semikolon und fügt den Pfad zu OpenCV hinten an.
Nach diesen Einstellungen wird ein Projekt (Konsolenanwendung in C++) in Visual Studio geöffnet oder erstellt. In Visual Studio wählt man in dem Dropdown Menü in der oberen Leiste neben Debug x86 aus (siehe Abbildung Visual Studio auf x86 einstellen rotes Rechteck), ohne diese Einstellung lässt sich das Programm nicht kompilieren. Im nächsten Schritt wählt man in dem Fenster Projektmappen-Explorer mit einem Rechtsklick die Projektmappe aus und öffnet Eigenschaften. Die Konfiguration des Eigenschaftsfensters muss auf Debug eingestellt sein und die Plattform auf Aktiv(Win32) (siehe Abbildung Zusätzliche Includeverzeichnisse rote Rechtecke). In diesem Fenster wählt man als erstes die Registerkarte C/C++ aus (blaues Rechteck), dort fügt man jetzt unter dem Punkt Zusätzliche Includeverzeichnisse (grünes Rechteck), den Dateipfad C:\[Dateipfad auf eigenem Rechner]\openCV 3.0.0\opencv\build\include hinzu. Im nächsten Schritt muss man die Library Dateien mit dem Linker verlinken, dazu bleibt man in dem Eigenschaftsfenster und wählt die Registerkarte Linker aus und öffnet dort Allgemein (siehe Abbildung Zusätzliche Bibliotheksverzeichnisse rotes Rechteck). Dort wählt man jetzt den Punkt Zusätzliche Bibliotheksverzeichnisse (siehe grünes Rechteck) und fügt den Dateipfad C:\[Dateipfad auf eigenem Rechner]\openCV 3.0.0\opencv\build\x86\vc12\lib hinzu. Nun öffnet man auch unter der Registerkarte Linker den Punkt Eingabe (siehe Abbildung Zusätzliche Abhängigkeiten rotes Rechteck), dort fügt man unter dem Punkt Zusätzliche Abhängigkeiten (siehe grünes Rechteck) folgendes hinzu:

  • opencv_ts300d.lib
  • opencv_world300d.lib
Umgebungsvariablen hinzufügen
Visual Studio auf x86 einstellen
Zusätzliche Includeverzeichnisse
Zusätzliche Bibliotheksverzeichnisse
Zusätzliche Abhängigkeiten




































Darstellung des Kamerabildes mit OpenCV

Damit das Live Bild der Kamera mit OpenCV ausgegeben und verarbeitet werden kann muss dieses zuerst in den OpenCV Typ Mat gewandelt werden. Dazu benötigt man eine Hilfsfunktion, die das Farbformat von VRMagic in das Farbformat von OpenCV wandelt, die Funktion ist im folgenden dargestellt.

/***************************
*Quelle: VRmagic Holding AG*
****************************/
int toCvType(VRmColorFormat f_color_format)
{
	int cv_type(-1);
	switch (f_color_format)
	{
	case VRM_ARGB_4X8:
		cv_type = CV_8UC4;
		break;
	case VRM_BGR_3X8:
		cv_type = CV_8UC3;
		break;
	case VRM_BAYER_BGGR_8:
	case VRM_BAYER_GBRG_8:
	case VRM_BAYER_GRBG_8:
	case VRM_BAYER_RGGB_8:
	case VRM_GRAY_8:
		cv_type = CV_8UC1;
		break;
	case VRM_BAYER_BGGR_16:
	case VRM_BAYER_GBRG_16:
	case VRM_BAYER_GRBG_16:
	case VRM_BAYER_RGGB_16:
	case VRM_GRAY_16:
		cv_type = CV_16UC1;
		break;
	default:
		break;
	}
	return cv_type;
}

Mit Hilfe der Funktion kann das Kamerabild jetzt in ein Mat gewandelt werden, dazu werden die Parameter des VRMagic Bildes an das Mat Bild übergeben. Danach wird der Mat Datentyp in ein UMat gewandelt, um die Auslastung der CPU zu verringern, mit Hilfe von imshow() wird das Bild dann in einem Fenster angezeigt.

 
VRmColorFormat color_format_src = p_gray_src_img->m_image_format.m_color_format;

/*Wandlung des Kamerabilds in ein Mat, um das Bild mit OpenCV zu verarbeiten*/
Mat src_image(cvSize(p_gray_src_img->m_image_format.m_width, p_gray_src_img->m_image_format.m_height), toCvType(color_format_src),(void*)p_gray_src_img->mp_buffer, p_gray_src_img->m_pitch);
		
src_image.copyTo(src_UMat_image); //Kopiert die Mat in eine UMat, um die Auslastung der CPU zu verringern
imshow("Live Bild", src_UMat_image); //Zeigt das Bild an

Kantendetektion in OpenCV mit Canny Edge

Orginalbild der Strecke in Graustufen
Binärbild der Strecke nach Kantendetektion

Nachdem das Kamerabild der VRmagic Kamera und in eine OpenCV-Matrix (UMat) umgewandelt wurde, kann eine Kantendetektion durchgeführt werden. OpenCV bietet verschiedene Algorithmen zur detektion von Kanten in einem Kamerabild an.
Für die Kantendetektion wurde der weit verbreitete Algorithmus Canny Edge verwendet. OpenCV bietet für diesen Anwendungsfall bereits eine vorgefertigte Funktion an.

void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false )

  • InputArray: Kamerabild in Graustufen (Datentyp: UMat, Mat)
  • OutputArray: Binärbild mit Kanten (Datentyp: UMat, Mat)
  • threshold1: Parameter 1 für Hysterese
  • threshold2: Parameter 2 für Hysterese
  • apertureSize: Einstellung des Sobel-Operators = 3
  • L2gradient: Flag zur Angabe ob anderer Gradient berechnet werden soll (Vorgabe "false")


Die Funktion wird durch ihren Namen "Canny()" aufgerufen. Sie besitzt keinen Rückgabewert. Die Canny-Funktion besitzt zwei Hauptparameter. Als ersten Parameter benötigt die Funktion ein Graustufenbild indem die Kanten detektiert werden sollen, siehe Bild "Orginalbild der Strecke in Graustufen". Dies muss als eine Matrix übergeben werden. Der zweite Hauptparameter ist das Rückgabebild der Canny-Funktion, welches eine Matrix der selben Größe des Originalbildes ist und die detektierten Kanten in einem Binärbild enthält, siehe Bild "Binärbild der Strecke nach Kantendetektion".
Die nächsten zwei Parameter, threshold1 und threshold2 sind Schwellwerte für die Kantenerkennung. Diese double-Werte können für den jeweiligen Verwendungsfall angepasst werden. Sie sind Verantwortlich für das Edge linking der Canny-Funktion.
Die apertureSize stellt den Sobel-Operator ein, welchen die Canny-Funktion als Unterfunktion aufruft. Von der OpenCV Homepage wird empfolen diesen Interger-Wert auf "3" einzustellen.
Das letzte Argument L2gradient ist eine Flagge um der Funktion mitzuteilen, ob der Gradient des Bildes auf eine andere (genauere) Weise berechnet werden soll, siehe https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html?highlight=canny#canny86. Diese Bool-Variable wird standardmäßig auf "false" gesetzt.

Entzerrung des Kamerabildes

Wie in den vorhergegangenen Bildern zu sehen ist, weist das Kamerabild noch eine gewisse Verzerrung auf. Diese Verzerrungen entstehen durch die optischen Eigenschaften der Linse und dem internen Aufbau der Kamera. Diese Eigenschaften sind spezifisch für jedes Kamerasystem und sind somit unabhängig von der äußeren Bewegung und Position der Kamera. Diese Eigenschaften sind durch die optischen Komponenten, die fest in der Kamera verbaut sind bestimmt und somit bleiben sie beim Betrieb der Kamera immer konstant. Diese intrinsischen Kameraparameter werden benötigt, um den Zusammenhang zwischen den Punkten die auf den Pixeln des Kamerasensors abgebildet sind zu den echten Punkten in der Welt (Teststrecke) herzustellen.

Um die Abbildung der Bildpunkte die durch die Linse auf den Kamerasensor fallen darzustellen, muss eine Kalibrierungsmatrix K aufgestellt werden.



Diese Kalibrierungsmatrix beinhaltet die bauteilspezifischen Parameter die die Kamera beschreiben. Die Komponenten cx,cy geben die Verschiebung des Koordinatenursprungs der Pixelkoordinaten an. Der Nullpunkt der Kamerakoordinaten, welcher in er mitte der Linse liegt wird nicht auf den Nullpunkt der Pixelkoordinaten abgebildet, da das Pixelkoordinatensystem in den meisten Fällen unten links oder oben links seinen Ursprung hat. Somit muss eine Verschiebung berücksichtigt werden.
Des Weiteren müssen die Faktoren fx und fy brücksichtigt werden, die die Brennweite der Kamera beinhalten. Die Brennweite der Kamera gibt den Abstand der Linse zum Kamerasensor an.
Die letzte Variable, die in der Kameramatrix vorkommt, ist die Scherung der Pixel s. Die Scherung gibt an, in welchem Winkel der Kamerasensor zur Linse steht. Für die verbaute VRmagic Kamera ist der Kamerasensor paralell zur Linse verbaut, somit muss keine Scherung berücksichtigt werden und s = 0.

Für eine gelungene Kalibrierung muss auch die radiale Verzerrung der verbauten Linse der VRmagic Kamera bestimmt werden. Verzerrung bei Linsen tritt auf, wenn Licht an den Rändern einer Linse stärker gebrochen wird als im Linsenzentrum. Bei der radialen Verzerrung wird zwischen der Kissenförmigen- und Tonnenförmigen-Verzerrung unterschieden. Die VRmagic Kamera weist durch ihre Linse eine kissenförmige Verzerrung auf. Die stärke der Verzerrung eines Bildpunktes, ist Abhängig von dessen Abstand zum Bildmittelpunkt. Dieses Verhältnis lässt sich durch folgende Gleichungen ausdrücken:

MATLAB Camera Calibrator Toolbox





Um diese Parameter zu bestimmen, müssen Bilder mit der VRmagic Kamera aufgenommen werden, bei denen ein Kalibrierungsobjekt mit bekannten Abmessungen aufgenommen wird. Für diese Aufgabe wird die Camera Calibrator Toolbox genutzt um die Parameter des verbauten Kamerasystems automatisiert zu bestimmen. Die Toolbox befindet sich in MATLAB unter dem Reiter Apps / Image Processing and Computer Vision. Die Toolbox benötigt Kalibrierungsbilder von einem Schachbrettmuster mit bekannten Kantenlängen, wie in der Abbildung recchts zu sehen. Ein Schachbrettmuster wird verwendet, da das regelmäßige Muster des Schachbrettes einfach zu detektieren ist. Die Größe der einzelnen Kacheln auf dem Schachbrett muss zunächst vom Benutzer eingegeben werden.
Wenn die Kalibrierungsbilder in die Toolbox geladen wurden, kann man unter dem Reiter Options die radialen und tangentialen Verzerrungsparameter berechnen lassen. Durch einen Klick auf den Button Calibrate berechnet die Toolbox alle nötigen Verzerrungsparameter und die Kameramatrix. Im Anschluss daran, projiziert die Toolbox neue Schachbretteckpunkte als rote Kreuze zu sehen, zurück auf das Bild. Des Weiteren wird die Abweichung der Projektion zu erkannten Eckpunkten in Pixeln angegeben (siehe Abbildung oben rechts). Diese errechneten Parameter können an den MATLAB Workspace exportieren oder sie als Script speichern.

Um die VRmagic Kamera mit OpenCV zu kalibrieren müssen die ermittelten Werte in das C++ Programm übernommen werden. Danach muss das Kamerabild mit Hilfe der undistort-Funktion verändert werden. Die Funktion benötigt folgende Parameter:

void undistort (InputArray Source, OutputArray Image, InputArray cameraMatrix, InputArray distCoeffs, InputArray newCameraMatrix=noArray() )

Transformation in Vogelperspektive