camera_calibrationT_camera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration — Bestimmen aller Kameraparameter durch simultane Ausgleichsrechnung.
camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration 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_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration 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
calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras verwiesen.
Mit dem Eingabeparameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams 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_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration), ist es oftmals ausreichend, lediglich die
3D-Lage (Pose) des Weltkoordinatensystems in Kamerakoordinaten zu bestimmen.
In diesem Fall kann in EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams der Wert 'pose'"pose""pose""pose""pose""pose"
übergeben werden. Um denselben Effekt zu erzielen, kann man als Alternative
dem Parameter EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams auch alle zu bestimmenden Werte
übergeben: EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams =
['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 EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams 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?
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_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration 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 EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams auf 'pose'"pose""pose""pose""pose""pose" setzt, kann man
auf diese Weise mit camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration die Lage eines beliebigen
Objektes in Kamerakoordinaten ermitteln! Hierzu sind dann mindestens drei
3D/2D-Korrespondenzen als Eingabe anzugeben. NStartPoseNStartPoseNStartPoseNStartPoseNStartPoseNStartPose kann z.B.
direkt über create_posecreate_poseCreatePosecreate_poseCreatePoseCreatePose 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 EstimateParamsEstimateParamsEstimateParamsEstimateParamsEstimateParamsestimateParams 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 „Beschränkungen“ in
calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras entnommen werden.
Sind die Parameterwerte korrekt und konnten die gesuchten
Kameraparameter durch das Bündelausgleichsverfahren bestimmt werden,
dann liefert camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration den Wert
2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt