DSB18: Inverse Perspektiventransformation
Autor: Michael Menke
Betreuer: Prof. Schneider
Motivation
Autonome Fahrzeuge benötigen eine virtuelle Rundumsicht.
Ziel
Die perspektivischen Daten einer Kamera sollen anhand intrinsischer und extrinsischer Parameter in eine Rundumsicht
Anforderungen
- Kalibrieren Sie die verwendete Kamera.
- Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
- Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
- Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
- Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
- Softwareentwicklung nach SDE Standard in SVN
- Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)
Lösungen
1. Kalibrieren Sie die verwendete Kamera.
Es wurde die Matlab App "Camera Calibration" verwendet. Diese App ließt Bilder ein und überprüft ob diese ein Schachbrett Muster enthalten. Für eine gute Kalibrierung werden 20 bis 30 Bilder von Mathworks empfholen. Die Kalibrierungs Daten können dann in der App als Script gespeichert werden oder als Parameter, welcher Matlab dann einlesen kann.
Die Bilder für die Kalibrierung sind unter "https://svn.hshl.de/svn/DSB/trunk/User/SoSe2018/Michael Menke/Kalibrierung" gespeichert.
Die Parameter sind unter "https://svn.hshl.de/svn/DSB/trunk/User/SoSe2018/Michael Menke/cameraParams.mat" gespeichert.
Des Weiteren befindet sich in dem Hauptprogramm folgenden Code, welcher eine Kalibrierung durchführt, wenn keine "cameraParams.mat" vorliegt. Der Anfänglich von Matlab erzeugte Code enthielt keine Überprüfung ob die Parameter schon vorhanden ist und hatte eine feste Liste von Bild Dateien. Die Angepasste Version überprüft ob die Parameter schon vorhanden sind und ließt alle Bilder aus einem Ordner ein.
%% Kamera Calibrierung - Von Matlab Autogeneriert und angepasst.
if exist(Paras,'file') % Checkt Camera Parameter als Datei vorliegen
load(Paras) % Lädt Camera Parameter
else
cd(Folder) % Ordner Öffnen
FileNames = dir('*.JPG'); % Ordner nach Bilder durchsuchen
% Define images to process
imageFileNames = {FileNames.name};
% Detect checkerboards in images
[imagePoints, boardSize, imagesUsed] = detectCheckerboardPoints(imageFileNames);
imageFileNames = imageFileNames(imagesUsed);
% Read the first image to obtain image size
originalImage = imread(imageFileNames{1});
[mrows, ncols, ~] = size(originalImage); %Farbtiefe wird nicht benötigt
worldPoints = generateCheckerboardPoints(boardSize, squareSize); % Generate world coordinates of the corners of the squares
% Calibrate the camera
[cameraParams, imagesUsed, estimationErrors] = estimateCameraParameters(...
imagePoints, worldPoints, ...
'EstimateSkew', false, ...
'EstimateTangentialDistortion', false, ...
'NumRadialDistortionCoefficients', 2, ...
'WorldUnits', 'millimeters', ...
'InitialIntrinsicMatrix', [], ...
'InitialRadialDistortion', [], ...
'ImageSize', [mrows, ncols]);
cd('..') % Zurück in den Hauptordner
end
2. Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
Für diese Umsetzung wurde eine Toolbox von Matlab verwendet. Diese übernimmt die Transformation.
outputImage = transformImage(birdsEyeConfig, inputImage);
Für eine Erfoglreiche Transformation muss das "birdsEyeConfig" mit Informationen gefüllt werden.
Dafür wird die Ausrichtung und die Kamera Parameter benötigt. Dabei ist zu beachten das die Genauigkeit der Aufnahme stark von der Genauigkeit der Angaben richtet. Diese Parameter wurden mit den Sensoren eines Smartphones erfasst.
camHeight = 700; % Höhe der Kamera vom Boden aus in mm
% Drehung der Kamera in Grad
CamDegX = 70; % Pitch
CamDegY = 3; % Roll
CamDegZ = 0; % Yaw
camIntrinsics = cameraIntrinsics( ...
cameraParams.FocalLength, ...
cameraParams.PrincipalPoint, ...
cameraParams.ImageSize);
sensor = monoCamera( ...
camIntrinsics, ...
camHeight, ...
'Pitch', CamDegX, ...
'Yaw', CamDegZ, ...
'Roll', CamDegY);
Es wurden auch Parameter für das Auszugebene Bild festgelegt.
% Welt Parameter
xmin = 0; % Offset Hinten
xmax = 2500; % Abstand Vorne
ymin = -1500; % Linke Seite
ymax = 1500; % Rechte Seite
outView = [xmin, xmax, ymin, ymax]; %Äußere Parameter
imageSize = [NaN, cameraParams.ImageSize(2)]; %Höhe nicht angegben damit die Bildverhältnisse Stimmen
Abschließend wurden die Daten in das birdsEyeView Format gebracht.
birdsEyeConfig = birdsEyeView(sensor, outView, imageSize);
3. Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
Input Bild
Output Bild
4. Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
Dafür wurde eine Fliese auf dem Bild ausgemessen, diese ist genau 31 cm lang. Dazu wurde im Folgeden Bild ein Strich gezeichnet, welche die Kannten zeigt, welche zur Bestimmung verwendet wurden.
X-Achse
Die Eckpunkte der unteren roten Kante sind (1906 3182) und (2544 3173). Dann entsprechen 31 cm 638,063 Pixel.
Die Eckpunkte der oberen roten Kante sind (1904 186) und (2479 199). Dann entsprechen 31 cm 575,147 Pixel.
Die obere rote Kante ist dann 9,86% kürzer in dem Bild. In Realität sind beide Kanten 31 cm lang. Die abbnahme um 9,86% fand auf einer Entfernung von 191,5 cm statt.
Y-Achse
Die Eckpunkte der unteren grüne Kante sind (2532 2542) und (2544 3173). Dann entsprechen 31 cm 631,114 Pixel.
Die Eckpunkte der oberen grüne Kante sind (2493 720) und (2479 199). Dann entsprechen 31 cm 521,188 Pixel.
Die obere grüne Kante ist dann 17,42% kürzer in dem Bild. In Realität sind beide Kanten 31 cm lang. Die abbnahme um 17,42% fand auf einer Entfernung von 191,5 cm statt.
5. Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
http://193.175.248.52/wiki/index.php?title=DSB18:_Inverse_Perspektiventransformation
6. Softwareentwicklung nach SDE Standard in SVN
https://svn.hshl.de/svn/DSB/trunk/User/SoSe2018/Michael Menke/
7. Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)
Sonstige Tätigkeiten
Versucht die alten Anforderungen umzusetzen.
Die alten Anforderungen Lauteten:
- Recherchieren Sie was ArUco Marker sind und wie sich diese in Position und Lage detektieren lassen.
- Erstellen Sie ArUko Marken mittels Matlab.
- Nutzen Sie eine Webcam für die Detektion der Marker.
- Kalibrieren Sie diese Kameras.
- Setzen Sie ein Verfahren zur Bestimmung der Pose eines ArUko Markers mit Matlab um.
- Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
- Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
- Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
- Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
- Softwareentwicklung nach SDE Standard in SVN
- Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)
Diese wurden nach Rücksprace mit Prof. Dr.-Ing. Schneider dann verändert, nachdem Probleme aufgetreten sind bei der implementierung der ArUco Marker. Dabei wurden für Schritte 1. bis 3. schon Zeit investiert.
Weblinks
- A Vision Based Top-View Transformation Model for a Vehicle Parking Assistant
- Camera Calibration and Inverse Perspective
- BirdEye - an Automatic Method for Inverse Perspective Transformation of Road Image without Calibration
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