Camera Calibration Toolbox: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
(Korrektur von Rechtschreibfehlern)
 
(31 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 1: Zeile 1:
'''Autor:'''  
'''Autor:''' [[Benutzer:Ulrich_Schneider| Prof. Schneider]]


Dieser Artikel beschreibt die Arbeit mit der [http://www.vision.caltech.edu/bouguetj/calib_doc/index.html| Camera Calibration Toolbox for Matlab] von Jean-Yves Bouguet.
Dieser Artikel beschreibt die Arbeit mit der [http://www.vision.caltech.edu/bouguetj/calib_doc/index.html Camera Calibration Toolbox for Matlab] von Jean-Yves Bouguet.


Matlab 2014a beinhaltet eine ähnliche Toolbox, aber bei diese Variante hat man die Möglichkeit den Quelltext nachzuvollziehen.
Matlab 2014a beinhaltet eine ähnliche Toolbox, aber bei diese Variante hat man die Möglichkeit den Quelltext nachzuvollziehen.
Zeile 9: Zeile 9:
# Einbindung der Toolbox mit <code lang="matlab">Set Path</code>.
# Einbindung der Toolbox mit <code lang="matlab">Set Path</code>.
# Start der Toolbox mit <code lang="matlab">calib_gui</code>.
# Start der Toolbox mit <code lang="matlab">calib_gui</code>.
== Kalibrierung der Kamera ==
Kamera: VR Magic VRmDC
Kamerahöhe: 0,27 m
Nickwinkel: 11°
montiert auf den AMR2013 (dSpace)
# Bild laden laden mit <code lang="matlab">Read images</code>
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">
Basename camera calibration images (without number nor suffix): VRmDC_Boden
Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'p'='pgm', 'j'='jpg', 'm'='ppm') t
Loading image 1...
done
</syntaxhighlight>
# Ecken extrahieren mit  <code lang="matlab">Extract grid corners</code>
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">
Extraction of the grid corners on the images
Number(s) of image(s) to process ([] = all images) =
Do you want to use the automatic square counting mechanism (0=[]=default)
  or do you always want to enter the number of squares manually (1,other)? 1
Processing image 1...
Using (wintx,winty)=(5,5) - Window size = 11x11      (Note: To reset the window size, run script clearwin)
Click on the four extreme corners of the rectangular complete pattern (the first clicked corner is the origin)...
Number of squares along the X direction ([]=5) =
Number of squares along the Y direction ([]=5) =
Size of each square along the X direction: dX=16.6mm
Size of each square along the Y direction: dY=16.6mm  (Note: To reset the size of the squares, clear the variables dX and dY)
If the guessed grid corners (red crosses on the image) are not close to the actual corners,
it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)
Need of an initial guess for distortion? ([]=no, other=yes) y
Use number of iterations provided
Use focal provided
Estimated focal: 298.0959 pixels
Guess for distortion factor kc ([]=0): -0.1
Satisfied with distortion? ([]=no, other=yes) y
Corner extraction...
done
</syntaxhighlight>
'''Hinweis:''' der Entstörungsfaktor kc liegt zwischen -1 .. 1.
[[Datei:CornerExtraction.png|600px|Ergebnis der Eckenextraktion]]
# Führen Sie die kalibrierung mir <code lang="matlab">Calibration</code> durch.
dies ergibt
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">
Calibration results after optimization (with uncertainties):
Focal Length:          fc = [ 489.30363  512.03902 ] ± [ 18.88215  322.24042 ]
Principal point:      cc = [ 383.21579  233.25041 ] ± [ 0.00000  0.00000 ]
Skew:            alpha_c = [ 0.00000 ] ± [ 0.00000  ]  => angle of pixel axes = 90.00000 ± 0.00000 degrees
Distortion:            kc = [ -0.32665  0.10459  -0.00651  0.00219  0.00000 ] ± [ 0.04614  0.08993  0.00607  0.00190  0.00000 ]
Pixel error:          err = [ 0.32952  0.43539 ]
Note: The numerical errors are approximately three times the standard deviations (for reference).
</syntaxhighlight>
Das Ergebnis basierend auf diesem einen Bild ergab intrinsische Kameramatrix ''K'':
<math>\mathbf{K}=\begin{pmatrix}
f_{x} & 0 & c_{x} \\
0 & f_{y} & c_{y}\\
0 & 0 & 1\\
\end{pmatrix}=\begin{pmatrix}
489.30363 & 0 & 383.21579 \\
0 & 512.03902  & 233.25041\\
0 & 0 & 1\\
\end{pmatrix}</math>
Anschließend wurde eine Kalibrierung mit einer Vielzahl von Kalibrierbildern durchgeführt diese ergab die nachfolgende Matrix.
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
== Anzeige der Kameralage und Ausrichtung ==
<code lang="matlab">Show Extrinsic</code> ermöglicht die Anzeige der extrinsischen Parameter.
Wichtig ist, dass das Koordinaten des Weltkoordinatensystems nicht dem üblichen Fahrzeugkoordinatensystem entspricht.
[[Datei:Extrinsic1.png|800px|Fahrzeug XZ-Ebene (hier YZ)]]
[[Datei:Extrinsic2.png|800px|Fahrzeug XY-Ebene (hier YZ)]]
[[Datei:Extrinsic3.png|800px|3D Ansicht]]
[[Datei:Extrinsic4.png|800px|Kamerazentrierte Ansicht]]
[[Datei:Extrinsic5.png|800px|Position der Kamera in Weltkoordinaten]]
Die Position der Kamera im dargestellten Weltkoordinatensystem beträgt
<math>
\vec{T}=\begin{pmatrix}
x_W \\
y_W\\
z_W\\
\end{pmatrix}=\begin{pmatrix}
47,36\\
-67,75\\
25,96
\end{pmatrix} cm
</math>
Betrachten wir eine Szene im körperfesten Fahrzeugkoordinatensystem ist dieses am Mittelpunkt der Stoßstange definiert.
[[Datei:Trafo.png|800px|Körperfesten Fahrzeugkoordinatensystem ]]
Der Verschiebungsvektor zwischen Kamerakoordinatensystem und Ort des Weltkoordinatensystems beträgt somit:
<math>
\vec{T}=\begin{pmatrix}
x \\
y\\
z\\
\end{pmatrix}=\begin{pmatrix}
-67,75\\
-47,36\\
25,96
\end{pmatrix} cm
</math>
Verschiebt man das Weltkoordinatensystem mit dem <math> \vec{T}</math> in die Kamera, sind diese gegeneinander verdreht.
<math>
\vec{R}=\begin{pmatrix}
\Phi\\
\Theta\\
\Psi\\
\end{pmatrix}=\begin{pmatrix}
-90 - 11\\
-0,5\\
-90 + 1,4
\end{pmatrix} deg
</math>
mit
<math> \Phi</math>: Drehung um die x_W-Achse, Rollwinkel
<math> \Theta</math>:  Drehung um die y_W-Achse, Nickwinkel
<math> \Psi</math>:  Drehung um die z_W-Achse, Gierwinkel


== Berechnung extrinsischer Parameter ==
== Berechnung extrinsischer Parameter ==
Zeile 32: Zeile 194:
Corner extraction...
Corner extraction...
</syntaxhighlight>
</syntaxhighlight>
[[Datei:Comp_Extrinsic.png|600px|Ergebnis der Parameterberechnung]]
Das errechnete Ergebnis lautet
<syntaxhighlight lang="matlab" style="background-color: #EFF1C1; font-size:larger">
Extrinsic parameters:
Translation vector: Tc_ext = [ -46.048515 13.733091 72.490486 ]
Rotation vector:  omc_ext = [ 1.753991 0.023825 -0.007702 ]
Rotation matrix:    Rc_ext = [ 0.999759 0.020374 0.008164
                              0.011740 -0.182129 -0.983205
                              -0.018545 0.983063 -0.182325 ]
Pixel error:          err = [ 0.42985 0.54546 ]
</syntaxhighlight>
Der Rotationsvektor <math>\vec{R}</math> in deg beträgt
<math>\vec{R}=\begin{pmatrix}
\Theta\\
\Phi\\
\Psi\\
\end{pmatrix}=\begin{pmatrix}
100,5\\
1,4\\
-0,5\\
\end{pmatrix}deg</math>
Der Translationsvektor <math>\vec{T}</math>
<math>T=\begin{pmatrix}
t_{x}\\
t_{y}\\
t_{z}\\
\end{pmatrix}=\begin{pmatrix}
-452.4129\\
129.9002\\
726.9537\\
\end{pmatrix}</math>

Aktuelle Version vom 28. Juli 2016, 15:14 Uhr

Autor: Prof. Schneider

Dieser Artikel beschreibt die Arbeit mit der Camera Calibration Toolbox for Matlab von Jean-Yves Bouguet.

Matlab 2014a beinhaltet eine ähnliche Toolbox, aber bei diese Variante hat man die Möglichkeit den Quelltext nachzuvollziehen.

Installation

  1. Download der Toolbox
  2. Einbindung der Toolbox mit Set Path.
  3. Start der Toolbox mit calib_gui.

Kalibrierung der Kamera

Kamera: VR Magic VRmDC

Kamerahöhe: 0,27 m

Nickwinkel: 11°

montiert auf den AMR2013 (dSpace)

  1. Bild laden laden mit Read images
Basename camera calibration images (without number nor suffix): VRmDC_Boden
Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'p'='pgm', 'j'='jpg', 'm'='ppm') t
Loading image 1...
done
  1. Ecken extrahieren mit Extract grid corners
