Antwort auf Frage 2 aus Ihrem Qualifikationstest.

Von  : Menno Rubingh 
Datum: 21.08.2011

--------------------------------------------------------------------------
NB: Dieser Text is ISO-8859-1 plain text, formatiert für viewing mit einem 
    MONOSPACE font.
--------------------------------------------------------------------------


Die Literatur die ich gesehen habe seit Fr 12.08. ist:

  Trucco & Verri, 1998,
     _Introductory Techniques for 3-D Computer Vision_

  Zhang, 2000,
     das Paper aus IEEE Transactions on Pattern Analysis and Machine
     Intelligence, Vol 22, No 11 (p. 1330 - 1334).

  Cyganek & Siebert, 2009,
     _An Introduction to 3D Computer Vision Techniques and Algorithms_
     ISBN 978-0-470-01704-3

  Wöhler, 2009,
     _3D Computer Vision: Efficient Methods and Applications_
     ISBN 978-3-642-01731-5



Kurze Schilderung meiner Vorkenntnisse vor dem 12.08.:
   Vor dem 12.08. war das Thema "camera calibration" mir noch völlig
unbekannt.  In meinem Job 2008-2010 bezüglich 3D CAD, für DAKO GmbH in
Jena, hatte ich jedoch schon gelernt über einfache projective geometry
(pinhole-Kamera), homogene Koordinaten, und das mapping 2D conic <-->
3D Parabol.  (Epipolar lines und den "absolute conic" waren mir noch
unbekannt.)
   Fürs Auffrischen meiner Kenntnisse Über singular value decomposition 
und Levenberg-Marquard habe ich nachschlagen müssen in Strang _Linear
Algebra and its Applications_; Stoer&Bulirsch _Introduction to Numerical
Analysis_; und Press et.al. _Numerical Recipes_.




--------------------------------------------------------------------------

Inhalt

   * KAMERAMODELL

   * KAMERAMODELL IN HOMOGENEN KOORDINATEN

   * KALIBRIERUNG

     - Kalibrierung aus N Korrespondenzen, ohne radial distortion

     - Verfeinerung der Kamera-parameters

     - Planarer calibration rig






===========================================================================

KAMERAMODELL

===========================================================================


 Ein "Kameramodell" beschreibt wie die 3D Position eines "world
 Punktes" (in der fotografierten Szene) sich abbildet zu (maps to) den
 pixel-Koordinaten in dem digitalen Bild das aus der Kamera ausgelesen
 wird.



 Der wesentlichste Schritt dieses mapping (Abbildung) ist das mapping von
 3D Punkt zur der 2D Flaeche worin der Bildsensor liegt.  Das modellieren
 der Lichtfall (deflection) durch eine optischen Linse (lens) ist komplex;
 man benutzt das angenäherte (Approximate) Modell eines "pinhole camera":

    xP  =   -  f  x1 / z1           (Gleichung F1a)
    yP  =   -  f  y1 / z1           (Gleichung F1b)

    Parameter f = "focal length".

    x1,y1,z1  = 3D Koordinaten des scene point.
    xP,yP     = 2D Koordinaten in Bild-flaeche.

    Das x1,y1,z1 Koordinatensystem (= "Kamera-Koordinatensystem"):
       Z-Achse perpendicular zur Bild-Flaeche, und 
       Ursprung in einem Z-Abstand f von der Bildfläche.

    Das xP,yP Koordinatensystem: 
       Ursprung = wo die Z-Achse des x1,y1,z1 Koordinatensystems die 
       Bildfläche schneidet (= "principal point"); 
       X- und Y-Achsen gleich wie im x1,y1,z1-Koordinatensystem.
 
 Die Minus-Zeichen weil das Bild "umgekehrt" steht.

 [ Jeder 3D Punkt ( w x1, w y1, w z1 ) auf einer Linie durch (x1,y1,z1)
 und den Ursprung des Kamera-Koordinatensystems wird abgebildet auf den
 gleichen 2D Punkt (xP,yP). ]

                              

 Wenn die Abweichungen relativ zur pinhole-Annäherung, verursacht durch
 das Linsensystem, zu groß sind, dann ist die nächste Verfeinerung dass
 man die folgende Korrektur ("radial distortion") benutzt:

     alfa xPN  =  xPV
     alfa yPN  =  yPV

     wo 
        alfa =  1  +  k1 r^2  + k2 r^4
     mit
        r^2  =  xPN^2 + yPN^2

     k1 = Parameter
     k2 = Parameter (= 0 in erster Annäherung)

     xPV,yPV = 2D Koordinaten in Bild-flaeche, VOR Korrektur
     xPN,yPN = 2D Koordinaten in Bild-flaeche, NACH Korrektur.

 [ NB: Hier scheint es mir dass man diese Korrektur ausführen sollte auf
 xP,xP  --  und nicht auf xS, yS wie behauptet in (Cyganek & Siebert,
 2009). ]



 Dann muss man die (eventuell korrigierten) xP,yP umrechnen zu den
 Pixel-Koordinaten xS,yS des Bildsensors (= des digitalen Bildes):

     xP  =  Hx ( xS - Ox )
     yP  =  Hy ( yS - Oy )
      
     Parameter (Ox,Oy) = Position des principal point in Pixel-Koordinaten.
     Parameter Hx,Hy   = Breite und Höhe eines Pixels.

     Das xS,yS Koordinatensystem: 
        Ursprung in einer Ecke des Bildes.

 xS und yS müssen hier nicht unbedingt integer Werte haben.



 NB: Jedes der Koordinatensysteme {x1,y1,z1}, {xP,yP}, {xS,yS} hat ihre
 X-Achse und Y-Achse parallel zu den Reihen und Spalten der Pixel.



 Die bis soweit genannten Parameter nennt man "intrinsic parameters",
 weil sie mit der Kamera selbst zu tun haben, und nicht mit der Position
 u/o Orientierung der Kamera in der fotografierten 3D-Welt.  Die intrinsic
 parameters sind also:

     f       = focal length
     k1, k2  = radial distortion.
     Ox, Oy  = Position des principal point in Pixel-Koordinaten.
     Hx, Hy  = Breite und Höhe eines Pixels.



 Wenn man die radial distortion Korrektur nicht ausführt -- ODER auch
 wenn man die Korrektur (m.E. im Grunde fälschlicherweise) durchführt
 auf xS,yS anstatt auf xP,yP -- , dann ergibt das zusammennehmen der
 obigen Formeln für xS,yS (vor eventuellem Korrektur):

     xS  =  - (f/Hx) (x1/z1)  +  Ox
     yS  =  - (f/Hy) (y1/z1)  +  Oy

 worin man sieht dass dass f und Hx immer zugleich auftreten als Faktor
 (f/Hx); und genauso für f und Hy.  Das bedeutet dass die drei Parameter
 { f, Hx, Hy } in diesem Fall nur zwei degrees of freedom haben.
 In diesem Fall würde ich anstatt { f, Hx, Hy } die zwei folgenden
 Parameter benutzen:

     fx  =  f / Hx    =  ratio ( focal length / pixel size ) für X
     fy  =  f / Hy    =  ratio ( focal length / pixel size ) für Y.

 Jedoch wenn man die Korrektur macht auf xP,yP, dann würde das 
 bedeuten dass f, Hx, Hy dann im Kameramodell NICHT immer nur als 
 (f/Hx) und (f/Hy) vorkommen.  Die Parameter { f, Hx, Hy } würden 
 dann 3 degrees of freedom haben, was sich jedoch nur in der radial 
 distortion äussert: was m.E. bedeutet dass die Kalibrier- 
 Berechnungen dann nur funktionieren bei einer Kamera die 
 tatsächlich eine signifikante radial distortion hat, und auch nur 
 dann wenn sich genug Korrespondenz-Punkte in einer stark 
 distortierten Zone im Bild befinden. 
    Am besten scheint es mir, dass man beim Kalibrieren aus den Daten 
 detektiert ob radial distortion signifikant ist oder nicht.  Wenn
 signifikant, dann xP,yP auf radial distortion korrigieren und die
 intrinsic Parameter { f, k1, k2, Ox, Oy, Hx, Hy } benutzen (wobei man
 k2 = 0 nehmen sollte wenn k2 nicht signifikant ist).
    Wenn distortion nicht signifikant ist, dann die intrinsic Parameter 
 { fx, fy, Ox, Oy } benutzen, und die radial distortion Korrektur im
 Modell disablen (k1 = k2 = 0).



 Die rotation und translation des Kamera-Koordinatensystems x1,y1,z1
 relativ zu einem anderen Koordinatensystem W in der 3D Welt nennt man
 die "extrinsic parameters":

     p1   =  R ( pW - t )

 wo

     p1 = (x1,y1,z1)    
        = Koordinaten des 3D Punktes im Kamera-Koordinatensystem

     pW = (xW,yW,zW)    
        = Koordinaten des selben 3D Punktes im W-Koordinatensystem

     t  = translation vector  = (tX,tY,tZ).
 
     R = 3x3 Rotationsmatrix (orthonormal).

 Die Rotationsmatrix R hat nur drei unabhängige Parameter (die
 drei Rotationswinkel um die Koordinat-Achsen; oder Richtung
 der Rotationsachse plus Rotationswinkel).  Zusammen mit dem
 Translationsvektor t ergibt das insgesamt 6 unabhängige extrinsic
 parameters.




