camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibration führt die Kalibrierung einer einzelnen Kamera
durch. Dazu werden bekannte 3D-Modellpunkte (mit Koordinaten
NXNXNXNXNX, NYNYNYNYNY, NZNZNZNZNZ) ins Bild projiziert und die
Summe der Abstandsquadrate zwischen den projizierten 3D-Koordinaten
und ihren korrespondierenden Bildpunktkoordinaten (NRowNRowNRowNRowNRow,
NColNColNColNColNCol) 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_calibrationCameraCalibrationCameraCalibrationCameraCalibration 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.
Nach erfolgreicher Kalibrierung gibt camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibration die
optimierten internen (CameraParamCameraParamCameraParamCameraParamcameraParam) und externen
(NFinalPoseNFinalPoseNFinalPoseNFinalPoseNFinalPose )
Kameraparameter der Kamera zurück. Zusätzlich
liefert er die Wurzel des mittleren quadratischen
Rückprojektionsfehlers (RMSE) der Optimierung im Parameter
ErrorsErrorsErrorsErrorserrors (in Pixel) zurück. Dieser Fehler gibt einen
allgemeinen Hinweis darauf, ob die Optimierung erfolgreich war.
Hinweise zur Kalibrierung
Wie extrahiert man die Markenmittelpunkte aus den
Bildern?
Mit dem Eingabeparameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams kann angeben
werden, welche der gesuchten Kameraparameter tatsächlich bestimmt
werden sollen. Üblicherweise ist dieser Wert gleich '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_calibrationCameraCalibrationCameraCalibrationCameraCalibration), ist es oftmals ausreichend, lediglich
die 3D-Lage (Pose) des Weltkoordinatensystems in Kamerakoordinaten
zu bestimmen. In diesem Fall kann in EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams der
Wert 'pose'"pose""pose""pose""pose" übergeben werden. Um denselben Effekt zu
erzielen, kann man als Alternative dem Parameter
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams auch alle zu bestimmenden Werte übergeben:
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams =
['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 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams 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"]
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"].
['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" 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 Länge des Tupels NStartPoseNStartPoseNStartPoseNStartPoseNStartPose korrespondiert mit der
Anzahl der Kalibrierbilder, d.h. werden beispielsweise 15 Aufnahmen
eines Kalibrierkörpers verwendet, so ergibt sich die Länge des
Tupels NStartPoseNStartPoseNStartPoseNStartPoseNStartPose zu (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 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 NRowNRowNRowNRowNRow
und NColNColNColNColNCol 15 mal so viele Werte aufweisen wie die Tupel mit
den 3D-Modellmarkenpunkten (NXNXNXNXNX, NYNYNYNYNY und
NZNZNZNZNZ). Sind beispielsweise 49 Markenpunkte pro Bild
vorhanden, so haben die Tupel NRowNRowNRowNRowNRow und NColNColNColNColNCol
jeweils die Länge , die Tupel
NXNXNXNXNX, NYNYNYNYNY und NZNZNZNZNZ haben dagegen die Länge 49.
Die Reihenfolge der Werte in NRowNRowNRowNRowNRow und NColNColNColNColNCol 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
(ErrorsErrorsErrorsErrorserrors) 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_calibrationCameraCalibrationCameraCalibrationCameraCalibration ist so ausgelegt,
dass er mit den Eingabetupeln NXNXNXNXNX, NYNYNYNYNY, NZNZNZNZNZ,
NRowNRowNRowNRowNRow und NColNColNColNColNCol 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
EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams auf 'pose'"pose""pose""pose""pose" setzt, kann man auf
diese Weise mit camera_calibrationcamera_calibrationCameraCalibrationCameraCalibrationCameraCalibration die Lage eines beliebigen
Objektes in Kamerakoordinaten ermitteln! Hierzu sind dann mindestens
drei 3D/2D-Korrespondenzen als Eingabe
anzugeben. NStartPoseNStartPoseNStartPoseNStartPoseNStartPose kann z.B. direkt über
create_posecreate_poseCreatePoseCreatePoseCreatePose 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 EstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams muss aus
diesem Grund explizit die y-Koordinate des Bildhauptpunktes ausgeschlossen
werden: '~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_calibrationCameraCalibrationCameraCalibrationCameraCalibration den Wert
2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt