DSB18: Inverse Perspektiventransformation

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor:
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

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)

Folgt.

Sonstige Tätigkeiten

Versucht die alten Anforderungen umzusetzen. Diese Forderten eine Kamera Kalibrierung über ArucoMaker.

Weblinks

Parking Assistant]


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