| Operatoren |
camera_calibration — Bestimmen aller Kameraparameter durch simultane Ausgleichsrechnung.
camera_calibration( : : NX, NY, NZ, NRow, NCol, StartCamParam, NStartPose, EstimateParams : CameraParam, NFinalPose, Errors)
camera_calibration führt die eigentliche Kalibrierung der Kamera durch. Dazu werden die bekannten 3D-Modellpunkte (mit Koordinaten NX, NY, NZ) ins Bild projiziert und die Summe der Abstandsquadrate zwischen den so gewonnenen Projektionen und ihren korrespondierenden Bildpunkten (mit Koordinaten NRow, NCol) minimiert.
Konvergiert dieses Bündelausgleichsverfahren, so sind damit die exakten internen (CameraParam) und externen (NFinalPose) Kameraparameter der Kamera bestimmt worden. Als Startwerte für das Ausgleichsverfahren dienen die Parameter StartCamParam und NStartPose. Da mit Hilfe dieses Operators Bild-Modell-Korrespondenzen simultan abgeglichen werden können, die aus unterschiedlichen Bildern stammen, wird dieses Verfahren auch als Multibildkalibrierung bezeichnet.
Ganz allgemein bedeutet Kamerakalibrierung, diejenigen Parameter exakt zu bestimmen, die die (optische) Abbildung eines beliebigen 3D-Weltpunktes p(w) im Raum auf ein (Sub-)Pixel [r,c] im Bild modellieren. Dies ist insbesondere von Bedeutung, wenn aus dem Kamerabild die ursprüngliche räumliche Lage von irgendwelchen Gegenständen im Bild bestimmt werden soll, beispielsweise bei der Vermessung von Werkstücken.
Die Abbildung besteht aus mehreren Schritten: Zuerst wird der Punkt p(w) vom Welt- in das Kamerakoordinatensystem transformiert (Punkte in Form von homogenen Vektoren, vgl. affine_trans_point_3d):
/ \ / x \ / \ / \ | p(c) | = | y | = | R t | * | p(w) | | | | z | | | | | \ 1 / \ 1 / \ 0 0 1 / \ 1 /
Dann wird der Punkt in die Bildebene, d.h. auf den Sensor-Chip projiziert.
Für die Modellierung dieses Abbildungsvorganges, der durch die Kombination von Kamera, Objektiv und Framegrabber festgelegt ist, stellt HALCON die folgenden drei 3D-Kameramodelle zur Verfügung:
Die Kombination einer Kamera mit Flächensensor mit einem zentralperspektivisch abbildenden Objektiv, das radiale und tangentiale Verzeichnung aufweisen kann.
Die Kombination einer Kamera mit Flächensensor mit einem telezentrischen, also parallel abbildenden Objektiv, das radiale und tangentiale Verzeichnung aufweisen kann.
Die Kombination einer Kamera mit Zeilensensor mit einem zentralperspektivisch abbildenden Objektiv, das radiale Verzeichnung aufweisen kann.
Für Kameras mit Flächensensor besteht der Abbildungsvorgang des in Kamerakoordinaten gegebenen Punktes p(c) auf ein (Sub-)Pixel [r,c] im Bild aus den folgenden Schritten: Zuerst wird der Punkt in die Bildebene, d.h. auf den Sensor-Chip projiziert. Falls als Kameramodell das einer Lochkamera mit Flächensensor verwendet wird, d.h. falls die Brennweite in CameraParam mit einem Wert größer als 0 übergeben wurde, wird die Projektion mit den folgenden Gleichungen beschrieben:
/ x \
p(c) = | y |
\ z /
u = Focus * x / z
v = Focus * y / z
Falls die Brennweite in CameraParam als 0 übergeben wird, wird als Kameramodell eine telezentrische Kamera mit Flächensensor verwendet, d.h. es wird angenommen, dass die Optik des Kameraobjektives eine Parallelprojektion der Weltpunkte durchführt. Die entsprechenden Gleichungen sind dann:
/ x \
p(c) = | y |
\ z /
u = x
v = y
Für beide Kameraarten mit Flächensensor kann die Verzeichnung entweder mit dem Divisionsmodell oder mit dem Polynommodell modelliert werden. Das Divisionsmodell verwendet einen Parameter (Kappa), um die radiale Verzeichnung zu modellieren.
Die folgenden Gleichungen werden verwendet, um mit Hilfe des Divisionsmodells die in der Bildebene gegebenen verzeichneten Koordinaten in Koordinaten ohne Verzeichnungen zu transformieren:
u = u' / (1+Kappa*(u'^2+v'^2) v = v' / (1+Kappa*(u'^2+v'^2)
Diese Gleichungen lassen sich analytisch invertieren. Dies führt zu den folgenden Gleichungen, die dazu verwendet werden, mit Hilfe des Divisionsmodells an Koordinaten ohne Verzeichnungen die Verzeichnung anzubringen:
u' = (2*u) / (1+sqrt(1-4*Kappa*(u^2+v^2))) v' = (2*v) / (1+sqrt(1-4*Kappa*(u^2+v^2)))
Das Polynommodell verwendet drei Parameter (K1, K2, K3), um die radiale Verzeichnung zu modellieren und zwei Parameter (P1, P2), um die tangentiale Verzeichnung zu modellieren. Die folgenden Gleichungen werden verwendet, um mit Hilfe des Polynommodells die in der Bildebene gegebenen verzeichneten Koordinaten in Koordinaten ohne Verzeichnungen zu transformieren:
u = u' + u'*(K1*r^2 + K2*r^4 + K3*r^6) +
2*P1*u'*v' + P2*(r^2 + 2*u'^2)
v = v' + v'*(K1*r^2 + K2*r^4 + K3*r^6) +
P1*(r^2 + 2*v'^2) + 2*P2*u'*v'
with: r = sqrt(u'^2+v'^2)
Diese Gleichungen sind nicht analytisch invertierbar. Daher müssen die verzeichneten Koordinaten numerisch aus den Koordinaten ohne Verzeichnungen bestimmt werden.
Welches der beiden Verzeichnungsmodelle verwendet wird, hängt von der Anzahl der Werte ab, die im Parameter StartCamParam übergeben werden: Wenn StartCamParam 8 Werte enthält, wird das Divisionsmodell verwendet. Wenn StartCamParam 12 Werte enthält, wird das Polynommodell verwendet.
Zum Schluss wird der Punkt vom Koordinatensystem der Bildebene ins Pixelkoordinatensystem transformiert:
c = u' / Sx + Cx
r = v' / Sy + Cy
Für Kameras mit Zeilensensor muss auch die Relativbewegung zwischen Kamera und Objekt modelliert werden. In HALCON werden hierzu die folgenden Annahmen getroffen:
Die Kamera bewegt sich mit konstanter Geschwindigkeit entlang einer Geraden.
Die Orientierung der Kamera ist konstant.
Die Relativbewegung ist für alle Bilder gleich.
Diese Bewegung wird durch den Bewegungsvektor V = (Vx,Vy,Vz) beschrieben. Dieser Vektor muss in der Einheit [Meter/Bildzeile] im Kamerakoordinatensystem gegeben sein. Er beschreibt die Bewegung der Kamera in Bezug auf ein unbewegtes Objekt. Dies ist äquivalent zu der Annahme einer unbewegten Kamera und einem Objekt, das sich entlang -V bewegt.
Das Kamerakoordinatensystem ist für Kameras mit Zeilensensor folgendermaßen definiert. Der Ursprung liegt im Projektionszentrum. Die z-Achse ist mit der optischen Achse identisch und ist so orientiert, dass alle Punkte, die von der Kamera aus sichtbar sind, positive z-Koordinaten haben. Die y-Achse ist senkrecht zur Sensorzeile und zur z-Achse. Sie ist so orientiert, dass der Bewegungsvektor eine positive y-Komponente hat. Die x-Achse ist senkrecht zur y- und z-Achse. Sie ist so orientiert, dass x-, y- und z-Achse ein rechtshändiges Koordinatensystem bilden.
Da sich die Kamera während der Bildaufnahme über das Objekt bewegt, bewegt sich auch das Kamerakoordinatensystem relativ zum Objekt. Das bedeutet, dass jede Bildzeile von einer anderen Position aus aufgenommen wird, dass es also prinzipiell für jede Bildzeile eine eigene Pose gibt. Zur Vereinfachung beziehen sich in HALCON alle Transformationen zwischen Weltkoordinaten und Kamerakoordinaten auf die Pose der ersten Bildzeile. Die Bewegung V wird bei der Projektion des Punktes p(c) in das Bild berücksichtigt. Infolgedessen wird von den Operatoren find_marks_and_pose und camera_calibration auch nur die Pose der ersten Bildzeile zurückgegeben.
Für Lochkameras mit Zeilensensor ist die Abbildung des Punktes p(c), der im Kamerakoordinatensystem der ersten Bildzeile gegeben ist, auf ein (Sub-)Pixel [r,c] im Bild folgendermaßen definiert:
Mit
/ x \
p(c) = | y |,
\ z /
muss das folgende Gleichungssystem nach m, u' und t aufgelöst werden:
m * D * u' = x - t * Vx
-m * D * pv = y - t * Vy
m * Focus = z - t * Vz
mit
1
D = -----------------------
1 + Kappa*(u'*u' + pv*pv)
pv = Sy*Cy
Dies beinhaltet bereits die Kompensation der radialen Verzeichnung. Für Lochkameras mit Zeilensensor ist nur das Divisionsmodell verfügbar.
Zum Schluss wird der Punkt ins Pixelkoordinatensystem transformiert:
c = u' / Sx + Cx
r = t
Innerhalb der insgesamt 14 bzw. 18 Kameraparameter für Kameras mit Flächensensor (abhängig von dem verwendeten Verzeichnungsmodell) bzw. der 17 Kameraparameter für Kameras mit Zeilensensor unterscheidet man zwischen internen und externen Kameraparametern:
Sie beschreiben die Beschaffenheit der verwendeten Kamera und beschreiben somit vor allem die interne Sensorgröße und die Abbildungseigenschaften der verwendeten Kombination von Objektiv, Kamera und Framegrabber.
Für Kameras mit Flächensensor sind das gemäß dem oben beschriebenen Kameramodell die folgenden Parameter (8 Parameter wenn die Verzeichnung mit dem Divisionsmodell modelliert wird und 12 Parameter wenn das Polynommodell verwendet wird):
Brennweite des Objektivs. 0 für telezentrische Objektive. newline Entweder:
Verzeichnungskoeffizient zur Modellierung der radialen Verzeichnung mit dem Divisionsmodell (wegzulassen, wenn das Polynommodell verwendet wird). newline Oder:
Verzeichnungskoeffizienten zur Modellierung der radialen und tangentialen Verzeichnung mit dem Polynommodell (wegzulassen, wenn das Divisionsmodell verwendet wird).
Skalierungsfaktor. Entspricht bei Lochkameras dem horizontalen Abstand zweier benachbarter Zellen auf dem Sensor und bei telezentrischen Kameras der horizontalen Pixelgröße in Weltkoordinaten. Vorsicht: Bei Unterabtastung des Bildes erhöht sich dieser Wert!
Skalierungsfaktor. Entspricht bei Lochkameras dem vertikalen Abstand zweier benachbarter Zellen auf dem Sensor und bei telezentrischen Kameras der vertikalen Pixelgröße in Weltkoordinaten. Da in der Regel das Bildsignal zeilensynchron ausgelesen wird, ist dieser Wert durch die Größe des Sensors exakt festgelegt und muss daher bei Lochkameras nicht durch die Kalibrierung bestimmt werden. Vorsicht: Bei Unterabtastung des Bildes erhöht sich dieser Wert!
Spaltenkoordinate des Kamerahauptpunktes (optisches Zentrum der radialen Verzeichnung).
Zeilenkoordinate des Kamerahauptpunktes (optisches Zentrum der radialen Verzeichnung).
Breite des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes erniedrigt sich dieser Wert!
Höhe des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes erniedrigt sich dieser Wert!
Für Kameras mit Zeilensensor sind das gemäß dem oben beschriebenen Kameramodell die folgenden 11 Parameter:
Brennweite des Objektivs.
Verzeichnungskoeffizient zur Modellierung der radialen Verzeichnung mit dem Divisionsmodell.
Skalierungsfaktor, entspricht dem horizontalen Abstand zweier benachbarter Zellen auf der Sensorzeile. Vorsicht: Bei Unterabtastung des Bildes erhöht sich dieser Wert!
Skalierungsfaktor, der im Rahmen der Kalibrierung nur in der Form pv = Sy*Cy auftritt. pv beschreibt den Abstand des Kamerahauptpunktes von der Sensorzeile in der Einheit [Meter]. Vorsicht: Bei Unterabtastung des Bildes erhöht sich der Wert von Sy!
Spaltenkoordinate des Kamerahauptpunktes (optisches Zentrum der radialen Verzeichnung).
Abstand des Kamerahauptpunktes (optisches Zentrum der radialen Verzeichnung) von der Sensorzeile in der Einheit [Bildzeilen].
Breite des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes erniedrigt sich dieser Wert!
Höhe des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes erniedrigt sich dieser Wert!
X-Komponente des Bewegungsvektors.
Y-Komponente des Bewegungsvektors.
Z-Komponente des Bewegungsvektors.
Bitte beachten Sie, dass die Bezeichnung Focus im Allgemeinen nicht der realen Brennweite entspricht, wenn die Objektweite nicht unendlich ist. Der Einfachheit halber wird hier aber nicht zwischen Brennweite und Bildweite unterschieden.
Bitte beachten Sie, dass für alle Operatoren, die Kameraparameter als Eingabe verwenden, die Werte der Kameraparameter geprüft werden, ob sie die folgenden Restriktionen erfüllen:
Sx > 0
Sy >= 0
Focus >= 0
ImageWidth > 0
ImageHeight > 0
Für manche Operatoren gibt es kleine Unterschiede in den Restriktionen. Im Speziellen für Operatoren, die Kameras mit telezentrischem Objektiv nicht unterstützen gilt folgende Restriktion:
Focus > 0
Für Operatoren, die Lochkameras mit Zeilensensor nicht unterstützen, gelten folgende Restriktionen:
Sy > 0
Vx^2+Vy^2+Vz^2 != 0
Diese 6 Parameter beschreiben die 3D-Lage (Pose) des Welt- relativ zum Kamerakoordinatensystems. Bei Kameras mit Zeilensensor bezieht sich die Pose des Weltkoordinatensystems auf das Kamerakoordinatensystem der ersten Bildzeile. Drei Parameter beschreiben die Position, drei die Orientierung (siehe create_pose für mehr Informationen). camera_calibration verarbeitet alle verschieden Darstellungstypen für NStartPose.
Bei Benutzung der Standard-Kalibrierplatte definiert deren Koordinatensystem das Weltkoordinatensystem. Es ist im Mittelpunkt der Kalibrierkörperoberfläche platziert, die z-Achse zeigt in den Kalibrierkörper hinein, die x-Achse nach rechts und die y-Achse nach unten.
Die folgenden Abschnitte befassen sich jeweils mit einzelnen Fragen, die sich bei der Verwendung von camera_calibration stellen und sollen daher sowohl dem Verständnis als auch als Leitfaden für die eigene Anwendung dienen.
Die wohl einfachste Methode, die internen Kameraparameter einer Kamera zu ermitteln, ist die Verwendung der Standard-Kalibrierplatte, wie ihn der Operator gen_caltab erzeugt. Hochgenaue Kalibrierkörper können Sie in verschiedenen Größen und Materialien über Ihren lokalen HALCON-Vertrieb erhalten. Für den Nahbereich der Kamera genügt es vielleicht sogar, diesen Kalibrierkörper auf einem DIN A4 Laserdrucker auszugeben und auf einen festen Pappkarton aufzuziehen. Für den Fernbereich -- insbesondere bei der Verwendung eines Weitwinkelobjektivs -- wird so ein Kalibrierkörper zu klein sein. Hier bietet es sich an, die PostScript-Datei auf einem großformatigen Tintenstrahldrucker ausgeben und anschließend z.B. auf Aluminium aufziehen zu lassen. Wichtig ist dabei vor allem, dass die Koordinaten der Marken in der Kalibrierkörperbeschreibungsdatei so genau wie möglich mit dem wirklichen Kalibrierkörper übereinstimmen. Daher sollte unbedingt der gedruckte Kalibrierkörper nachgemessen und die Kalibrierkörperbeschreibungsdatei entsprechend modifiziert werden!
Ist eine Standard-Kalibrierplatte vorhanden, so kann folgendermaßen vorgegangen werden: Mit der zu kalibrierenden Kombination aus Objektiv (mit definierter Entfernungseinstellung), Kamera und Framegrabber wird der Kalibrierkörper aufgenommen, vgl. open_framegrabber bzw. grab_image. Dabei sollte folgendes berücksichtigt werden:
Insgesamt sollten mindestens 10 bis 20 Bilder zur Verfügung stehen.
Der Kalibrierkörper muss jeweils komplett (inkl. Rand!) im Bild sein.
Es sollten keine Reflexionen o.ä. auf dem Kalibrierkörper sein.
Innerhalb der Menge von Bildern sollte der Kalibrierkörper jeweils unterschiedlich im Bild erscheinen: Mal links im Bild, mal rechts, mal (links bzw. rechts) unten, mal (links bzw. rechts) oben, und das ganze aus verschiedenen Entfernungen. Dabei sollte der Kalibrierkörper am besten jeweils leicht bis mittel verdreht um seine x- und/oder y-Achse gehalten werden, so dass die perspektivische Verzerrung der Kalibrierkörpermarken gut sichtbar ist. Die jeweiligen externen Kameraparameter (Lage der Kamera bzgl. dem Kalibrierkörper) sollen also viele verschiedene Werte annehmen!
Der Kalibrierkörper sollte jeweils mindestens etwa ein Viertel des gesamten Bildes ausfüllen, damit die Marken robust detektiert werden können.
Im Falle der Verwendung der Standard-Kalibrierplatte können mit Hilfe der Operatoren find_caltab und find_marks_and_pose für jedes einzelne aufgenommene Bild die Koordinaten der Kalibrierkörpermarkenmittelpunkte sowie eine grobe Schätzung der externen Kameraparameter bestimmt werden. Die Konkatenation dieser Werte kann dann direkt als Startwert für die externen Kameraparameter (NStartPose) für camera_calibration verwendet werden.
Diejenigen Bilder, auf denen die Suche nach dem Kalibrierkörper (find_caltab) gescheitert ist bzw. für die der Operator find_marks_and_pose nicht die Markenpunkte detektieren konnte, sollten natürlich nicht in die Eingabeparameter von camera_calibration eingehen.
Für Kameras mit Flächensensor stehen zwei unterschiedliche Verzeichnungsmodelle zur Verfügung: das Divisionsmodell und das Polynommodell. Das Divisionsmodell verwendet einen Parameter, um die radiale Verzeichnung zu modellieren, während das Polynommodell fünf Parameter verwendet, um die radiale Verzeichnung und die tangentiale Verzeichnung zu modellieren (siehe oben).
Der Vorteil des Divisionsmodells ist, dass die Korrektur der Verzeichnung schneller ist, insbesondere, wenn Weltkoordinaten in ein verzeichnetes Bild projiziert werden und die Verzeichnung somit in der umgekehrten Richtung angebracht werden muss. Desweiteren liefert das Divisionsmodell typischerweise stabilere Ergebnisse, wenn nur wenige Kalibrierbilder verwendet werden oder das Sichtfeld nicht ausreichend durch Kalibrierkörper abgedeckt ist. Der Hauptvorteil des Polynommodells ist, dass es die Verzeichnung genauer modellieren kann, weil einerseits Terme höherer Ordnung zur Modellierung der radialen Verzeichnung verwendet werden und andererseits auch die tangentiale Verzeichnung modelliert wird.
Normalerweise sollte das Divisionsmodell für die Kalibrierung verwendet werden. Reicht die Genauigkeit der Kalibrierung nicht aus, kann das Polynommodell verwendet werden. Hierbei ist dann aber darauf zu achten, dass durch die Folge von Kalibrierbildern das gesamte Gebiet abgedeckt werden muss, in dem später gemessen werden soll. Die Verzeichnungskorrektur kann außerhalb des Gebietes, das durch Kalibrierkörper abgedeckt ist, fehlerhaft sein. Dies gilt sowohl für die Bildränder als auch für Bereiche innerhalb des Bildes, die nicht durch einen Kalibrierkörper abgedeckt sind.
Der Operator find_marks_and_pose zur Ermittlung von Startwerten für die externen Kameraparameter (NStartPose) sowie der Operator camera_calibration benötigen Startwerte für die internen Kameraparameter. Diese können in einem geeigneten Format als Datei zur Verfügung stehen (siehe read_cam_par). Eine solche Datei kann entweder durch den Operator write_cam_par erzeugt oder auch per Hand editiert werden.
Bei Kameras mit Flächensensor gilt für die Startwerte der einzelnen Parameter folgendes:
Startwert ist gleich der nominalen Brennweite des verwendeten Objektivs, also beispielsweise 0.008,m. newline Entweder:
Als Startwert den Wert 0.0 verwenden (wegzulassen, wenn das Polynommodell verwendet wird). newline Oder: Als Startwert für jeden der fünf Parameter 0.0 verwenden (wegzulassen, wenn das Divisionsmodell verwendet wird).
Der Startwert für den horizontalen Abstand zweier benachbarter Zellen hängt von der Größe des Chips in der Kamera ab (vgl. technische Daten der Kamera). Man unterscheidet dabei zwischen 1/3"-Chips (z.B. SONY XC-73, SONY XC-777), 1/2"-Chips (z.B. SONY XC-999, Panasonic WV-CD50) und 2/3"-Chips (z.B. SONY DXC-151, SONY XC-77). Hinweise: Bei Unterabtastung des Bildes erhöht sich der Wert für Sx entsprechend! Geeignete Startwerte sind z.B.: begin(verbatim) Vollbild (768*576) Unterabtastung (384*288) 1/3"-Chip 0.0000055 m 0.0000110 m 1/2"-Chip 0.0000086 m 0.0000172 m 2/3"-Chip 0.0000110 m 0.0000220 m end(verbatim) Der Wert für Sx wird kalibriert, da das Videosignal einer Kamera in der Regel nicht pixelsynchron abgetastet wird.
Da die handelsüblichen Kameras annähernd quadratische Pixel haben, gelten für Sy dieselben Werte wie für Sx. Der Wert für Sy wird normalerweisefür Lochkameras NICHT kalibriert, da das Videosignal einer Kamera in der Regel zeilensynchron abgetastet wird und somit der Startwert gleich dem gesuchten endgültigen Wert entspricht. Geeignete Startwerte sind: begin(verbatim) Vollbild (768*576) Unterabtastung (384*288) 1/3"-Chip 0.0000055 m 0.0000110 m 1/2"-Chip 0.0000086 m 0.0000172 m 2/3"-Chip 0.0000110 m 0.0000220 m end(verbatim)
Startwerte für die Koordinaten des Kamerahauptpunktes sind die halbe Bildbreite bzw. -höhe. Hinweis: Bei Unterabtastung des Bildes verringern sich die Werte entsprechend! Geeignete Startwerte sind: begin(verbatim) Vollbild (768*576) Unterabtastung (384*288) Cx 384.0 192.0 Cy 288.0 144.0 end(verbatim)
Diese beiden Parameter werden durch die Framegrabberanbindung gesetzt und werden daher natürlich nicht kalibriert. Geeignete Startwerte sind: begin(verbatim) Vollbild (768*576) Unterabtastung (384*288) ImageWidth 768 384 ImageHeight 576 288 end(verbatim)
Bei Kameras mit Zeilensensor gilt für die Startwerte der einzelnen Parameter folgendes:
Startwert ist gleich der nominalen Brennweite des verwendeten Objektivs, also beispielsweise 0.008,m.
Als Startwert den Wert 0.0 verwenden.
Der Startwert für den Abstand zweier benachbarter Zellen kann den technischen Daten der Kamera entnommen werden. Typische Startwerte sind 7e-6 m, 10e-6 m und 14e-6 m. Hinweise: Bei Unterabtastung des Bildes erhöht sich der Wert für Sx entsprechend!
Der Startwert für die Größe einer Zelle senkrecht zur Richtung der Sensorzeile kann ebenfalls den technischen Daten der Kamera entnommen werden. Typische Startwerte sind 7e-6 m, 10e-6 m und 14e-6 m. Der Wert für Sy wird für Zeilenkameras NICHT kalibriert, da er ausschließlich in der Form pv = Sy*Cy auftritt und daher nicht getrennt von Cy bestimmt werden kann.
Der Startwert für die x-Koordinate des Kamerahauptpunktes ist die halbe Bildbreite, d.h. die halbe Anzahl von Pixeln des Zeilensensors. Hinweis: Bei Unterabtastung des Bildes verringern sich der Wert für Cx entsprechend! Geeignete Startwerte sind: begin(verbatim) Bildbreite: 1024 2048 4096 8192 Cx: 512 1024 2048 4096 end(verbatim)
Der Startwert für die y-Koordinate des Kamerahauptpunktes ist normalerweise 0.
Diese beiden Parameter werden durch die Framegrabberanbindung gesetzt und werden daher nicht kalibriert.
Die Startwerte für die x-, y- und z-Komponente des Bewegungsvektors hängen vom Aufbau des gesamten Aufnahmesystems ab. Blickt die Kamera beispielsweise senkrecht auf ein Fließband, und ist dabei so um ihre optische Achse gedreht, dass die Sensorzeile senkrecht zur Bewegungsrichtung des Fließbandes steht, dass also die y-Achse des Kamerakoordinatensystems parallel zur Bewegungsrichtung des Fließbandes ausgerichtet ist, so sind die Startwerte Vx = Vz = 0. Der Startwert für Vy lässt sich dann aus der Aufnahme eines Objektes dessen Größe bekannt ist (z.B. Kalibrierplatte, Lineal) folgendermaßen bestimmen:
Vy = LM / LR Mit:LM = Länge des Objektes in Bewegungsrichung in Objektkoordinaten [Meter] LR = Länge des Objektes in Bewegungsrichtung in Bildkoordinaten (Bildzeilen]
Wird die Kamera gegenüber diesem Aufbau z.B. um 30 Grad um die optische Achse, also die z-Achse des Kamerakoordinatensystems gedreht, so sind die oben bestimmten Startwerte folgendermaßen zu verändern:
Vx_rot_z & = & sin(30) * Vy
Vy_rot_z & = & cos(30) * Vy
Vz_rot_z & = & Vz = 0
Wenn die Kamera gegenüber dem ursprünglichen Aufbau z.B. um -20 Grad um die x-Achse des Kamerakoordinatensystems gedreht wird, so ergeben sich folgende Startwerte:
Vx_rot_x & = & Vx = 0
Vy_rot_x & = & cos(20) * Vy
Vz_rot_x & = & sin(20) * Vy
Die Qualität der Startwerte für Vx, Vy und Vz ist entscheidend für den Erfolg der gesamten Kalibrierung. Werden zu schlechte Startwerte verwendet, kann dies zum Abbruch der Kamerakalibrierung führen.
Mit dem Eingabeparameter EstimateParams kann man angeben, welche der gesuchten Kameraparameter geschätzt werden sollen. Üblicherweise ist dieser Wert gleich 'all', d.h. alle 6 externen Kameraparameter (Translation und Rotation) und alle internen Kameraparameter werden bestimmt. Falls die internen Parameter schon bestimmt worden sind (z.B. durch einen früheren Aufruf von camera_calibration), ist es oftmals interessant, lediglich die 3D-Lage (Pose) des Weltkoordinatensystems in Kamerakoordinaten zu bestimmen. In diesem Fall kann in EstimateParams der Wert 'pose' übergeben werden. Dies hat denselben Effekt wie EstimateParams = ['alpha','beta','gamma','transx','transy','transz']. Andernfalls enthält EstimateParams ein Tupel von Strings, die die Kombination von Parametern, die geschätzt werden soll, enthält. Es ist auch möglich, Parameter die nicht geschätzt werden sollen über ein vorgesetztes '~' Zeichen im String auszuschießen. Die Werte ['pose','~transx'] beispielsweise haben denselben Effekt wie ['alpha','beta','gamma','transy','transz']. ['all','~focus'] zum Beispiel schätzt alle internen und externen Parameter bis auf die Brennweite. Das '~' Präfix kann mit Ausnahme von 'all' jedem Parameterwert vorangestellt werden.
Die Länge des Tupels NStartPose korrespondiert mit der Anzahl der Kalibrierungsbilder, d.h. werden beispielsweise 15 Aufnahmen eines Kalibrierkörpers verwendet, so ergibt sich die Länge des Tupels NStartPose zu 15*7=105 (15 mal je 7 externe Kameraparameter). Die ersten 7 Werte entsprechen daher der Lage des Kalibrierkörpers im 1. Bild, die nächsten 7 derjenigen im 2. Bildes usw.
Die dadurch festgelegte Anzahl Kalibrierungsbilder muss auch bei den Tupeln mit den Koordinaten der 3D-Modellmarkenpunkte bzw. der extrahierten 2D-Markenpunkte berücksichtigt werden. Bei einer Anzahl von 15 Kalibrierungsbildern müssen daher die Tupel NRow und NCol 15-mal so viele Werte aufweisen wie die Tupel mit den 3D-Modellmarkenpunkten (NX, NY und NZ). Sind beispielsweise 49 Markenpunkte pro Bild vorhanden, so haben die Tupel NX, NY und NZ jeweils die Länge 15*49=735, die Tupel NRow und NCol haben dagegen die Länge 49. Die Reihenfolge der Werte in NRow und NCol erfolgt dabei bildweise, d.h. bei 49 Marken korrespondiert der erste 3D-Modellpunkt mit dem 1., 50., 99., 148., 197., 246. etc. extrahierten 2D-Markenpunkt.
Die 3D-Modellpunkte können mit dem Operator caltab_points aus einer Kalibrierkörperbeschreibungsdatei gelesen werden. Startwerte für die Lagen des Kalibrierkörpers können für jedes betrachtete Bild mit dem Operator find_marks_and_pose ermittelt werden. Das Tupel NStartPose ergibt sich dann als Konkatenation dieser einzelnen Kameralagen.
Falls die Kamerakalibrierung erfolgreich verlaufen ist, d.h. das Bündelausgleichsverfahren konvergiert ist, sind in den Ausgabeparametern CameraParam und NFinalPose die auf diese Weise ermittelten genauen Werte für die internen und externen Kameraparameter enthalten. Die Länge des Tupels NFinalPose entspricht dann derjenigen von NStartPose.
Die Darstellungstypen von NFinalPose entsprechen dem Darstellungstyp der des ersten Tupels aus NStartPose (siehe create_pose). Der Darstellungstyp kann jedoch mit convert_pose_type gewandelt werden.
Anhand des durchschnittlichen Fehlers (Errors) kann die erzielte Genauigkeit der Kalibrierung abgeschätzt werden. Der Fehler (Root-Mean-Square-Fehler der Position) wird in Pixel angegeben.
Nein. Der Operator camera_calibration ist so ausgelegt, dass er mit den Eingabetupeln NX, NY, NZ, NRow und NCol beliebige 3D/2D-Korrespondenzen erhält, vgl. obigen Abschnitt über die Länge von NStartPose.
Es ist daher prinzipiell egal, wie man auf die nötigen 3D-Modellmarkenpunkte und die korrespondierenden extrahierten 2D-Markenpunkte ermittelt hat. Somit ist es einerseits möglich, auch einen 3D-Kalibrierkörper zu verwenden. Andererseits kann man auch beliebige markante Punkte (natürliche Landmarken) verwenden, deren Position in der Welt bekannt sind. Falls man dann EstimateParams auf 'pose' setzt, kann man diese Weise mit camera_calibration die Lage eines beliebigen Objektes in Kamerakoordinaten ermitteln! Hierzu sind dann mindestens drei 3D/2D-Korrespondenzen als Eingabe anzugeben. NStartPose kann z.B. direkt über create_pose generiert werden, vgl. auch Programmbeispiel dort.
Die Ausgleichsrechnung der Kalibrierung hängt von den Startwerten für die internen (StartCamParam) und externen (NStartPose) Kameraparameter ab. Anhand der zurückgegebenen durchschnittlichen Fehler (Errors) kann die Genauigkeit der Kalibrierung abgeschätzt werden. Die Fehler (Abweichungen in x- und y-Koordinate) werden in Pixel angegeben.
Bei der Kalibrierung von Kameras mit Zeilensensor ist es möglich, als Startwert für den internen Kameraparameter Sy den Wert 0.0 zu verwenden. In diesem Fall ist es allerdings nicht möglich, die Position des Bildhauptpunktes in y-Richtung zu bestimmen. Daher muss EstimateParams den Term '~cy' enthalten. Der effektive Abstand des Bildhauptpunktes von der Sensorzeile ist dann immer pv = Sy*Cy = 0.0.
Geordnetes Tupel mit allen x-Koordinaten der Kalibriermarken (in Meter).
Geordnetes Tupel mit allen y-Koordinaten der Kalibriermarken (in Meter).
Geordnetes Tupel mit allen z-Koordinaten der Kalibriermarken (in Meter).
Geordnetes Tupel mit allen Zeilen-Koordinaten der extrahierten Kalibriermarken (in Pixel).
Geordnetes Tupel mit allen Spalten-Koordinaten der extrahierten Kalibriermarken (in Pixel).
Startwerte für die internen Kameraparameter.
Parameteranzahl: StartCamParam == 8 || StartCamParam == 11 || StartCamParam == 12
Geordnetes Tupel mit allen Startwerten der externen Kameraparameter.
Zu schätzenden Kameraparameter.
Defaultwert: 'all'
Werteliste: 'all', 'alpha', 'beta', 'camera', 'cx', 'cy', 'focus', 'gamma', 'kappa', 'poly', 'poly_rad_2', 'poly_rad_4', 'poly_rad_6', 'poly_tan_2', 'pose', 'sx', 'sy', 'transx', 'transy', 'transz', 'vx', 'vy', 'vz'
Interne Kameraparameter.
Geordnetes Tupel mit allen externen Kameraparametern.
Durchschnittlicher Fehler in Pixel.
* read calibration images
read_image(Image1, 'calib-01')
read_image(Image2, 'calib-02')
read_image(Image3, 'calib-03')
* find calibration pattern
find_caltab(Image1, Caltab1, 'caltab.descr', 3, 112, 5)
find_caltab(Image2, Caltab2, 'caltab.descr', 3, 112, 5)
find_caltab(Image3, Caltab3, 'caltab.descr', 3, 112, 5)
* find calibration marks and start poses
find_marks_and_pose(Image1, Caltab1, 'caltab.descr', \
[0.008, 0.0, 0.000011, 0.000011, 384, 288, 768, 576], \
128, 10, 18, 0.9, 15.0, 100.0, RCoord1, CCoord1, \
StartPose1)
find_marks_and_pose(Image2, Caltab2, 'caltab.descr', \
[0.008, 0.0, 0.000011, 0.000011, 384, 288, 768, 576], \
128, 10, 18, 0.9, 15.0, 100.0, RCoord2, CCoord2, \
StartPose2)
find_marks_and_pose(Image3, Caltab3, 'caltab.descr', \
[0.008, 0.0, 0.000011, 0.000011, 384, 288, 768, 576], \
128, 10, 18, 0.9, 15.0, 100.0, RCoord3, CCoord3, \
StartPose3)
* read 3D positions of calibration marks
caltab_points('caltab.descr', NX, NY, NZ)
* camera calibration
camera_calibration(NX, NY, NZ, [RCoord1, RCoord2, RCoord3], \
[CCoord1, CCoord2, CCoord3], \
[0.008, 0.0, 0.000011, 0.000011, 384, 288, 768, 576], \
[StartPose1, StartPose2, StartPose3], 'all', \
CameraParam, NFinalPose, Errors)
* write internal camera parameters to file
write_cam_par(CameraParam, 'campar.dat')
Sind die Parameterwerte korrekt und konnten die gesuchten Kameraparameter durch das Bündelausgleichsverfahren bestimmt werden, dann liefert camera_calibration den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt
find_marks_and_pose, caltab_points, read_cam_par
write_pose, pose_to_hom_mat3d, disp_caltab, sim_caltab
find_caltab, find_marks_and_pose, disp_caltab, sim_caltab, write_cam_par, read_cam_par, create_pose, convert_pose_type, write_pose, read_pose, pose_to_hom_mat3d, hom_mat3d_to_pose, caltab_points, gen_caltab, calibrate_cameras
Calibration
| Operatoren |