Extraction of the grid corners on the images
Number(s) of image(s) to process ([] = all images) = 
Do you want to use the automatic square counting mechanism (0=[]=default)
  or do you always want to enter the number of squares manually (1,other)? 1

Processing image 1...
Using (wintx,winty)=(5,5) - Window size = 11x11      (Note: To reset the window size, run script clearwin)
Click on the four extreme corners of the rectangular complete pattern (the first clicked corner is the origin)...
Number of squares along the X direction ([]=5) = 
Number of squares along the Y direction ([]=5) = 
Size of each square along the X direction: dX=16.6mm
Size of each square along the Y direction: dY=16.6mm   (Note: To reset the size of the squares, clear the variables dX and dY)
If the guessed grid corners (red crosses on the image) are not close to the actual corners,
it is necessary to enter an initial guess for the radial distortion factor kc (useful for subpixel detection)
Need of an initial guess for distortion? ([]=no, other=yes) y
Use number of iterations provided
Use focal provided
Estimated focal: 298.0959 pixels
Guess for distortion factor kc ([]=0): -0.1
Satisfied with distortion? ([]=no, other=yes) y
Corner extraction...
done

Hinweis: der Entstörungsfaktor kc liegt zwischen -1 .. 1.

Ergebnis der Eckenextraktion

  1. Führen Sie die kalibrierung mir Calibration durch.

