camera_calibrationT_camera_calibrationCameraCalibrationCameraCalibrationcamera_calibration — Bestimmen aller Kameraparameter durch simultane Ausgleichsrechnung.
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration führt die Kalibrierung einer einzelnen Kamera
durch. Dazu werden bekannte 3D-Modellpunkte (mit Koordinaten
NXNXNXNXNXnx, NYNYNYNYNYny, NZNZNZNZNZnz) ins Bild projiziert und die
Summe der Abstandsquadrate zwischen den projizierten 3D-Koordinaten
und ihren korrespondierenden Bildpunktkoordinaten (NRowNRowNRowNRowNRownrow,
NColNColNColNColNColncol) minimiert.
Für eine erfolgreiche Kalibrierung wird mindestens ein
Kalibrierobjekt mit genau bekannten metrischen Abmessungen benötigt,
z.B. eine HALCON- Kalibrierplatte. Vor dem Aufruf von
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration nehmen Sie eine Serie von Bildern des
Kalibrierobjektes in unterschiedlichen Orientierungen auf, so dass
das gesamte Blickfeld bzw. Messvolumen ausgefüllt wird. Der Erfolg
der Kalibrierung hängt im hohen Maße von der Qualität der
Kalibrierbilder ab. Deshalb wird bei der Aufnahme der
Kalibrierbilder hohe Sorgfalt empfohlen. Für weitere Informationen
sei auf den Abschnitt „Wie nehme ich geeignete Bilder auf?'" in
Kalibrierung verwiesen.
Mit dem Eingabeparameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params kann angeben
werden, welche der gesuchten Kameraparameter tatsächlich bestimmt
werden sollen. Üblicherweise ist dieser Wert gleich 'all'"all""all""all""all""all",
d.h. alle 6 externen Kameraparameter (Translation und Rotation) und
alle internen Kameraparameter werden in der Ausgleichung
geschätzt. Falls die internen Parameter der Kamera bereits bekannt
sind (z.B. durch einen früheren Aufruf von
camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration), ist es oftmals ausreichend, lediglich
die 3D-Lage (Pose) des Weltkoordinatensystems in Kamerakoordinaten
zu bestimmen. In diesem Fall kann in EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params der
Wert 'pose'"pose""pose""pose""pose""pose" übergeben werden. Um denselben Effekt zu
erzielen, kann man als Alternative dem Parameter
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params auch alle zu bestimmenden Werte übergeben:
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params =
['alpha','beta','gamma','transx','transy','transz']["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"]["alpha","beta","gamma","transx","transy","transz"].
Andernfalls enthält EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params 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
auszuschließen. Die Werte
['pose','~transx']["pose","~transx"]["pose","~transx"]["pose","~transx"]["pose","~transx"]["pose","~transx"]
beispielsweise haben denselben Effekt wie
['alpha','beta','gamma','transy','transz']["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"]["alpha","beta","gamma","transy","transz"].
['all','~focus']["all","~focus"]["all","~focus"]["all","~focus"]["all","~focus"]["all","~focus"]
zum Beispiel schätzt alle internen und externen Parameter bis auf
die Brennweite. Mit Ausnahme von 'all'"all""all""all""all""all" kann das Präfix
'~' jedem Parameterwert vorangestellt werden.
Welche Beschränkungen bestehen bei der Bestimmung der
Kameraparameter?
Weiterführende Informationen über generelle Beschränkungen bei der
Bestimmung der Kameraparameter finden sich im Abschnitt
„Weitere Beschränkungen in Bezug auf spezifische Kameratypen'"
des Kapitels Kalibrierung.
Wie sieht die Reihenfolge der einzelnen Parameter
aus?
Die dadurch festgelegte Anzahl der Kalibrierbilder muss auch bei den
Tupeln mit den Koordinaten der 3D-Modellmarkenpunkte bzw. der
extrahierten 2D-Markenpunkte berücksichtigt werden. Bei einer
Anzahl von 15 Kalibrierbildern müssen daher die Tupel NRowNRowNRowNRowNRownrow
und NColNColNColNColNColncol 15 mal so viele Werte aufweisen wie die Tupel mit
den 3D-Modellmarkenpunkten (NXNXNXNXNXnx, NYNYNYNYNYny und
NZNZNZNZNZnz). Sind beispielsweise 49 Markenpunkte pro Bild
vorhanden, so haben die Tupel NRowNRowNRowNRowNRownrow und NColNColNColNColNColncol
jeweils die Länge , die Tupel
NXNXNXNXNXnx, NYNYNYNYNYny und NZNZNZNZNZnz haben dagegen die Länge 49.
Die Reihenfolge der Werte in NRowNRowNRowNRowNRownrow und NColNColNColNColNColncol 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.
Als weiterer Parameter wird der durchschnittliche Fehler
(ErrorsErrorsErrorsErrorserrorserrors) ausgegeben, mit welchem die erzielte Genauigkeit
der Kalibrierung abgeschätzt werden kann. Der Fehler
(Root-Mean-Square-Fehler der Position) wird in Pixel angegeben. Bei
der Kalibrierung von nur einer einzelnen Kamera ist ein Fehler in
der Größenordnung von 0.1 Pixel (der typische Detektionsfehler beim
Extrahieren der Koordinaten der projizierten Kalibrierkörpermarken)
ein Hinweis dafür, dass die Optimierung gut zu den Beobachtungsdaten
passt. Wenn der Fehler deutlich über 0.1 Pixel liegt, wurde die
Kalibrierung nicht gut ausgeführt. Die Gründe hierfür können z.B.
eine schlechte Bildqualität, eine unzureichende Anzahl an
Kalibrierbildern oder auch eine fehlerhafte Kalibrierplatte sein.
Muss man einen planaren Kalibrierkörper verwenden?
Es ist nicht nötig, einen planaren Kalibrierkörper zu
verwenden. Der Operator camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration ist so ausgelegt,
dass er mit den Eingabetupeln NXNXNXNXNXnx, NYNYNYNYNYny, NZNZNZNZNZnz,
NRowNRowNRowNRowNRownrow und NColNColNColNColNColncol beliebige 3D/2D-Korrespondenzen
verarbeiten kann. Der Aufbau der Parameter kann dem Abschnitt „Wie
sieht die Reihenfolge der einzelnen Parameter aus?“ entnommen
werden.
Es spielt daher prinzipiell keine Rolle, wie man die nötigen
3D-Modellmarkenpunkte und die korrespondierenden 2D-Markenpunkte
ermittelt. Somit ist es einerseits möglich, auch einen
3D-Kalibrierkörper zu verwenden. Andererseits kann man auch
beliebige markante Punkte (z.B. natürliche Landmarken) verwenden,
deren Positionen in der Welt bekannt sind. Falls man dann
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params auf 'pose'"pose""pose""pose""pose""pose" setzt, kann man auf
diese Weise mit camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration die Lage eines beliebigen
Objektes in Kamerakoordinaten ermitteln! Hierzu sind dann mindestens
drei 3D/2D-Korrespondenzen als Eingabe
anzugeben. NStartPoseNStartPoseNStartPoseNStartPoseNStartPosenstart_pose kann z.B. direkt über
create_posecreate_poseCreatePoseCreatePoseCreatePosecreate_pose generiert werden wie es im dazugehörigen
Programmbeispiel gezeigt wird.
Bei der Kalibrierung von Kameras mit Zeilensensor kann der Startwert für den
internen Kameraparameter Sy auf den den Wert 0.0 gesetzt werden. In diesem
Fall ist es allerdings nicht möglich, die Position des Bildhauptpunktes in
y-Richtung zu bestimmen. Im Eingabeparameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParamsestimate_params muss aus
diesem Grund explizit die y-Koordinate des Bildhauptpunktes ausgeschlossen
werden: '~cy'"~cy""~cy""~cy""~cy""~cy". Der effektive
Abstand des Bildhauptpunktes von der Sensorzeile ist dann immer
.
Weitere Informationen können dem Abschnitt „Weitere Beschränkungen in
Bezug auf spezifische Kameratypen'" in Kalibrierung
entnommen werden.
Ausführungsinformationen
Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
Sind die Parameterwerte korrekt und konnten die gesuchten
Kameraparameter durch das Bündelausgleichsverfahren bestimmt werden,
dann liefert camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibrationcamera_calibration den Wert
TRUE. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt