DSB18: Inverse Perspektiventransformation

Aus HSHL Mechatronik
Version vom 5. September 2018, 12:59 Uhr von Ulrich Schneider (Diskussion | Beiträge) (→‎Weblinks)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

Autor: Michael Menke
Betreuer: Prof. Schneider

IPM-Algorithmus

Motivation

Autonome Fahrzeuge benötigen eine virtuelle Rundumsicht.

Ziel

Die perspektivischen Daten einer Kamera sollen anhand intrinsischer und extrinsischer Parameter in eine Rundumsicht

Anforderungen

  1. Kalibrieren Sie die verwendete Kamera.
  2. Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
  3. Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
  4. Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
  5. Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
  6. Softwareentwicklung nach SDE Standard in SVN
  7. 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

Input Bild

Output 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.

Input Bild

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)

https://youtu.be/HIqDe0-xZkI

Sonstige Tätigkeiten

Versucht die alten Anforderungen umzusetzen.

Die alten Anforderungen Lauteten:

  1. Recherchieren Sie was ArUco Marker sind und wie sich diese in Position und Lage detektieren lassen.
  2. Erstellen Sie ArUko Marken mittels Matlab.
  3. Nutzen Sie eine Webcam für die Detektion der Marker.
  4. Kalibrieren Sie diese Kameras.
  5. Setzen Sie ein Verfahren zur Bestimmung der Pose eines ArUko Markers mit Matlab um.
  6. Transformieren Sie ein Objekt aus der Kameraperspektive in Weltkoordinaten.
  7. Stellen Sie die Objekte im Sichtfeld in der Draufsich metrisch dar.
  8. Schätzen Sie die Genauigkeit Ihres 3D-Sensors ab.
  9. Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
  10. Softwareentwicklung nach SDE Standard in SVN
  11. 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

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