===========================================================================

KAMERAMODELL IN HOMOGENEN KOORDINATEN  

===========================================================================


 Im oben dargelegten Kameramodell ist die Beziehung zwischen 3D Welt-Punkt
 (xW,yW,zW) und 2D Bild-Punkt (xS,yS) nicht linear, einerseits wegen
 der fundamentalen Gleichungen F1a,F1b für die Perspectiv-Abbildung,
 und andererseits wegen der radial distortion.

 Ein sehr häufig benutzter Trick, das Kameramodell trotzdem in linearen
 Gleichungen zu fassen, besteht darin dass man

    - radial distortion ausser Acht lässt [note 1], und

    - sogenannte "homogene Koordinaten" einsetzt für das 2D Bild-Punkt.



 Da ich die über diesen Trick gewonnenen linearen Gleichungen benutze
 im Kapitel unten über Kalibrierung, fasse ich hier kurz zusammen wie
 der Trick funktioniert.



 Bei ignorieren von radial distortion ist die Beziehung
 zwischen Bild-Punkt (xS,yS) und einen 3D-Punkt (x1,y1,z1) im
 Kamera-Koordinatensystem die folgende:

     xS  =  - fx (x1/z1)  +  Ox
     yS  =  - fy (y1/z1)  +  Oy

 Durch einführen von neuen Variabelen xS~, yS~, zS~ (genannt "homogene
 Koordinaten", und angezeigt mit einer '~') kann man dies úmschreiben als

     xS = xS~ / zS~         (Gleichung M1a)
     yS = yS~ / zS~         (Gleichung M1b)
     
 wo 
     xS~  =  -fx x1 + Ox z1
     yS~  =  -fy y1 + Oy z1
     zS~  =  z1

 Die Beziehung zwischen den xS~, yS~, zS~ (woraus man immer direkt die
 xS,yS finden kann) und p1 = (x1,y1,z1) ist also ein System von linearen
 Gleichungen:

        +-   -+        +-             -+   +-  -+
        | xS~ |        |  -fx  0   Ox  |   | x1 |
        | yS~ |  =     |   0  -fy  Oy  |   | y1 |      (Gleichung M2)
        | zS~ |        |   0   0   1   |   | z1 |
        +-   -+        +-             -+   +-  -+

                        \_____________/
                               Mint
 
 Die Matrix mit den intrinsic parameters in Gleichung M2 nennt man: Mint.



 Auch das das mapping zwischen p1 = (x1,y1,z1) im Kamera-Koordinatensystem
 und pW = (xW,yW,zW) im W-Koordinatensystem kann man schreiben als System
 von linearen Gleichungen.  Aus

     p1   =  R ( pW - t )   

 macht man zunächst

     p1   =  R pW  -  tR

 wo tR = R t = der rotierte translation vector.  (Translation t und
 dann Rotation R ist gleich zu: Die gleiche Rotation R und dann eine
 Translation um den rotierten translation vector tR.)  Letztere Gleichung
 ausgeschrieben in Koordinaten ist:

              +-               -+  +-  -+        +-   -+
              |  r11  r12  r13  |  | xW |        | tRx |
     p1   =   |  r21  r22  r23  |  | yW |    -   | tRy |
              |  r31  r32  r33  |  | zW |        | tRz |
              +-               -+  +-  -+        +-   -+

 Das ist das gleiche wie:

              +-                     -+  +-  -+   
              |  r11  r12  r13   -tRx |  | xW |
     p1   =   |  r21  r22  r23   -tRy |  | yW |
              |  r31  r32  r33   -tRz |  | zW |    (Gleichung M3)
              +-                     -+  | 1  |
                                         +-  -+

                \____________________/
                          Mext
 
 wo der Vektor (xW,yW,zW) um einen Koordinat erweitert ist, der immer
 den Wert 1 hat.  Gleichung M3 ist das gesuchte lineare Gleichungssystem
 für die Beziehung zwschen p1 und pW.   Die Matrix mit den extrinsic
 parameters in Gleichung M3 nennt man: Mext.



 Insgesamt ist die Beziehung zwischen pW = (xW,yW,zW) und pS also

        xS = xS~ / zS~         (Gleichung M1a)
        yS = yS~ / zS~         (Gleichung M1b)

        +-   -+             +-  -+
        | xS~ |             | xW |
        | yS~ |  =     M    | yW |        (Gleichung M4)
        | zS~ |             | zW |
        +-   -+             | 1  |
                            +-  -+

 wo  M = Mext Mint.  

 Ausgeschrieben:
 
    +-   -+      +-             -+   +-                     -+   +-  -+   
    | xS~ |      |  -fx  0   Ox  |   |  r11  r12  r13   -tRx |   | xW |
    | yS~ |  =   |   0  -fy  Oy  |   |  r21  r22  r23   -tRy |   | yW |
    | rS~ |      |   0   0   1   |   |  r31  r32  r33   -tRz |   | zW |   
    +-   -+      +-             -+   +-                     -+   | 1  |
                                                                 +-  -+
                   \____________/      \____________________/
                      Mint                     Mext
                                                           (Gleichung M5)




===========================================================================

KALIBRIERUNG

===========================================================================


 "Kalibrierung" bedeutet dass man die Werte der Parameter eines
 Kamera-Modells feststellt aus Messungen (measurements).

 Die einfachste Art der Kalibrierung ist dass man eine 3D Szene
 fotografiert die eine Anzahl 3D Punkte enthält deren W-Koordinate
 (xW,yW,zW) mann kennt.  Diese 3D-Punkte sollten erkennbar sein im
 aufgenommenen Bild.  Man findet dann die Korrespondenzen welcher Punkt
 pS im Bild zu welchem Welt-Punkt pW gehört.

 Jede Korrespondenz ist ein Paar { pW, pS }, wo pW = (xW,yW,zW) und pS =
 (xS,yS) bekannt sind.  Für jede Korrespondenz schreibt man dann die
 Formeln des Kamera-Modells auf.  In diesem System von Gleichungen sind
 alle xW,yW,zW und alle xS,yS bekannt, und alle Parameter (intrinsic und
 extrinsic parameters) unbekannt.  Wenn man genug Korrespondenzen hat,
 kann man hieraus die Werte der Parameter finden.  (Mehr hierüber unten.)
 Ergebnis ist der Satz der Parameter-Werte.

    [ Nebenbei: Die extrinsic parameters (R, t) sind natürlich nur gültig
      solange man die Kamera nicht verschiebt/dreht im W-Koordinatensystem
      (der 3D-Kalibrierpunkte).  D.h. die extrinsic parameters
      muss man neu bestimmen (neu vermessen) sobald die Kamera
      umpositioniert/gedreht wird.   
          Verschieben/drehen der Kamera sollte aber die intrinsic
       parameters (für eine gegebene Kamera) nicht beeinflussen, solange
       Faktoren konstant bleiben die einen Einfluss haben könnten auf
       die Parameter-Werte (z.B. Temperatur).  ]




 Die Information die man pro Korrespondenz aus den Messdaten gewinnt
 ist die folgdende.  Das Kamera-Modell gibt pro Korrespondenz zwei
 Gleichungen:

     xP  =  - f (x1/z1)
     yP  =  - f (y1/z1)
 
 [ wo (xP,yP) von (xS,yS) abhängt, und (x1,y1,z1) von (xW,yW,zW)
 abhängt; aber Substitution dieser Beziehungen in obige Gleichungen
 ändert nicht die Anzahl dieser obigen Gleichungen ].  

 Wenn man N Korrespondenzen einbezieht, sind das insgesamt 2N Gleichungen,
 in denen die N 3D-Kalibrierpunkte (xW,yW,zW) und deren N 2D-Abbildungen
 (xS,yS) bekannt sind, und in denen die Kamera-parameters unbekannt sind.
 Theoretisch sollte man daher aus N Korrespondenzen die Werte von
 _maximal_ 2N Kamera-parameters feststellen können.

 Das Kamera-Modell ohne radial distortion hat die 4 intrinsic parameters
 { fx, fy, Ox, Oy }, also mit den 6 extrinsic parameters insgesamt 10
 parameters.  Dafür würde man mindestens 10 Gleichungen brauchen, d.h.
 mindestens 5 Korrespondenzen.

 Mit radial distortion hat das Kameramodell 7 intrinsic parameters 
 { f, k1, k2, Ox, Oy, Hx, Hy }, also also mit den 6 extrinsic parameters
 insgesamt 13 parameters; wofür mindestens 13 Gleichungen benötigt sind,
 d.h. mindestens 7 Korrespondenzen.

 Wie bei jedem Messverfahren, erreicht man eine bessere Messung wenn
 man mehr Messpunkte (d.h. mehr Korrespondenzen) berücksichtigt.



 Eine andere Art von Kalibrierung ist die sogenannte "self-calibration".
 Dabei ist es nicht nötig dass die Koordinaten bekannt sind der 3D
 Punkte die man verwendet (und im Bild erkennt).  Jedoch man braucht
 dabei von dieser 3D Szene (die die 3D Punkte enthält) mehrere Aufnahmen,
 aus unterschiedlichen Kamerapositionen.  (Die Position der verwendeten
 3D Punkte im W-Koordinatensystem sollte sich zwischen den Aufnahmen
 nicht ändern.)  
    Bei self-calibration besteht die Information die man ausnutzt um 
 die Kamera-parameters (und die unbekannte 3D position der erkannten
 3D scene points) festzustellen aus:  Die Korrespondenzen zwischen (a)
 der 2D-Abbildung in Kameraposition 1 der erkannten K 3D scene points,
 und (b) dessen 2D-Abbildung in Kameraposition 2. 
    Ich behandle in diesem Text nur Kalibrierung auf grund von 3D
 Kalibrierpunkten mit BEKANNTEN Koordinaten im W-Koordinatensystem,
 und nicht self-calibration.



 In den ersten zwei Abschnitten unten beschreibe und erkläre ich
 eine genaue Vorgehensweise fürs ableiten (feststellen) der Werte der
 Modellparameter aus N Korrespondenzen zwischen bekannten 3D Punkten
 und Ihre 2D-Abbildungspunkten, in einer eizigen Aufnahme:

  - Abschnitt "Kalibrierung aus N Korrespondenzen, ohne radial distortion"

      Hier beschreibe ich wie man aus den Messdaten _analytisch_ eine
      Schätzung der Kamera-parameters finden kann.  Der Algorithmus
      den ich hier beschreibe und analysiere ist der aus Trucco&Verri,
      Abschnitt 6.3.1 (Seite 132-133).  Dieser Algorithmus benutzt das
      Kameramodell in homogenen Koordinaten (Gleichung M5 oben), also
      ohne radial distortion (k1= k2 = 0).

  - Abschnitt "Verfeinerung der Kamera-parameters"

      Hier erkläre ich wie man die analytisch gefundene Schätzung der
      Kamera-parameters verfeinern (genauer machen) kann, und auch
      erweitern kann um das finden der radial distortion parameters.
      Dies geschieht aus den gleichen Messdaten, und über eine numerische
      (iterative) Prozedur in der das volle, nicht-lineare, Kameramodell
      benutzt wird.

 Die iterative Verfeinerungs-Prozedur braucht einen initial guess.
 Als initial guess wird benutzt: k1 = k2 = 0, plus die angenäherten
 Kamera-parameters gefunden mit der analytischen Methode im ersten
 Abschnitt.
    Insgesamt ist die Vorgehensweise also dass man die Schritte aus den
 zwei obengenannten Abschnitten beide ausführt, nach einander.  Also
 zunächst analytisch einen initial guess finden, danach diesen verfeinern.

 Im ersten Abschnitt erkläre ich anhand der dort beschriebenen
 Kalibriervorgang auch, wie viele 3D Kalibrierpunkte benötigt sind,
 und welche Bedingungen die 3D Kalibrierpunkte weited erfüllen müssen.
 Eine wichtigste Bedingung die dort "entdeckt" (erklärt) wird ist
 dass die 3D Kalibrierpunkte nicht alle in der gleiche Fläche (plane)
 liegen sollten.  Diese Bedingungen gelten _auch_ für den zweiten
 Abschnitt ("Verfeinerung").

 Es gibt jedoch Verfahren zur Kamerakalibration die calibration rigs
 (Kalibriermuster) benutzen die PLANAR sind, wie das Verfahren von
 Zhang 2000.  Diese Verfahren behandelt der letzte Abschnitt:

  - Abschnitt "Planarer calibration rig"

      Hier analysiere ich welche Kalibrierungen möglich sind mit einem
      planaren Kalibriermuster.  
         Hauptteil des Abschitts ist meine Analyse von dem Verfahren von
      Zhang 2000 für das Feststellen der (intrinsic) Kamera-parameters
      mittels eines planaren Kalibriermusters, wovon _mehrere_ Aufnahmen
      gemacht werden.  Ich erkläre dabei welche Bedingungen diese
      Aufnahmen erfüllen müssen (nämlich: Man sollte den calibration rig
      zwischen Aufnahmen verschieben und/oder drehen relativ zur Kamera).



 Alle Kalibrier-Methoden die ich in diesem Text beschreibe beruhen darauf,
 dass man in einem Vorgang zugleich alle Kamera-Parameter bestimmt.
 Ich habe mich auf diese Art der Kalibration konzentriert weil auch
 Zhang 2000 so vorgeht.

 Jedoch man sollte m.E. nicht vergessen dass es auch Methoden gibt,
 die einzelne intrinsic parameters direkt festlegen, d.h. über Verfahren
 die nicht zugleich auch andere intrinsic parameters vermessen.  In der
 gesehenen Literatur fand die folgende erwähnt:

     - Ox,Oy : 
       Trucco&Verri, Abschnitt 6.2.3 (p.131-132) bestimmen die Pixel-
       Koordinaten Ox,Oy des principal point aus den vanishing points
       einer Aufnahme eines Kalibriermusters das mehrere unterschiedliche
       Mengen gerader Linien in 3D festlegt.

     - Radial distortion:
       Wöhler p. 18 schreibt laconisch: "Radial and tangential distortions
       can be directly inferred from deviations from straightness in the
       image"  (aber beschreibt dort selbst keine detaillierte Methode).




----------------------------------------------------------

Kalibrierung aus N Korrespondenzen, ohne radial distortion

----------------------------------------------------------


>>> Abfassen der N Korrespondenzen als Matrixgleichung A m = 0


 Wie erklärt im Kapitel "KAMERAMODELL IN HOMOGENEN KOORDINATEN" oben, kann
 man, wenn man radial distortion ausser Acht lässt, homogene Koordinaten
 einsetzen, und damit das Kamera-Modell schreiben als lineare Gleichungen:

        +-   -+            +-  -+
        | xS~ |            | xW |
        | yS~ |  =     M   | yW |        (Gleichung M4)
        | zS~ |            | zW |
        +-   -+            | 1  |
                           +-  -+
 wobei 

     xS = xS~ / zS~          (Gleichung M1a)
     yS = yS~ / zS~          (Gleichung M1b)

 Die homogene Koordinaten sind mit einer ~ versehen.  Die Gleichungen M1a,
 M1b definieren das mapping zwischen den homogenen Koordinaten xS~,yS~,zS~
 und die gemessenen Bild-Koordinaten xS,yS.

 M ist ein 3x4 Matrix, in der die Elemente m_ij lineare Kombinationen
 der Parameter sind (siehe Gleichung M5 weiter oben).  Die Gleichungen
 M1a, M1b zeigen dass man den right hand side in Gleichung M4 mit einem
 willkürlichen scalar factor multiplizieren kann ohne dass xS,yS sich
 ändern; d.h. Matrix M ist definiert up to an arbitrary multiplicative
 factor.  

 Obiges System vom Gleichungen gibt es für jede Korrespondenz.
 Die bekannten Messwerte sind xS,yS und xW,yW,zW (natürlich andere
 Werte für jede Korrespondenz).  Unbekannt (und zu bestimmen) sind die
 Kamera-Parameter in M (die sind die gleichen für jede Korrespondenz).



 Trucco&Verri 1998, p. 133, gehen jetzt so vor dass zunächst die Elemente
 m_ij der Matrix M als die unknowns behandelt werden.  (Hieraus werden
 dann später die Kamera-Parameter berechnet.)  Sie schreiben die
 Gleichungen M1a,M1b so dass sie linear werden in den unknowns m_ij:

     xS~  -  xS zS~  = 0
     yS~  -  yS zS~  = 0

 Substitution hierin der xS~, yS~, zS~ durch die right hand sides aus
 Gleichung M4 ergibt zwei Gleichungen die linear sind in den unknowns
 m_ij.  Für N Korrespondenzen ergibt das N dieser Gleichungspaare (alle
 linear in den unknowns m_ij).  Jetzt ist erreicht die Matrixgleichung
 (6.17) aus Trucco&Verri 1998, Seite 133:

                    A m  =  0           (Gleichung K1)

 wo 
        m = vector der 12 Elemente der Matrix M
          = ( m_11, m_12, m_13, m_14, m_21, m_22, ... , m_34 )

 und wo A der folgende 2N x 12 Matrix ist:

       +-                                                                 -+
       | xW1 yW1 zW1  1    0   0   0   0   -xS1*xW1 -xS1*yW1 -xS1*zW1 -xS1 |
       |  0   0   0   0   xW1 yW1 zW1  1   -yS1*xW1 -yS1*yW1 -yS1*zW1 -yS1 |
  A =  |  ...             ...              ...                             |
       | xWN yWN zWN  1    0   0   0   0   -xSN*xWN -xSN*yWN -xSN*zWN -xSN |
       |  0   0   0   0   xWN yWN zWN  1   -ySN*xWN -ySN*yWN -ySN*zWN -ySN |
       +-                                                                 -+
                                                          (Gleichung K2)



>>> Lösen von A m = 0,
    und Bedingungen für die 3D Kalibrationspunkte


 Aus Gleichung K1 (A m = 0) sehen wir noch einmal dass die m_ij nur
 definiert sind up to an arbitrary multiplicative factor.  Mathematisch
 gesehen sagt Gleichung K1 dass der gesuchte Vektor m ein beliebiger
 Vektor ist im nullspace von Matrix A.  

 "Theoretisch" (ohne Messfehlern, ohne Diskretisierungsfehlern, ohne
 Abrundungsfehlern, usw., und mit 100% Übereinstimmung zwischen Modell und
 Wirklichkeit), und wenn N groß genug ist, kann die 12-spaltige matrix
 A maximal den rank 11 haben (wobei die nullspace die Dimension 1 hat).
 Rank 11 reicht aus dazu, die 11 Freiheitsgrade in m festzulegen.

 Damit A den rank 11 erreicht sollte sie natürlich mindestens 11 Zeilen
 (rows) enthalten; da jede Korrespondenz 2 rows beiträgt brauchen wir
 also mindestens 6 Korrespondenzen.  [note 2]

 Darüber hinaus gibt es noch eine Bedingung damit A den rank 11 erreicht,
 nämlich:  Es sollte nicht so sein dass alle 3D Kalibrierungspunkte pW_i =
 (xWi,yWi,zWi), i = 1 ... N, in der gleichen Fläche (plane) liegen.
    Betrachten wir z.B. die Fläche zW = 0.  [Das ist allgemein genug, da 
 die Orientierung des W-Koordinatensystems (= Rotation R) jede sein kann.]
 Bei Substitution von zWi = 0 für alle i in Matrix A (Gleichung K2)
 entstehen 3 null-wertige Spalten.  Der rank von Matrix A verringert
 sich hierdurch um 3, also von 11 nach 9.  (Der nullspace von A ist jetzt
 nicht mehr 1-dimensional, sondern 4-dimensional.)  
    Diese 9 freiheitsgrade reichen nicht aus dazu, das Kameramodell zu
 kalibrieren dass neben den 6 extrinsic parameters die 4 intrinsic
 parameters { fx, fy, Ox, Oy } benutzt.
    Mehrere der gelesenen Literaturstücke schreiben dass Ox = Oy = 0
 für viele Kameras eine gute erste Annäherung ist.  Das verringert die
 Anzahl intrinsic parameters zu 2, nämlich { fx, fy }, also mit den
 extrinsic parameters insgesamt 8 Kamera-parameters.  Dieses Kameramodell
 würde man kalibrieren können aus einer einzigen Aufname eines planaren
 Kalibriermusters; siehe dazu Abschnitt "Planarer calibration rig" unten.


 
 In der Wirklichkeit gibt es immer Messfehler, Diskretisierungsfehler, und
 Abrundungsfehler, und auch benutzen wir ein vereinfachtes (angenähertes)
 Kameramodell.  Schon bei 6 Korrespondenzen wird die matrix A daher
 in Wirklichkeit nicht den rank 11 haben, sondern den vollen rank 12.
 Der nullspace ist jetzt verschwunden und das Gleichungssystem K1 hat
 keine Lösung mehr (außer die für uns nutzlose triviale Lösung m = 0).

 Wir können trotzdem weitermachen und einen _optimalen_ Vektor m
 bestimmen, dadurch dass wir die Fehler (Abweichungen wegen Messfehlern
 usw.) modellieren als

            A m  =  e,     e = Fehlervektor

 und dann der Vektor m suchen der die Länge || e || der Fehlervektors
 minimiert.  (Dies ist least squares Optimierung: Es wird minimiert der
 sum of squares der Elemente des Fehlervektors.)  Diese Vorgehensweise
 erlaubt es auch, die Anzahl N der Korrespondenzen zu vergrößern, so
 dass matrix A höher wird als 12 Zeilen.  Minimieren von e bedeutet dann
 dass der gefundene m ein "fit" ist des Modells auf alle N Messpunkte.
 Je mehr Messpunkte einbezogen werden, desto genauer sollte der gefundene
 m sein (die Annahme dabei ist jedoch dass die Abweichungen über alle
 Messpunkte statistisch gleich verteilt sind).

 Der m der || e || = || A m || minimiert findet man m.E. am besten aus
 Singular Value Decomposition (SVD)  A = U D V^T  der Matrix A.  
 || A m || ist minimal wenn m = v1, wo v1 die Spalte aus V ist die gehört
 zur kleinsten singular value s1 (aus D).

 Je kleiner die Abweichungen e in den Messdaten sind (und je mehr
 Modell mit Wirklichkeit übereinstimmt), desto mehr nähert sich der
 kleinste singular value zu 0 an.  Im theoretischen Idealfall e = 0 ist
 der kleinste singular value s1 gleich null, und liegt m = v1 in der
 nullspace und ist ein exacter fit (mit || e || = 0).
    Der kleinste singular value s1 ist also m.E. ein Maß für die "Güte"
 des least squares fit:  Je kleiner desto besser (0 = ideal); und ein
 großer s1 bedeutet dass Messdaten und Modell nur schlecht übereinstimmen.

 Es sollte weiter so sein dass A nur _einen_ singular value hat der nah
 bei 0 liegt; die andere singular values sollten "deutlich" größer als
 0 sein.  Wenn es (trotz N >= 6) mehrere near-zero singular values gibt,
 so dass Richtung m die || A m || minimiert schlecht festgelegt ist, dann
 bedeutet das, dass die 3D Kalibrierungspunkte nahezu in der gleichen
 Fläche liegen (vergleiche die Analyse des Idealfalls oben).

 M.E. sollte die Kalibrierungs-Berechnung die in den letzten Absätzen
 genannten Bedingungen überprüfen, und es dem Anwender melden wenn die
 Bedingungen schlecht erfüllt sind.  (Man könnte z.B. dem Anwender die
 folgenden Werte zurückgeben: Der kleinste singular value s1; die ratio
 r1N = s1/sN des kleinsten und grössten singular value; und die ratio
 r12 = s1/s2 der zwei kleinsten singular values.)



 Zhang 2000 schreibt zu recht noch dass ein Matrix wie unsere A
 (Gleichung K2) numerisch schlecht konditioniert ist: Die Spalten 1,2,3
 und 5,6,7 enthalten W-Koordinaten, die Spalten 4 und 8 enthalten units,
 die letzte Spalte enthält Bild-Koordinaten, und die Spalten 9,10,11
 enthalten sogar Produkte von W-Koordinaten und Bild-Koordinaten --
 d.h. die Spaltenvektoren von A sind widely out of scale.  Ich würde
 hier vor SVD jede Spalte von A normalisieren auf die gleiche Länge
 wie die Spalten 4 und 8.  Die benutzte Normierungsfaktoren für jede
 Spalte speichern, und nachher die elemente m_ij des gefundenen Vektors
 m zurückskalieren um den vorher für die entsprechenden Spalte aus A
 benutzten Faktor.



 Nachdem die m_ij erfolgreich festgestellt sind, berechnet man daraus
 die intrinsic parameters, die elemente des rotation matrix, und den
 translation vector tR, über analytische Formeln die sich ohne Probleme
 (siehe Trucco&Verri, p. 134 - 135) ableiten lassen aus M = Mint Mext,
 mit den Mint und Mext aus Gleichung M5, und wo M die jetzt bekannten
 m_ij enthält (siehe Trucco&Verri, p. 134 - 135).

 Die Elemente so erhaltene rotation matrix R sind aus Messungen
 abgeleitet, und diese R is daher wahrscheinlich nicht orthogonal,
 und sollte korrigiert werden, wie folgt:  SVD von R berechnen (R =
 U D V^T).  Die korrigierte rotation matrix ist dann U I V^T, mit den
 singular values auf 1 gesetzt.






----------------------------------

Verfeinerung der Kamera-parameters

----------------------------------


 Wöhler 2009 (u.a. um Seite 22) kritisiert, dass der error Vektor 
 e = A m, der minimiert wird im obigen Abschnitt, eine arbiträre Größe
 ist, und keine physische Bedeutung hat.

 Und er schreibt dass die Parameter-Werte die man berechnet aus den so
 erhaltenen m_ij nur taugen als initial guess in einer Optimierung in
 der man stattdessen den "reprojection error" E minimiert:

      E  =  SUM_i [  d_i ^ 2  ]         (Gleichung K3)

 mit
      d_i    =  abstand zwischen Punkt pS_i und Punkt Pr( pW_i )

 wo
      pS_i   =  Das 2D Bild-Punkt der i-ten Korrespondenz
                (in pixel coordinates)

      pW_i   =  Das 3D Welt-Punkt der i-ten Korrespondenz

      Pr( pW_i )  =  Aus Kamera-Modell Berechnete Projektion von
                     pW_i nach 2D Bild-Punkt 
                     (in pixel coordinates).

 In der Berechnung der Pr( pW_i ) aus den pW_i fliessen hinein die
 Werte der Kamera-parameters.  Minimieren von E bedeutet daher dass
 man die Kamera parameters so sucht dass die Pr( pW_i ) nah zu ihren
 korrespondierenden pS_i liegen.

 (Auch von Zhang 2000 wird die gleiche error measure E minimiert wenn
 er seine Verfeinerung ausführt.)



 Pr( pW ) ist eine nicht-lineare Funktion der Koordinaten von pW =
 (xW,yW,zW).  Minimieren von E (als Funktion der Parameter) bedeutet daher
 nicht-lineare Minimierung, d.h. Levenberg-Marquard [beshrieben in Press
 et.al., _Numerical Recipes_].  Jeder Algorithmus für nicht-lineare
 Minimierung braucht eine initial guess (in unserem Fall: für die
 Kamera-Parameter) -- d.h. die nicht-lineare Minimierung *verfeinert*
 die initial guess.

 Das alles passt neatly zusammen:  Zunächst findet man aus linearen
 Gleichungen (mit radial distortion ignoriert) über SVD und über
 minimieren einer "komischen" error measure eine initial guess für die
 Kamera-parameters.  Diese initial guess verfeinert man dann mit ein paar
 Levenberg-Marquard Schritten zur minimierung der richtigen error measure
 E, wobei man auch gleich das Modell erweitern kann um radial distortion
 (initial guess: k1 = k2 = 0).





------------------------

Planarer calibration rig

------------------------

 Der Algorithmus beschrieben in den obigen Abschnitten (wobei nur EINE
 Aufnahme gemacht wird) erlaubt es nicht dass alle 3D Kalibrierpunkte
 in der gleichen Fläche liegen.

 Zhang 2000, und auch die Beschreibung in Wöhler 2009 (p. 22) eines
 Papers von Tsai aus 1987, benutzen jedoch planare calibration rigs.
 Sie nehmen das Welt-Koordinatensystem W so dass das Kalibriermuster in
 der Fläche zW = 0 liegt.  D.h. by construction hat man zW = 0 für alle
 3D Kalibrierungspunkte.

 Gleichung M4 wird

        +-   -+            +-  -+
        | xS~ |            | xW |
        | yS~ |  =     M   | yW |      
        | zS~ |            | 0  |
        +-   -+            | 1  |
                           +-  -+

 Die dritte Spalte von M "fällt weg".

 Gleichung M5 (weiter oben), mit den ausgeschriebenen Matrixelementen, 
 reduziert sich zu 

    +-   -+      +-             -+   +-                -+   +-  -+   
    | xS~ |      |  -fx  0   Ox  |   |  r11  r12   -tRx |   | xW |
    | yS~ |  =   |   0  -fy  Oy  |   |  r21  r22   -tRy |   | yW |
    | rS~ |      |   0   0   1   |   |  r31  r32   -tRz |   | 1  |
    +-   -+      +-             -+   +-                -+   +-  -+

                   \____________/      \_______________/
                      Mint                    Mext
  
                   \___________________________________/
                                   M
                                                    (Gleichung Z1)

 wo die dritte Spalte (r13,r23,r33) in Mext weggefallen ist.  Matrix M =
 Mint Mext reduziert sich zu einer 3x3 Matrix.

 Da die Gleichungen M1a, M1b hier noch immer gelten, ist auch die 3x3
 Matrix M nur definiert up to an arbitrary scaling factor.  Ähnlich wie
 oben für den nicht-planaren Fall kann man aus einer bekannten Menge
 Korrespondenzen (aus einer Aufnahme des calibration rigs) die 9 Elemente
 m_ij dieser 3x3 Matrix zu feststellen up to a common multiplicative
 factor (Vorgang ist wieder über A m = 0 und SVD, mit danach eventuell
 einem Levenberg-Marquard refinement, alles wie oben beschrieben).

 Diese 9 Zahlen, mit 8 Freiheitsgraden, reichen auf jedem Fall aus
 dazu, aus der single Aufnahme ein Kameramodell zu kalibrieren das 8
 parameters hat.
    Mehrere der gelesenen Literaturstücke schreiben dass Ox = Oy = 0
 für viele Kameras eine gute erste Annäherung ist.  Das verringert die
 Anzahl intrinsic parameters zu 2, nämlich { fx, fy }, also mit den
 extrinsic parameters insgesamt 8 Kamera-parameters.  Dieses Kameramodell
 würde man kalibrieren können aus einer einzigen Aufname eines planaren
 Kalibriermusters.
    [ Bemerkung: Ich vermute, dass ein so kalibriertes Modell nicht
 genau sein würde für 3D scene points die sich befinden auf einer zW weit
 entfernt von 0, d.h. weit entfernt von der Fläche des planar calibration
 rigs. ]

 Zhang 2000 und Wöhler 2009 (p. 22) beschreiben Verfahren wie man mit
 einem planaren calibration rig trotzdem ein Kameramodell kalibrieren
 kann das MEHR als 2 intrinsic parameters hat.  Alle dieser Verfahren
 beruhen (nicht erstaunlicherweise) darauf, dass man MEHRERE Aufnahmen
 macht, und den planaren calibration rig zwischen Aufnahmen VERSCHIEBT
 und/oder DREHT relativ zur Kamera.
    Sowohl Zhang 2000 wie auch Wöhlen 2009 (p. 22) nutzen aus dass
 wir in Gleichung Z1 ein 'a priori' Wissen haben dass in den obigen
 Abschnitten noch nicht benutzt wurde; nämlich wir wissen dass die Spalten
 (r11,r21,r31) und (r12,r22,r32) in Mext, Spalten aus der Rotationsmatrix
 R, orthonormal sind.

 Unten beschreibe ich den Algorithmus von Zhang 2000.  Die Beschreibung
 erklärt auch wieviele Aufnahmen benötigt sind, und warum der planare
 calibration rig zwischen Aufnahmen verschoben/rotiert werden muss.




>>> Zhang -- Übersicht


 Zhang 2000 benutzt eine planare calibration rig, wovon er n Aufnahmen
 macht, unter unterschiedlichen Rotationen u/o Translationen relativ zur
 Kamera.  Die Aufnahmen werden alle mit der selben Kamera gemacht,
 nämlich die Kamera wovon die intrinsic parameters festzustellen sind.
 Meine Eindruck ist, dass er sein Verfahren vor allem abgezielt hat auf
 das feststellen der _intrinsic_ parameters einer Kamera.  (Sein Verfahren
 kann bis zu 5 intrinsic parameters feststellen.)

 Jede Aufnahme betrachtet er zunächst separat.  Folgende sind die Schritte
 die er durchführt für jede Aufname separat:

   Er nimmt das W-Koordinatensystem so dass zW = 0 die Fläche seines 
   planaren calibration rigs ist, und benutzt die "reduzierte" 
   Vektoren und Matrizen aus Gleichung Z1.  Er findet eine Menge 
   Korrespondenzen zwischen (xW,yW) auf seinem calibration rig und 
   Bild-Punkten (xS,yS).  Aus diese Korrespondenzen stellt er die 
   Werte fest der Elemente m_ij in der 3x3 Matrix M (in Gleichung 
   Z1), up to a common multiplicative factor. 

 Bemerke dass jede Aufname ein anderes W-Koordinatensystem benutzt,
 da der calibration rig zwischen aufnahmen verschoben u/o gedreht wird.
 Zhang benutzt keine Information darüber wie die W-Koordinatensysteme
 der unterschiedlichen Aufnahmen sich zu einander beziehen.

 Die m_ij die so gefunden werden für jede separate Aufnahme sind eine
 Schätzung (Messung) für die Matrix M = Mint Mext die gültig ist für
 die _jeweilige_ Aufnahme.  Notation:  *M = matrix der geschätzten
 (gemessenen) m_ij für eine Aufnahme.

      Menge Korrespondenzen   -->   *M für Aufnahme 1
      aus Aufnahme 1                

      Menge Korrespondenzen   -->   *M für Aufnahme 2
      aus Aufnahme 2                

      ...                           ...

 Zwischen Aufnahmen ändert sich Mext.  Zhang nimmt an, dass sich zwischen
 Aufnahmen Mint nicht ändert.  (Das bedeutet m.E. dass die Aufnahmen nicht
 lange Zeit nach einander genommen werden müssen, so dass Faktoren die
 die intrinsic parameters beeinflüssen könnten, wie z.B. die Temperatur,
 sich zwischen Aufnahmen nicht stark ändern.)

 Die Situation ist also die folgende:  
 (Subscript _i angehängt an Größe die gilt für Aufnahme i)

      Menge Korrespondenzen   -->   *M_1  =  Mint  Mext_1
      aus Aufnahme 1                

      Menge Korrespondenzen   -->   *M_2  =  Mint  Mext_2
      aus Aufnahme 2                
      ...                           ...

 wo Mint für jede Aufnahme die gleiche ist.  Alle *M_i sind bekannt.
 Mint, und alle Mext_i, sind unbekannt.  Bemerke weiter dass jede der
 3x3 matrices Mext_i ein anderes W-Koordinatensystem benutzt.

 Die Idee hinter Zhang's Methode ist nun, diese n Matrixgleichungen

     *M_1  =  Mint  Mext_1
     ...
     *M_n  =  Mint  Mext_n

 zu behandeln als n "Messpunkte" für Mint.  Damit dies möglich ist,
 sollte aus jedem dieser n "Messpunkte" die matrix Mext_i irgendwie
 eliminiert werden.  Das gelingt dadurch, dass wir ausnutzen dass wir
 wissen dass in jeder Mext_i die ersten zwei Spalten (r11,r21,r31) und
 (r12,r22,r32) orthonormal sind.  



>>> Zhang -- Elimination von Mext_i aus *M_i = Mint Mext_i 


 Innerhalb dieser subsection betrachte ich nur _eine_ Aufnahme separat.

 Dass die m_ij bekannt sind up to a common multiplicative factor heißt:

     lambda  *M   =  Mint  Mext

 (wo *M    = die 3x3-matrix der m_ij für die betrachtete Aufnahme, und 
      Mext = die 3x3-matrix Mext für die betrachtete Aufnahme.)

 Ausschreiben in Spalten ergibt:

     lambda  [  m1  m2  m3  ]   =   Mint  [  r1  r2  tR  ]
                                                           (Gleichung Z2)

 wo
     mi  =  i-te Spalte aus matrix *M
     ri  =  i-te Spalte aus der rotation matrix R für die betrachtete Aufnahme
     tR  =  translation vector für die betrachtete Aufnahme.
 
 Das Wissen das wir jetzt ausnutzen möchten ist dass die Vektoren r1
 und r2 orthonormal sind:

     r1^T  r2   =   0                    (Gleichung Z3a)
     r1^T  r1   =   r2^T  r2   =  1      (Gleichung Z3b)

 (Notation: T = transpose, ^ = superscript.)

 Aus Gleichung Z2 entnehmen der Spalten für r1 und r2 ergibt:

     lambda  m1   =    Mint  r1
     lambda  m2   =    Mint  r2

 Die Spalte tR aus Mext, und die Spalte m3 aus *M, werden für das
 Feststellen von Mint nicht benutzt.  Die matrix Mint (mit den zu
 bestimenden intrinsic parameters) ist klein, und analytsisch umrechnen
 zwischen Mint und seine Inverse Mint^-1 ist einfach.  Wir dürfen daher
 úmschreiben nach

     r1  =   lambda  Mint^-1  m1        (Gleichung Z4a)
     r2  =   lambda  Mint^-1  m2        (Gleichung Z4b)

 Hiermit können wir das Scalarprodukt von ri und rj schreiben als

     ri^T  rj  
               =   lambda^2   ( Mint^-1  mi )^T  ( Mint^-1  mj )
               =   lambda^2   mi^T  Mint^-T  Mint^-1  mj
 
 Substitution unserer r1 und r2 aus Gleichungen Z4a, Z4b in die
 Orthogonalitätsbedingungen (Gleichungen Z3a, Z3b) ergibt also:

     m1^T  Mint^-T  Mint^-1  m2    =  0                (Gleichung Z5a)

     m1^T  Mint^-T  Mint^-1  m1    =   m2^T  Mint^-T  Mint^-1  m2
                                                       (Gleichung Z5b)

 Das Ziel ist erreicht.  Z5a, Z5b sind Gleichungen in denen nur noch
 vorkommen: unsere unbekannte Mint und die bekannten Messwerte m1, m2 
 (= Spalten aus *M) für die betrachtete Aufnahme.  

 In unseren Gleichungen Z5a, Z5b kommt die Kombination ( Mint^-T Mint^-1 )
 ständig wiederholt vor.  Dieses Matrixprodukt ist eine symmetrische 3x3
 matrix die nur von den intrinsic parameters abhängt.  [ Symmetrisch weil
 (A^T A)^T = A^T A für jede Matrix A. ]  Auch das Umrechnen zwischen
 Mint^-1 und der Produkmatrix ( Mint^-T Mint^-1 ) ist analytisch einfach
 machbar.  Wir führen daher ein die Notation

     B  =   Mint^-T  Mint^-1

 so dass wir Z5a, Z5b schreiben können als

     m1^T  B  m2                  =  0        (Gleichung Z6a)
     m1^T  B  m1  -  m2^T  B  m2  =  0        (Gleichung Z6b)


 Da die 3x3 matrix B symmetrisch ist:
           +-                 -+
           |  b11   b12   b13  |
    B  =   |  b12   b22   b23  |
           |  b13   b23   b33  |
           +-                 -+
 enthalten die Gleichungen Z6a, Z6b nur 6 unknowns:  b11, b12, b13, b22,
 b23, b33.




>>> Zhang -- Ableiten von Mint aus den *M_i für die n Aufnahmen


 Jede Aufnahme gibt uns ein Gleichungspaar Z6a, Z6b.  Es werden n
 Aufnahmen gemacht, so dass wir n solcher Gleichungspaare erhalten:

     m1_1^T  B  m2_1                      =  0       
     m1_2^T  B  m1_1  -  m2_1^T  B  m2_1  =  0      

     m1_2^T  B  m2_2                      =  0       
     m1_2^T  B  m1_2  -  m2_2^T  B  m2_2  =  0      

     ...

     m1_n^T  B  m2_n                      =  0       
     m1_n^T  B  m1_n  -  m2_n^T  B  m2_n  =  0      
                                                  (Gleichungssystem Z7)
 wo 
     m1_i  = erste Spalte aus *M für Abbildung i
     m2_i  = zweite Spalte aus *M für Abbildung i.

 Die matrix B (die nur von den intrinsic parameters abhängt) ist gleich
 für jede Abbildung.  Unsere unknowns sind die sechs Elemente b11, b12,
 b13, b22, b23, b33 der Matrix B.  Also insgesamt 2n Gleichungen und
 6 unknowns.

 Ein einfaches Ausschreiben dieser Gleichungen in den Elementen von B,
 m1_i und m2_i zeigt dass die Gleichungen in obiges Gleichungssystem sind
 alle linear in den unknowns b11, b12, b13, b22, b23, b33.  (Und dass
 die Koëfficienten der b_ij Summen sind von Produkten der Elemente von
 m1_i und m2_i.)

 Gleichungssystem Z7 kann daher geschrieben werden als Matrixgleichung

      C  b  =  0                   (Gleichung Z8)

 wo
      b  =  Vektor (b11, b12, b13, b22, b23, b33) mit unseren unknowns
      C  =  2n x 6 matrix mit bekannten Koëfficienten.

 Das genau wie oben im Abschnitt 
    "Kalibrierung aus N Korrespondenzen, ohne radial distortion"
 wieder eine homogene Matrixgleichung.  Genau wie dort finden wir wieder
 den optimalen b aus singular value decomposition  C  = U D V^T.  Der b
 der den error || e || = || C b || minimiert ist der Spaltenvektor v1
 aus V der gehört zur kleinsten singular value s1 (aus D).

 Die matrix C hat (theoretisch) höchstens den rank 5 (nullspace
 1-dimensional).  Damit C diesen maximalen rank erreicht wird, braucht
 man mindestens 5 Gleichungen, das heißt (mit 2 Gleichungen pro Aufnahme)
 mindestens 3 Aufnahmen.  Die 6 Zahlen b_ij sind damit festgelegt up to
 an arbitrary common factor.  Das reicht aus dazu, 5 intrinsic parameters
 festzulegen (zu kalibrieren).

 [Siehe für Kameramodelle mit weniger als 5 intrinsic parameters die
 subsection "Zhang -- Spezialfall für 4 intrinsic parameters" unten.]



>>> Zhang -- Verschieben/drehen des calibration rigs zwischen Aufnahmen


 Wie immer bei homogenen linearen Gleichungssystemen ist es wichtig dass
 die nullspace von C in Gleichung Z8 nicht mehr Dimensionen haben sollte
 als 1, d.h. nur ein singular value hat gleich 0.  [Wegen Messfehler
 erwarten wir auch hier wieder dass es ein singular value gibt nahe 0,
 mit allen anderen singular values deutlich > 0.]

 Die Berechnungen sollten m.E. auch hier wieder die singular values
 überprüfen, und Alarm geben wenn die singular values nicht sind wie
 benötigt (einer near 0, alle andere deutlich > 0).

 In der Matrix C werden mehr als ein singular value (nahe) null-wertig
 wenn die m1_i und m2_i für unterschiedliche Aufnahmen (nahezu) gleich
 sind.  
    m1_i und m2_i sind Spalten aus der "gemessenen" matrix *M_i für
 die Aufnahme i, die abgeleitet wurde aus der Menge Korrespondenzen
 gefunden in Aufnahme i.  Wir wissen dass 

       *M_i  =  Mint  Mext_i

 wo Mint konstant ist für alle Aufnahmen.  Die *M_i der unterschiedlichen
 Aufnahmen sind daher nur dann unterschiedlich, wenn die Mext_i --
 die rotation und/oder die translation des calibration rigs relativ zur
 Kamera -- in den Aufnahmen unterschiedlich sind.

    Beispiel: Wenn in allen n Aufnahmen der calibration rig exact die
    gleichen Position und Orientierung relativ zur Kamera hat -- oder
    wenn man n mal die gleiche Aufnahme benutzt --, dann ist Mext_i
    für jede Aufnahme gleich, und wir erhalten für jede Aufnahme die
    gleiche *M_i.  Gleichungssystem Z7 besteht jetzt aus eine n-fache
    Wiederholung von zwei Gleichungen; und Matrix C in Gleichung z8 hat
    jetzt denselben rank wie eine C die nur die zwei Gleichungen für
    eine einzige Aufnahme enthält, nämlich rank = 1.

 
 Obiges Beispiel ist ein Extremfall.  Wenn man das Kalibriermuster
 zwischen den Aufnahmen nur ein sehr wenig verschiebt, dann wird die
 matrix C immer noch "nahezu" den rank 1 haben (d.h. nur eine singular
 value haben der deutlich > 0 ist).

 Die Mindest-Bedingung die erfüllt werden muss für die Größe der
 Verschiebung/Rotation des Kalibriermusters zwischen Aufnahmen ist
 m.E. dass C nur ein singular value nahe 0 hat, und dass alle andere
 singular values eine Größe haben die "über die Mess-Ungenauigkeit liegt"
 -- die "signal to noise ratio" sollte hoch genug sein.  Offene Fragen:
 Wie genau definiert und schätzt man die Mess-Ungenauigkeiten ?, und
 wie bringt man man die Mess-Ungenauigkeiten und die singular values auf
 der gleichen scale damit man sie vergleichen kann ?  Fürs Lösen dieser
 Fragen würde ich mehr Zeit brauchen.

 Die Qualität (Genauigkeit) der erhaltenen Kamera-parameters verbessert
 sich wenn die "signal to noise ratio" sich steigert.  Ich denke (vermute
 sehr stark) dass für jede Kalibration gilt dass die 3D Kalibrierpunkte
 am besten gleichmäßig verteilt sein sollten über den ganzen 3D Raum
 worin die 3D scene of interest sich befindet; so würde man die maximale
 Genauigkeit in den Kamera-parameters erreichen.

 Daraus schließe ich dass die Verschiebungen u/o Drehungen des planaren
 Kalibriermusters zwischen den Aufnahmen am besten so sein sollten
 dass die 3D Kalibrierpunkte, insgesamt über allen Aufnahmen, sich weit
 verteilen über den 3D-Raum of interest.



>>> Zhang -- Spezialfall für 4 intrinsic parameters


 Zhang 2000 zeigt dass man die 4 intrinsic parameters aus dem Kameramodell

                +-             -+ 
                |  -fx  0   Ox  | 
     Mint   =   |   0  -fy  Oy  | 
                |   0   0   1   |  
                +-             -+  

 aus nur ZWEI Aufnahmen kalibrieren kann.  Analytisch ableiten der
 Matrix B  = ( Mint^-T  Mint^-1 ) aus dem obigen mInt ergibt Ausdrücke
 für die Elemente von B in terms of den 4 intrinsic parameters.  Mit der
 obigen Mint ergibt das b12 = 0, unabhängig von den intrinsic parameters.

 Das heißt dass "theoretisch" der unknown b12 null sein sollte.
 Mit anderen Worten, wir können die Gleichung

               b12 = 0

 hinzufügen in unser Gleichungssystem Z7.  Das so erweiterte
 Gleichungssystem Z7 hat dann bei 2 Aufnahmen insgesamt 5 Gleichungen.
 Matrix C wird eine 5 x 6 matrix.  Da C b = 0, hat C theoretich maximal
 den rank 4.  (Dieser rank wird nur erreicht wenn in den 2 Aufnahmen die
 calibration rig unterschiedlich gedreht/positioniert wird.)  Das reicht
 dazu aus, die 4 intrinsic parameters zu bestimmen.


 [Bemerkung: EINE einzige Aufnahme eines planaren Kalibriermusters
 reicht aus für 2 intrinsic parameters, aber dafür braucht man das
 Zhang-Verfahren nicht -- siehe den Anfang dieses Abschnittes "Planarer
 calibration rig".]




>>> Zhang -- Extrinsic parameters


 Da der calibration rig zwischen Aufnahmen verschoben/gedreht wird,
 sind die extrinsic parameters für jede Aufnahme unterschiedlich.
 Die extrinsic parameters für Aufnahme i sind die rotation R und
 translation tR des W-Koordinatensystems -- das im calibration rig liegt
 -- relativ zum Kamera-Koordinatensystem.

 Gegeben die intrinsic parameters, kann man diese R und tR für jede
 Aufnahme berechnen wie folgt.  Hierzu wird die Information über r1,
 r2, tR aus Gleichung Z2 benutzt die bei der Bestimmung der intrinsic
 parameters ignoriert wurde.

 r1/lambda und r2/lambda erhält man aus Gleichungen Z4a und Z4b.
 Normieren von r1 und r2 nach unit length ergibt den scale factor lambda.
 r3  = r1 x r2.  Aus Gleichung Z2 entnehmen der tR-Spalte ergibt:

      lambda  m3  =  Mint  tR

 woraus tR bekannt ist.




>>> Zhang -- Verfeinerung 


 Genauso wie oben beschrieben, im Abschnitt "Verfeinerung der
 Kamera-parameters" für den nicht-planaren Fall, behandelt auch Zhang
 die auf diese weise "analytisch" erhaltenen Kamera-parameters nur als
 initial guess für ein Levenberg-Marquard refinement.

 Der Grund dafür ist auch bei Zhang genau der gleiche wie vorher, nämlich:
   
   (1) der Fehler || e || = || C b || der minimiert wird in der analytischen
       Methode ist eine arbiträre, nicht physisch sinvolle Größe;
   (2) die analytische Methode erlaubt keine Schätzung der radial distortion
       parameters.

 Das von Zhang benutzte nicht-linearen Levenberg-Marquard refinement
 geht genau wie im von mir oben beschriebenen nicht-planaren Fall:

    - Er benutzt während des refinements das volle (nicht linearisierte) 
      Kameramodell mit radial distortion (initial guess wieder: k1 = k2 = 0);

    - Während des refinements ist der error der minimiert wird wieder
      E = SUM_i [ d_i^2 ]  genau wie in Gleichung K3 (im Abschnitt
      "Verfeinerung der Kamera-parameters" oben).







---------------------------------------------------------------------------


Anmerkungen 
-----------


[note 1] Homogene Koordinaten:

      Hier kommt mir die Idee, über einen Trick ähnlich wie homogene
      Koordinaten auch die radial distortion Formeln zu "linearisieren".
      Vielleicht so:
  
          +-     -+     +-          -+             +-      -+
          |  xPV  |  =  |  alfa xPN  |    <---->   |  xPN   |
          |  xPV  |     |  alfa yPN  |             |  yPN   |
          +-     -+     +-          -+             |  alfa  |
                                                   +-      -+
     
          +-      -+      +-                  -+  +-     -+
          |  xPN   |      |  1  0  0   0   0   |  |  xPN  |
          |  yPN   |  =   |  0  1  0   0   0   |  |  yPN  |
          |  alfa  |      |  0  0  1   k1  k2  |  |   1   |
          +-      -+      +-                  -+  |  r^2  | 
                                                  |  r^4  |
                                                  +-     -+

      In Wöhler, Abschnitt 1.4.2. "The Direct Linear Transform Method"
      (p. 20) scheint eine Form dieser Idee angewendet zu werden.
      Ich habe leider noch keine Zeit gefunden, den Nutzen und
      Anwendbarkeit dieser Idee durchzuanalysieren.



[note 2] Braucht 6 Korrespondenzen:

      Dieser Kalibrier-Algorithmus braucht also eine Korrespondenz mehr
      als die 5 Korrespondenzen die am Anfang des Kapitels "KALIBRIERUNG"
      vorhergesagt wurden als das Minimum fürs Festlegen unserer 10
      Kamera-parameters.  Die 11 Freiheisgrade für die m_ij die wir in
      dem von mir hier beschriebenen Algorithmus alle füllen, werden
      reduziert zu den 10 unserer Kamera-parameters während wir am Ende
      des Abschnittes "Kalibrierung aus N Korrespondenzen, ohne radial
      distortion" die Kamera-parameters ableiten aus den m_ij und dabei
      die Rotationsmatrix R normalisieren.