dies ergibt

Calibration results after optimization (with uncertainties):

Focal Length:          fc = [ 489.30363   512.03902 ] ± [ 18.88215   322.24042 ]
Principal point:       cc = [ 383.21579   233.25041 ] ± [ 0.00000   0.00000 ]
Skew:             alpha_c = [ 0.00000 ] ± [ 0.00000  ]   => angle of pixel axes = 90.00000 ± 0.00000 degrees
Distortion:            kc = [ -0.32665   0.10459   -0.00651   0.00219  0.00000 ] ± [ 0.04614   0.08993   0.00607   0.00190  0.00000 ]
Pixel error:          err = [ 0.32952   0.43539 ]

Note: The numerical errors are approximately three times the standard deviations (for reference).

Das Ergebnis basierend auf diesem einen Bild ergab intrinsische Kameramatrix K:


Anschließend wurde eine Kalibrierung mit einer Vielzahl von Kalibrierbildern durchgeführt diese ergab die nachfolgende Matrix. 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

Anzeige der Kameralage und Ausrichtung

Show Extrinsic ermöglicht die Anzeige der extrinsischen Parameter.

Wichtig ist, dass das Koordinaten des Weltkoordinatensystems nicht dem üblichen Fahrzeugkoordinatensystem entspricht.

Fahrzeug XZ-Ebene (hier YZ)

Fahrzeug XY-Ebene (hier YZ)

3D Ansicht

Kamerazentrierte Ansicht

Position der Kamera in Weltkoordinaten

Die Position der Kamera im dargestellten Weltkoordinatensystem beträgt

Betrachten wir eine Szene im körperfesten Fahrzeugkoordinatensystem ist dieses am Mittelpunkt der Stoßstange definiert.

Körperfesten Fahrzeugkoordinatensystem

Der Verschiebungsvektor zwischen Kamerakoordinatensystem und Ort des Weltkoordinatensystems beträgt somit:


Verschiebt man das Weltkoordinatensystem mit dem in die Kamera, sind diese gegeneinander verdreht.

mit

: Drehung um die x_W-Achse, Rollwinkel

: Drehung um die y_W-Achse, Nickwinkel

: Drehung um die z_W-Achse, Gierwinkel

Berechnung extrinsischer Parameter

  1. Der Knopf Comp. Extrinsic der GUI ruft extrinsic_computation.m auf.
  2. Laden Sie die Kameraparameter Calib_Results.mat oder Kalibrieren Sie Ihre Kamera
  3. Sie werden aufgefordert die verzerrte Bilddatei zu laden.
Image name (full name without extension): VRmDC_Boden1
Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'p'='pgm', 'j'='jpg', 'm'='ppm') t

Extraction of the grid corners on the image
Window size for corner finder (wintx and winty):
wintx ([] = 5) = 5
winty ([] = 5) = 5
Window size = 11x11
Click on the four extreme corners of the rectangular complete pattern (the first clicked corner is the origin)...
Could not count the number of squares in the grid. Enter manually.
Number of squares along the X direction ([]=10) = 5
Number of squares along the Y direction ([]=10) = 5
Size dX of each square along the X direction ([]=30mm) = 16.6
Size dY of each square along the Y direction ([]=30mm) = 16.6
Corner extraction...

Ergebnis der Parameterberechnung

Das errechnete Ergebnis lautet

Extrinsic parameters:

Translation vector: Tc_ext = [ -46.048515 	 13.733091 	 72.490486 ]
Rotation vector:   omc_ext = [ 1.753991 	 0.023825 	 -0.007702 ]
Rotation matrix:    Rc_ext = [ 0.999759 	 0.020374 	 0.008164
                               0.011740 	 -0.182129 	 -0.983205
                               -0.018545 	 0.983063 	 -0.182325 ]
Pixel error:           err = [ 0.42985 	 0.54546 ]

Der Rotationsvektor in deg beträgt

Der Translationsvektor