Mehrbild

Liste der Operatoren ↓

Dieses Kapitel beschreibt den Kalibriervorgang für verschiedene Mehrbild-Kameraaufbauten.

Allgemein

Um eine höchstmögliche Messgenauigkeit zu erreichen muss ein Kamerasystem entsprechend kalibriert werden. Dazu wird ein Kameramodell bestimmt, welches die (sub-)pixelgenaue Projektion eines 3D-Weltpunktes in ein Bild beschreibt.

Die folgenden Abschnitte erläutern die Durchführung der Kalibrierung verschiedener Kameraaufbauten. Insbesondere werden darin

beschrieben.

Kalibrierobjekt

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 calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras 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 in hohem Maße von der Qualität der Kalibrierbilder ab. Deshalb wird bei der Aufnahme der Kalibrierbilder hohe Sorgfalt empfohlen. Siehe den Abschnitt „Wie nehme ich geeignete Bilder auf?" für weitere Informationen.

Im Folgenden wird der Kalibrierprozess im Detail erläutert:

Vorbereitung der Eingabekalibrierdaten

Vor dem Aufruf des Operators calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras sollten die benötigten Daten im Kalibrierdatenmodell gesammelt werden. Dabei müssen diese Schritte befolgt werden:

  1. Erstellen des Kalibrierdatenmodells mit dem Operator create_calib_datacreate_calib_dataCreateCalibDataCreateCalibDataCreateCalibData, wobei die Anzahl der Kameras und die Anzahl der Kalibrierkörper im Modell festgelegt werden.

  2. Definieren des Kameratyps und der internen Kameraparameter für alle Kameras mit dem Operator set_calib_data_cam_paramset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParamSetCalibDataCamParam. Zu beachten ist, dass nur Kameras vom gleichen Typ in einem Aufbau kalibriert werden können.

  3. Definieren der Kalibrierkörperbeschreibung für alle Kalibrierkörper mit dem Operator set_calib_data_calib_objectset_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObjectSetCalibDataCalibObject.

  4. Sammeln von Beobachtungen mit den Operatoren find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject oder set_calib_data_observ_pointsset_calib_data_observ_pointsSetCalibDataObservPointsSetCalibDataObservPointsSetCalibDataObservPoints, d.h. die Bildkoordinaten der extrahierten Kalibrierkörpermarker und eine grob geschätzte Pose des Kalibrierkörpers relativ zur beobachtenden Kamera.

  5. Kalibrierprozess konfigurieren, z.B. die Referenzkamera setzen oder bestimmte interne oder externe Kameraparameter von der Optimierung ausschließen. Kalibriereinstellungen für den ganzen Aufbau oder für einzelne Kameras bzw. Kalibrierkörperposen können mit dem Operator set_calib_dataset_calib_dataSetCalibDataSetCalibDataSetCalibData angepasst werden. Wenn bestimmte Kameraparameter genau bekannt sind, z.B. die Zellgrößen des Kamerasensors von Kamera 0, brauchen sie nicht kalibriert zu werden. Das kann mit folgendem Aufruf konfiguriert werden: set_calib_data (CalibDataID, 'camera', 0, \ 'excluded_settings', ['sx','sy']).

Die tatsächliche Kalibrierung durchführen

Je nach Kameratypen, welche im Aufbau kalibriert werden, führt calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras die Kalibrierung auf unterschiedliche Weisen durch. Während sich unterschiedliche Kameraaufbauten zum Teil in ihren Anforderungen an die Bildaufnahme unterscheiden, sind die grundsätzlichen Schritte des Kalibriervorgangs für Aufbauten mit projektiven und/oder telezentrischen Kameras gleich:

  1. Kette von Beobachtungen bilden: Im ersten Schritt versucht der Operator calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras eine durchgehende Kette von Beobachtungsposen zu bilden, welche alle Kameras und Kalibrierobjektposen miteinander verbindet. Je nach Kameraaufbau unterscheiden sich die Bedingungen für eine gültige Kette von Posen. Die entsprechenden Anforderungen an die speziellen Aufbauten werden in den entsprechenden Abschnitten unterhalb dieses Paragraphs erläutert. Falls eine Kamera nicht erreicht werden kann (d.h. die Kamera beobachtet keine Kalibrierkörperpose, die in der Kette eingegliedert ist), wird der Kalibrierprozess abgebrochen und ein Fehler zurückgegeben. Ansonsten initialisiert der Algorithmus die Posen aller Objekte im Aufbau beim Durchlaufen der Kette.

  2. Erste Optimierung: In diesem Schritt optimiert calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras alle Kamera- und Kalibrierkörperposeparameter, die nicht explizit von der Optimierung ausgeschlossen wurden.

  3. Zweite Optimierung: Hierbei korrigiert der Algorithmus anhand des soweit kalibrierten Kameraaufbaus jene Beobachtungen, die Konturdaten enthalten (siehe find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject), und kalibriert den Aufbau zur Berücksichtigung der Korrekturen erneut. Sollten keine Konturbeobachtungsdaten im Modell vorhanden sein, wird dieser Schritt übersprungen.

  4. Berechnung der Qualität der Parameterschätzung: Im letzten Schritt berechnet calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras die Standardabweichungen und die Kovarianzen der kalibrierten Kameraparameter.

Die folgenden Abschnitte geben, wie erwähnt, weitere Details zur Kalibrierung verschiedener Kameraaufbauten. Außerdem werden Informationen zur Kalibrierung von Zeilenkameras aufgeführt.

Projektive Flächenkameras

Für einen Aufbau mit projektiven Flächenkameras ('area_scan_division'"area_scan_division""area_scan_division""area_scan_division""area_scan_division", 'area_scan_polynomial'"area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial", 'area_scan_tilt_division'"area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division", 'area_scan_tilt_polynomial'"area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial", 'area_scan_tilt_image_side_telecentric_division'"area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division", 'area_scan_tilt_image_side_telecentric_polynomial'"area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial", 'area_scan_hypercentric_division'"area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division" und 'area_scan_hypercentric_polynomial'"area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial") wird die Kalibrierung in den oben erläuterten vier Schritten durchgeführt. Im ersten Schritt versucht der Algorithmus dabei, so wie in unten stehender Abbildung zu sehen, eine Kette von Beobachtungsposen zu bilden, welche alle Kameras und Kalibrierobjektposen verbindet.

image/svg+xml image/svg+xml
(1) (2)
(1) Alle Kameras können über eine Kette von Beobachtungen miteinander verbunden werden. (2) Die linke Kamera ist von der Beobachtungskette ausgeschlossen, da die linke Kalibrierplatte von keiner anderen Kamera gesehen wird.
Telezentrische Flächenkameras

Für einen Aufbau mit telezentrischen Flächenkameras ('area_scan_telecentric_division'"area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division", 'area_scan_telecentric_polynomial'"area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial", 'area_scan_tilt_bilateral_telecentric_division'"area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division", 'area_scan_tilt_bilateral_telecentric_polynomial'"area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial", 'area_scan_object_side_telecentric_polynomial'"area_scan_object_side_telecentric_polynomial""area_scan_object_side_telecentric_polynomial""area_scan_object_side_telecentric_polynomial""area_scan_object_side_telecentric_polynomial" oder 'area_scan_tilt_object_side_telecentric_polynomial'"area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial") werden dieselben vier Schritte durchlaufen wie oben aufgelistet. Für den ersten Schritt (Aufbau einer Kette von Beobachtungen, die alle Kameras und Kalibrierobjektposen verbindet) gelten hier jedoch zusätzliche Voraussetzungen. Da die Lage eines Objektes mit nur einer Kamera nur bis auf eine Verschiebung entlang der optischen Achse bestimmt werden kann, muss ein Kalibrierkörper von mindestens zwei Kameras beobachtet werden, damit seine relative Lage bestimmt werden kann. Sonst wird er aus der Kalibrierung entfernt. Außerdem gilt: Da ein planares Kalibrierobjekt aus jeweils zwei Winkeln gleich erscheint, kann die relative Lage der Kameras untereinander nicht eindeutig bestimmt werden. Es gibt immer zwei gültige Varianten der relativen Lage der zweiten Kamera. Beide Alternativen stellen ein konsistentes Kamerasetup dar und können zum Messen benutzt werden. Da die Mehrdeutigkeit nicht aufgelöst werden kann, wird die erste Lösung zurückgeliefert. Wenn die zurückgegebene Pose nicht die reell vorliegende sondern die alternative Lösung ist, so sind die damit rekonstruierten Daten gespiegelt.

Projektive and telezentrische Flächenkameras

Für einen gemischten Aufbau mit projektiven und telezentrischen Flächenkameras durchläuft der Algorithmus dieselben Schritte wie oben aufgelistet. Mögliche Mehrdeutigkeiten während des ersten Schrittes (Aufbau einer Kette von Beobachtungen, die alle Kameras und Kalibrierobjektposen verbindet), die bei einem reinen telezentrischen Flächenkameraaufbau auftreten, können bei einem gemischten Aufbau verhindert werden. Voraussetzung dafür ist die Existenz einer Kette, die aus allen projektiven Flächenkameras und einer ausreichenden Anzahl an Kalibrierobjekten besteht. Hierbei bedeutet eine ausreichende Anzahl, dass jede telezentrische Flächenkamera mindestens zwei Kalibrierobjekte dieser Kette beobachtet.

image/svg+xml (P) (T) (P) image/svg+xml (P) (T) (P)
(1) (2)
Gemischter Aufbau mit projektiven (P) und telezentrischen (T) Flächenkameras. (1) Alle projektiven Kameras sind über eine Kette von Beobachtungen, welche nur projektive Kameras beinhaltet, verbunden. (2) Die zweite Kalibrierplatte von links ist von der rechten projektiven Kamera nicht sichtbar, weshalb die Lage der projektiven Kameras zueinander nicht eindeutig bestimmt werden kann.
Zeilenkameras

Für Zeilenkameras ('line_scan'"line_scan""line_scan""line_scan""line_scan") existieren einige Beschränkungen: Es kann nur eine Kamera pro Aufbau kalibriert werden und nur ein Kalibrierobjekt pro Aufbau verwendet werden. Weiterhin werden keine Informationen über die Standardabweichungen und die Kovarianzen der geschätzten Kameraparameter geliefert.

Schließlich muss beachtet werden, dass bei Kalibrierplatten mit rechteckiger Markenanordnung (siehe gen_caltabgen_caltabGenCaltabGenCaltabGenCaltab) keine Beobachtungen akzeptiert werden, in denen nicht alle Kalibrierkörpermarken extrahiert wurden. Bei Kalibrierplatten mit hexagonaler Markenanordnung (siehe create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltab) gilt diese Einschränkung nicht. Weitere Informationen zu Kalibrierplatten und der Aufnahme von Kalibrierbildern finden sich im Abschnitt „Zusätzliche Information über die Kalibrierung“.

Ergebnisse der Kalibrierung überprüfen

Nach erfolgreicher Kalibrierung gibt der Operator calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras die Wurzel des mittleren quadratischen Rückprojektionsfehlers (RMSE) der Optimierung im Parameter ErrorErrorErrorErrorerror (in Pixel) zurück. Dieser Fehler gibt einen allgemeinen Hinweis darauf, ob die Optimierung erfolgreich war, da er die durchschnittlichen Abweichungen (in Pixeln) zwischen den zurückprojizierten Kalibrierpunkten und den errechneten Bildkoordinaten angibt:

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. Bei der gleichzeitigen Kalibrierung mehrerer Kameras ist der Wert des Fehlers schwieriger zu beurteilen. Als Faustregel sollte der Fehler so klein wie möglich sein oder zumindest kleiner als 1.0 sein, da dies ein Hinweis ist, dass mit den kalibrierten Parametern eine subpixelgenaue Evaluierung der Daten noch möglich ist. Bei bestimmten Konfigurationen kann es schwierig sein, diesen Wert zu erreichen. Eine weitere Analyse der Kalibrierqualität kann anhand der zurückgegebenen Standardabweichungen und Kovarianzen der Kameraparameter erfolgen. Dies ist zurzeit nur bei Flächenkameras möglich (siehe get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibData).

Kalibrierergebnisse abfragen

Alle Ergebnisse der Kalibrierung, d.h. die internen Kameraparameter, die Kameraposen (externe Parameter), die Kalibrierkörperposen usw., können mit get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibData abgefragt werden.

Da bei telezentrischen Kameras die Lage nur bis auf ihre Verschiebung entlang der z-Achse des Koordinatensystems der jeweiligen Kamera bekannt ist, werden die Kameraposen entlang dieser Richtung so verschoben, dass alle Kameras auf einer gemeinsamen Kugel liegen. Der Mittelpunkt der Kugel wird in den ersten Kalibrierkörper gelegt. Der Radius dieser Kugel variiert je nach gegebenem Aufbau. Falls ein gemischter Aufbau mit projektiven und telezentrischen Kameras vorliegt, wird als Radius das Maximum über alle Abstände zwischen projektiven Kameras und dem ersten Kalibrierkörper gewählt. Falls nur telezentrische Kameras im Aufbau vertreten sind, beträgt der Radius 1m.

Kameraparameter

Die Kameraparameter werden unterschieden nach internen und externen Kameraparametern.

Interne Kameraparameter:

Die internen Kameraparameter beschreiben die Beschaffenheit der verwendeten Kamera, insbesondere die interne Sensorgröße und die Abbildungseigenschaften der verwendeten Kombination von Objektiv, Kamera und Framegrabber. Unten sehen Sie eine Übersicht über alle verfügbaren Kameratypen und deren jeweilige Parameter. In der Liste bezieht sich „projektive Flächenkameras“ auf die Eigenschaft, dass das Objektiv eine perspektivische Projektion auf der Objektseite des Objektivs durchführt, während sich „telezentrische Flächenkameras“ auf die Eigenschaft bezieht, dass das Objektiv eine telezentrische Projektion auf der Objektseite des Objektivs durchführt.

Kameras mit Flächensensor

haben 9 bis 16 interne Parameter abhängig vom Kameratyp.

Aus weiter unten genannten Gründen werden die mit einem * Sternchen gekennzeichneten Parameter nicht vom Algorithmus geschätzt, sondern bleiben fest.

Flächenkameras mit normalen Objektiven

Projektive Flächenkameras

'area_scan_division'"area_scan_division""area_scan_division""area_scan_division""area_scan_division"

['area_scan_division', Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_polynomial'"area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial"

['area_scan_polynomial', Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

Telezentrische Flächenkameras

'area_scan_telecentric_division'"area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division""area_scan_telecentric_division"

['area_scan_telecentric_division', Magnification, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_division", Magnification, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_telecentric_polynomial'"area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial"

['area_scan_telecentric_polynomial', Magnification, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

Flächenkameras mit Tiltobjektiven

Projektive Flächenkameras

'area_scan_tilt_division'"area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division""area_scan_tilt_division"

['area_scan_tilt_division', Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_division", Focus, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_polynomial'"area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial""area_scan_tilt_polynomial"

['area_scan_tilt_polynomial', Focus, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_polynomial", Focus, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_image_side_telecentric_division'"area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division""area_scan_tilt_image_side_telecentric_division"

['area_scan_tilt_image_side_telecentric_division', Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division", Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division", Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division", Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_division", Focus, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_image_side_telecentric_polynomial'"area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial""area_scan_tilt_image_side_telecentric_polynomial"

['area_scan_tilt_image_side_telecentric_polynomial', Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial", Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial", Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial", Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_image_side_telecentric_polynomial", Focus, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]

Telezentrische Flächenkameras

'area_scan_tilt_bilateral_telecentric_division'"area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division""area_scan_tilt_bilateral_telecentric_division"

['area_scan_tilt_bilateral_telecentric_division', Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division", Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division", Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division", Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_division", Magnification, Kappa, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_bilateral_telecentric_polynomial'"area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial""area_scan_tilt_bilateral_telecentric_polynomial"

['area_scan_tilt_bilateral_telecentric_polynomial', Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_bilateral_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, Tilt, Rot, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_object_side_telecentric_division'"area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division""area_scan_tilt_object_side_telecentric_division"

['area_scan_tilt_object_side_telecentric_division', Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division", Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division", Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division", Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_division", Magnification, Kappa, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_tilt_object_side_telecentric_polynomial'"area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial""area_scan_tilt_object_side_telecentric_polynomial"

['area_scan_tilt_object_side_telecentric_polynomial', Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_tilt_object_side_telecentric_polynomial", Magnification, K1, K2, K3, P1, P2, ImagePlaneDist, Tilt, Rot, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

Flächenkameras mit hyperzentrischen Objektiven

Projektive Flächenkameras mit hyperzentrischen Objektiven

'area_scan_hypercentric_division'"area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division""area_scan_hypercentric_division"

['area_scan_hypercentric_division', Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_division", Focus, Kappa, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

'area_scan_hypercentric_polynomial'"area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial""area_scan_hypercentric_polynomial"

['area_scan_hypercentric_polynomial', Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]["area_scan_hypercentric_polynomial", Focus, K1, K2, K3, P1, P2, Sx, Sy*, Cx, Cy, ImageWidth, ImageHeight]

Beschreibung der internen Kameraparameter:

CameraType:

Typ der Kamera, wie oben aufgelistet.

Focus:

Brennweite des Objektivs (nur für Kameras mit Objektiven, die auf der Objektseite eine perspektivische Projektion durchführen).

Startwert ist gleich der nominalen Brennweite des verwendeten Objektivs, also beispielsweise 0.008 m.

Magnification:

Vergrößerungsmaßstab des Objektivs (nur für Kameras mit Objektiven, die auf der Objektseite eine telezentrische Projektion durchführen).

Startwert ist der nominale Vergrößerungsmaßstab des verwendeten telezentrischen Objektivs (Bildgröße geteilt durch Objektgröße), beispielsweise 0.2.

Kappa :

Verzeichnungskoeffizient zur Modellierung der radialen Verzeichnungen mit dem Divisionsmodell.

Startwert: 0.0 .

K1, K2, K3, P1, P2:

Verzeichnungskoeffizienten zur Modellierung der radialen ( ) und tangentialen ( ) Verzeichnung mit dem Polynommodell.

Startwert für alle fünf Koeffizienten: 0.0

ImagePlaneDist:

Abstand der Austrittspupille zur Bildebene. Die Austrittspupille ist das (virtuelle) Bild der Aperturblende (typischerweise die Irisblende), betrachtet von der Bildseite des Objektivs. Typische Werte liegen in der Größenordnung von wenigen Zentimetern bis zu sehr großen Werten, falls das Objektiv fast bildseitig telezentrisch ist.

Tilt, Rot:

Der Tiltwinkel , um den die optische Achse im Vergleich zur Normalen der Bildebene verkippt ist (entspricht einer Drehung um die x-Achse), und der Rotationswinkel , der beschreibt, in welche Richtung die optische Achse gekippt ist. Bei einer Rotation von wird die optische Achse vertikal um den Tiltwinkel nach unten (bezüglich des Kameragehäuses) gekippt, entspricht einer Verkippung nach links (Blickrichtung entlang der z-Achse), nach oben, und bei wird die optische Achse um den Winkel nach rechts gekippt.

Diese Parameter werden nur benötigt, falls ein Tiltobjektiv verwendet wird.
image/svg+xml y x z y x z 2. tilt 1. rot ImagePlaneDist
Der Tilt eines Objektivs wird durch die Parameter , und ImagePlaneDistImagePlaneDistImagePlaneDistImagePlaneDistimagePlaneDist beschrieben. beschreibt die Orientierung der Tiltachse relativ zur x-Achse des Sensors und muss zuerst angebracht werden. beschreibt den tatsächlichen Tiltwinkel des Objektivs. ImagePlaneDistImagePlaneDistImagePlaneDistImagePlaneDistimagePlaneDist beschreibt den Abstand der Austrittspupille zur Bildebene.

Diese Winkel sind typischerweise aus den Überlegungen, die zur Verwendung des Tiltobjektivs geführt haben, bekannt oder können von dem Mechanismus, der zur Verkippung des Objektivs verwendet wird, abgelesen werden.

Sx, Sy:

Skalierungsfaktoren. Entsprechen dem horizontalen und vertikalen Abstand zweier benachbarter Zellen auf dem Sensor. Da in der Regel das Bildsignal zeilensynchron ausgelesen wird, ist durch die Größe des Sensors exakt festgelegt und muss daher nicht durch die Kalibrierung bestimmt werden.

Die Startwerte für den Abstand zweier benachbarter Zellen hängen von der Größe des Chips der verwendeten Kamera ab und können den technischen Daten der Kamera entnommen werden. Vorsicht: Bei Unterabtastung des Bildes erhöhen sich diese Werte!

Da projektive Flächenkameras durch das Modell einer Lochkamera mit Flächensensor beschrieben werden, ist es unmöglich, FocusFocusFocusFocusfocus, und gleichzeitig zu bestimmen. Daher wird nicht optimiert, sondern bleibt fest.

Für telezentrische Objektive ist es unmöglich, MagnificationMagnificationMagnificationMagnificationmagnification, und gleichzeitig zu bestimmen. Daher wird nicht optimiert, sondern bleibt fest.

Bei bildseitig telezentrischen Tiltobjektiven ist es unmöglich, FocusFocusFocusFocusfocus, , und die Verkippungsparameter und gleichzeitig zu bestimmen. Daher wird zusätzlich nicht optimiert, sondern bleibt fest.

Bei beidseitig telezentrischen Tiltobjektiven ist es unmöglich, MagnificationMagnificationMagnificationMagnificationmagnification, , und die Verkippungsparameter und gleichzeitig zu bestimmen. Daher wird zusätzlich nicht optimiert, sondern bleibt fest.

Cx, Cy:

Spalten- ( ) und Zeilenkoordinate ( ) des Kamerahauptpunktes (Zentrum der radialen Verzeichnung).

Startwerte für die Koordinaten des Kamerahauptpunktes sind die halbe Bildbreite bzw. -höhe. Hinweis: Bei Unterabtastung des Bildes verringern sich die Werte entsprechend!

ImageWidth, ImageHeight:

Breite und Höhe des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes verringern sich diese Werte!

Zeilenkameras

Zeilenkameras haben die folgenden 12 internen Parameter: ['line_scan', Focus, Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan", Focus, Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan", Focus, Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan", Focus, Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]["line_scan", Focus, Kappa, Sx*, Sy*, Cx, Cy, ImageWidth, ImageHeight, Vx, Vy, Vz]

Aus weiter unten genannten Gründen werden die mit einem * Sternchen gekennzeichneten Parameter nicht vom Algorithmus geschätzt, sondern bleiben fest.

CameraType:

Typ der Kamera ('line_scan'"line_scan""line_scan""line_scan""line_scan")

Focus:

Brennweite des Objektivs.

Startwert ist gleich der nominalen Brennweite des verwendeten Objektivs, also beispielsweise 0.008 m.

Kappa :

Verzeichnungskoeffizient zur Modellierung der radialen Verzeichnung mit dem Divisionsmodell.

Startwert: 0.0 .

Sx:

Skalierungsfaktor. Entspricht dem horizontalen Abstand zweier benachbarter Zellen auf der Sensorzeile. Es ist zu beachten, dass Focus und nicht gleichzeitig bestimmt werden können. Deshalb wird in der Kalibrierung festgehalten. Der Startwert für den Abstand zweier benachbarter Zellen kann den technischen Daten der Kamera entnommen werden. Vorsicht: Bei Unterabtastung des Bildes erhöht sich dieser Wert!

Sy:

Skalierungsfaktor, der im Rahmen der Kalibrierung nur in der Form auftritt. Daher können und nicht gleichzeitig bestimmt werden. Deshalb wird in der Kalibrierung fest gehalten. beschreibt den Abstand des Kamerahauptpunktes von der Sensorzeile in Meter. Der Startwert für die Größe einer Zelle senkrecht zur Richtung der Sensorzeile kann ebenfalls den technischen Daten der Kamera entnommen werden. Vorsicht: Bei Unterabtastung des Bildes erhöht sich der Wert von !

Cx:

Spaltenkoordinate des Kamerahauptpunktes (Zentrum der radialen Verzeichnung).

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 verringert sich der Wert für entsprechend!

Cy:

Abstand des Kamerahauptpunktes (Zentrum der radialen Verzeichnung) von der Sensorzeile in Bildzeilen. Der Startwert für die y-Koordinate des Kamerahauptpunktes ist normalerweise 0.

ImageWidth, ImageHeight:

Breite und Höhe des abgetasteten Bildes. Vorsicht: Bei Unterabtastung des Bildes verringern sich diese Werte!

Vx, Vy, Vz:

Die x-, y- und z-Komponenten des Bewegungsvektors. 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 = = 0. Der Startwert für lässt sich dann aus der Aufnahme eines Objektes dessen Größe bekannt ist (z.B. Kalibrierplatte, Lineal) folgendermaßen bestimmen:

Mit:

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:

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:

Die Qualität der Startwerte für , und ist entscheidend für den Erfolg der gesamten Kalibrierung. Werden zu schlechte Startwerte verwendet, kann dies zum Abbruch der Kamerakalibrierung führen.

Zu beachten ist, 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.

Prüfen Sie für alle Operatoren, die Kameraparameter als Eingabe verwenden, ob die Werte der jeweiligen Kameraparameter folgende Restriktionen erfüllen:

Für manche Operatoren gibt es kleine Unterschiede in den Restriktionen. Im Speziellen für Operatoren, die Lochkameras mit Zeilensensor nicht unterstützen, gilt folgende Restriktion:

Externe Kameraparameter:

Die folgenden 6 Parameter beschreiben die 3D-Lage (Pose) des Weltkoordinatensystems relativ zum Kamerakoordinatensystem. Die x- und y-Achse des Kamerakoordinatensystems sind parallel zur Zeilen- und Spaltenachse der Abbildung, während die z-Achse rechtwinklig auf der Bildebene steht. Bei Kameras mit Zeilensensor bezieht sich die Pose des Weltkoordinatensystems auf das Kamerakoordinatensystem der ersten Bildzeile.

TransX:

Translation entlang der x-Achse des Kamerakoordinatensystems.

TransY:

Translation entlang der y-Achse des Kamerakoordinatensystems.

TransZ:

Translation entlang der z-Achse des Kamerakoordinatensystems.

RotX:

Rotationswinkel um die x-Achse des Kamerakoordinatensystems.

RotY:

Rotationswinkel um die y-Achse des Kamerakoordinatensystems.

RotZ:

Rotationswinkel um die z-Achse des Kamerakoordinatensystems.

Zusätzlich ist in dem Tupel, das die Pose beschreibt, als siebtes Element der Darstellungstyp enthalten. Dieser codiert die Kombination der Parameterwerte OrderOfTransformOrderOfTransformOrderOfTransformOrderOfTransformorderOfTransform, OrderOfRotationOrderOfRotationOrderOfRotationOrderOfRotationorderOfRotation und ViewOfTransformViewOfTransformViewOfTransformViewOfTransformviewOfTransform. Für detaillierte Informationen zu Posen siehe create_posecreate_poseCreatePoseCreatePoseCreatePose.

Bei Benutzung einer HALCON-Kalibrierplatte definiert deren Koordinatensystem das Weltkoordinatensystem. Bei Kalibrierplatten mit hexagonaler Markenanordnung (siehe create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltab) befindet sich der Ursprung des Koordinatensystems in der Mitte der zentralen Marke des ersten Suchmusters. Bei Kalibrierplatten mit rechteckiger Markenanordnung (siehe gen_caltabgen_caltabGenCaltabGenCaltabGenCaltab) liegt der Ursprung im Mittelpunkt der Kalibrierkörperoberfläche. In beiden Fällen zeigt die z-Achse des Koordinatensystems in den Kalibrierkörper hinein, die x-Achse (in z-Richtung blickend) nach rechts und die y-Achse nach unten.

Startwerte für alle Parameter können bei Verwendung einer HALCON-Kalibrierplatte mit dem Operator find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject gewonnen werden. Alternativ kann bei HALCON-Kalibrierplatten mit rechteckiger Markenanordnung auch eine Kombination der beiden Operatoren find_caltabfind_caltabFindCaltabFindCaltabFindCaltab und find_marks_and_posefind_marks_and_poseFindMarksAndPoseFindMarksAndPoseFindMarksAndPose verwendet werden.

Einheiten der Parameter:

Die HALCON-Kalibrierplatten verwenden Meter als Einheit. Die Kameraparameter gehen von entsprechenden Einheiten aus. Selbstverständlich kann die Kalibrierung auch in anderen Einheiten durchgeführt werden, doch müssen dann die zugehörigen Parameter adaptiert werden. Unten werden die HALCON Standard-Einheiten gelistet:

Parameter Einheit
Extern RotX, RotY, RotZ , ,
TransX, TransY, TransZ , ,
Intern Cx, Cy ,
Focus
ImagePlaneDist
ImageWidth, ImageHeight ,
K1, K2, K3 , ,
Kappa
P1, P2 ,
Magnification - (Skalar)
Sx, Sy ,
Tilt, Rot ,
Vx, Vy, Vz , ,

Zusätzliche Information über die Kalibrierung

Die folgenden Abschnitte befassen sich jeweils mit einzelnen Fragen, die sich bei der Verwendung von calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras stellen und sollen daher sowohl dem Verständnis als auch als Leitfaden für die eigene Anwendung dienen.

Was eignet sich als passender Kalibrierkörper?

Hochgenaue Kalibrierkörper können Sie in verschiedenen Größen und Materialien über Ihren lokalen HALCON-Vertrieb erhalten. Diese Kalibrierplatten werden mit dazugehörigen Beschreibungsdateien ausgeliefert und können einfach mit find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject extrahiert werden.

Es ist auch möglich, beliebige Objekte zur Kalibrierung zu verwenden. Einzige Voraussetzung ist, dass der Kalibrierkörper charakteristische Merkmalspunkte aufweist, die robust in Bildern erkannt werden können und deren 3D-Weltkoordination hochgenau bekannt sind. Siehe den „Solution Guide III-C 3D Vision“ für weitere Informationen.

Selbst ausgedruckte Kalibrierplatten sind normalerweise nicht genau genug für Anwendungen mit hohen Präzisionsanforderungen.

Wie nehme ich geeignete Bilder auf?

Mit der zu kalibrierenden Kombination aus Objektiv (mit fester Scharfstellung), Kamera und Framegrabber wird der Kalibrierkörper aufgenommen, vgl. open_framegrabberopen_framegrabberOpenFramegrabberOpenFramegrabberOpenFramegrabber bzw. grab_imagegrab_imageGrabImageGrabImageGrabImage. Dabei sollten folgende allgemeine Hinweise berücksichtigt werden:

Ihr lokaler Vertrieb bietet zur Kamerakalibrierung zwei verschiedene HALCON-Kalibrierkörper an: Kalibrierplatten mit hexagonaler Markenanordnung (siehe create_caltabcreate_caltabCreateCaltabCreateCaltabCreateCaltab) und Kalibrierplatten mit rechteckiger Markenanordnung (siehe gen_caltabgen_caltabGenCaltabGenCaltabGenCaltab). Da sich die beiden Kalibrierkörper deutlich voneinander unterscheiden sind bei deren Verwendung neben den allgemeinen Hinweisen zusätzliche, kalibrierplattenspezifische Besonderheiten zu beachten (siehe auch find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject):

HALCON-Kalibrierplatten mit hexagonaler Markenanordnung

HALCON-Kalibrierplatten mit rechteckiger Markenanordnung

Welches Verzeichnungsmodell soll ich verwenden?

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 die Abschnitte „Kameraparameter“ und „Zugrundeliegendes 3D-Kameramodell“).

Der Vorteil des Divisionsmodells ist, dass die Korrektur der Verzeichnung schneller berechnet werden kann, insbesondere, wenn Weltkoordinaten in ein verzeichnetes Bild projiziert werden und die Verzeichnung somit in der umgekehrten Richtung angebracht werden muss. Des Weiteren 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 besonders 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.

Zugrundeliegendes 3D-Kameramodell

Ganz allgemein bedeutet Kamerakalibrierung, diejenigen Parameter exakt zu bestimmen, die die (optische) Abbildung eines beliebigen 3D-Weltpunktes 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 Gegenständen im Bild bestimmt werden soll, beispielsweise bei der Vermessung von Werkstücken. Das passende Projektionsmodel ist von den verwendeten Kameratypen abhängig.

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:

Lochkamera mit Flächensensor:

Die Kombination einer Kamera mit Flächensensor und einem Objektiv, das auf der Objektseite eine perspektivische Projektion durchführt, und das radiale und tangentiale Verzeichnung aufweisen kann. Das Objektiv kann ein Tiltobjektiv sein, d.h. die optische Achse kann schräg zum Sensor der Kamera stehen (dies wird manchmal auch als Scheimpflug-Objektiv bezeichnet). Da auch hyperzentrische Objektive eine perspektivische Projektion durchführen, sind Kameras mit hyperzentrischen Objektiven ebenfalls Lochkameras. Die Modelle für normale (d.h. nicht verschwenkbare) perspektivische oder bildseitig telezentrische Objektive sind identisch. Im Gegensatz hierzu unterscheiden sich die Modelle für perspektivische und bildseitig telezentrische Tiltobjektive erheblich, wie unten beschrieben.

Telezentrische Kamera mit Flächensensor:

Die Kombination einer Kamera mit Flächensensor mit einem Objektiv, das auf der Objektseite eine telezentrische Projektion (also eine Parallelprojektion) durchführt, und das radiale und tangentiale Verzeichnung aufweisen kann. Das Objektiv kann ein Tiltobjektiv sein. Die Modelle für normale (d.h. nicht verschwenkbare) beidseitig oder objektseitig telezentrische Objektive sind identisch. Im Gegensatz hierzu unterscheiden sich die Modelle für beidseitig und objektseitig telezentrische Tiltobjektive erheblich, wie unten beschrieben.

Lochkamera mit Zeilensensor:

Die Kombination einer Kamera mit Zeilensensor mit einem zentralperspektivisch abbildenden Objektiv, das radiale Verzeichnung aufweisen kann. Tiltobjektive werden derzeit nicht für Zeilenkameras unterstützt.

Um einen 3D-Punkt in Weltkoordinaten in einen 2D-Punkt in Pixelkoordinaten umzuwandeln, ist eine Kette von Transformationen notwendig:

3D Punkt in Weltkoordinaten
3D Punkt, transformiert in das Kamerakoordinatensystem
Punkt, projiziert in die Bildebene (in metrischen Koordinaten)
Punkt unter Berücksichtigung der Linsenverzeichnung
Bei Verwendung eines Tiltobjektives liegt nur auf einer virtuellen Bildebene eines Systems ohne Tiltobjektiv. In diesem Fall wird auf den Punkt in der gekippten Bildebene projiziert.
Bildpunkt in Pixelkoordinaten

Im Folgenden werden die einzelnen Schritte genauer erläutert. Für eine noch detailliertere Ausführung und Modellskizzen verweisen wir auf das Kapitel „Basics“, Abschnitt „Camera Model and Parameters“ im „Solution Guide III-C 3D Vision“.

Transformationsschritt 1:

Der Punkt wird vom Welt- in das Kamerakoordinatensystem transformiert (Punkte in Form von homogenen Vektoren, vgl. affine_trans_point_3daffine_trans_point_3dAffineTransPoint3dAffineTransPoint3dAffineTransPoint3d): mit und als Rotations- und Translationsmatritzen (siehe Kapitel „Basics“, Abschnitt „3D Transformations and Poses“ im „Solution Guide III-C 3D Vision“ für detaillierte Informationen).

Transformationsschritt 2:

Falls als Kameramodell das einer Lochkamera mit Flächensensor verwendet wird, wird die Projektion von in die Bildebene mit der folgenden Gleichung beschrieben: wobei ist. Für Kameras mit hyperzentrischen Objektiven gilt:

Falls eine telezentrische Kamera mit Flächensensor verwendet wird, wird die Projektion mit der folgenden Gleichung beschrieben: wobei ist.

Transformationsschritt 3:

Für beide Kameraarten mit Flächensensor kann die Verzeichnung entweder mit dem Divisionsmodell oder mit dem Polynommodell modelliert werden.

Das Divisionsmodell verwendet den Parameter KappaKappaKappaKappakappa, 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:

Diese Gleichungen lassen sich analytisch invertieren. Dies führt zu den folgenden Gleichungen, die mit Hilfe des Divisionsmodells verzeichnungsfreie Koordinaten zu Koordinaten mit Verzeichnung transformieren:

Das Polynommodell verwendet drei Parameter ( ), um die radiale Verzeichnung zu modellieren und zwei Parameter ( ), 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: mit

Diese Gleichungen sind nicht analytisch invertierbar. Daher müssen die verzeichneten Koordinaten numerisch aus den Koordinaten ohne Verzeichnungen bestimmt werden.

Zusätzlicher Transformationsschritt für Tiltobjektive:

Falls es sich beim Objektiv um ein Tiltobjektiv handelt, wird die Verkippung des Objektivs relativ zur Bildebene durch die zwei Parameter und beschrieben.

Bei diesem Schritt muss, wie unten beschrieben, zwischen verschiedenen Arten von Tiltobjektiven unterschieden werden. Siehe Kapitel „Basics“, Abschnitt „Camera Model and Parameters“ im „Solution Guide III-C 3D Vision“ für einen Überblick über die verschiedenen Arten von Tiltobjektiven.

Für zentralperspektivisch abbildende Tiltobjektive und objektseitig telezentrische Tiltobjektive (die eine perspektivische Projektion auf der Bildseite des Objektivs durchführen), wird die Projektion des Punktes in den Punkt , der in der verkippten Bildebene liegt durch eine projektive 2D-Transformation, d.h. durch eine homogene 3×3-Matrix , beschrieben (siehe projective_trans_point_2dprojective_trans_point_2dProjectiveTransPoint2dProjectiveTransPoint2dProjectiveTransPoint2d):

wobei die zusätzliche Koordinate aus der projektiven Transformation eines homogenen Punktes ist. wobei und mit und .

Für bildseitig telezentrische Tiltobjektive und beidseitig telezentrische Tiltobjektive (die eine Parallelprojektion auf der Bildseite des Objektivs durchführen) wird die Projektion auf die verkippte Bildebene durch eine lineare 2D-Transformation, d.h. eine 2×2-Matrix, beschrieben: wobei definiert ist wie bei zentralperspektivisch abbildenden Objektiven.

Transformationsschritt 4: /

Schließlich wird die Transformation des Punktes (bzw. falls ein Tiltobjektiv verwendet wurde) vom Koordinatensystem der Bildebene ins Pixelkoordinatensystem folgendermaßen beschrieben:

Für Kameras mit Zeilensensor muss auch die Relativbewegung zwischen Kamera und Objekt modelliert werden. In HALCON werden hierzu die folgenden Annahmen getroffen:

  1. Die Kamera bewegt sich mit konstanter Geschwindigkeit entlang einer Geraden.

  2. Die Orientierung der Kamera ist konstant.

  3. Die Relativbewegung ist für alle Bilder gleich.

Diese Bewegung wird durch den Bewegungsvektor 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 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 wird bei der Projektion des Punktes in das Bild berücksichtigt. Infolgedessen wird vom Operator find_calib_objectfind_calib_objectFindCalibObjectFindCalibObjectFindCalibObject auch nur die Pose der ersten Bildzeile bestimmt (und von calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras in den Kalibrierergebnissen gespeichert).

Die Transformation von Welt- in Kamerakoordinaten ( ) ist für Lochkameras mit Zeilensensor identisch. Daher wird Transformationsschritt 1, wie oben beschrieben auch hier angewandt. Im Anschluss daran ist die Abbildung des Punktes , der im Kamerakoordinatensystem gegeben ist, auf ein (Sub-)Pixel im Bild folgendermaßen definiert:

Mit muss das folgende Gleichungssystem nach , und aufgelöst werden: mit

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:

Weitere Beschränkungen in Bezug auf spezifische Kameratypen

Für Lochkameras gilt: Falls die Kalibrierplatten in allen Bildern parallel zueinander sind (insbesondere, falls sie alle in derselben Ebene liegen), ist es unmöglich, den FocusFocusFocusFocusfocus gemeinsam mit allen sechs externen Parametern zu bestimmen. So ist es z.B. unmöglich, in diesem Fall FocusFocusFocusFocusfocus und den Abstand der Kalibrierplatte zur Kamera zu bestimmen. Um alle Kameraparameter eindeutig bestimmen zu können, muss die Kalibrierplatte in unterschiedlichen Orientierungen in den Bildern aufgenommen werden. Insbesondere sollte die Kalibrierplatte um die x- und y-Achsen des Kamerakoordinatensystems verkippt werden, d.h. sie sollte relativ zur Bildebene verkippt werden.

Bei telezentrischen Objektiven hat der Abstand der Kalibrierplatte zur Kamera keine Auswirkung auf das Bild der Kalibrierplatte und kann nicht bestimmt werden. Daher wird die z-Komponente der Ergebnis-Pose in den Kalibrierergebnissen auf 1 m gesetzt.

Für Tiltobjektive kann die Verkippung umso präziser bestimmt werden, je größer die Verzeichnungen des Objektivs sind. Für Objektive mit geringer Verzeichnung kann die Verkippung nicht robust bestimmt werden. Daher können die optimierten Verkippungsparameter möglicherweise signifikant von den nominalen Verkippungsparametern des Aufbaus abweichen. In so einem Fall prüfen Sie bitte ErrorErrorErrorErrorerror. Falls ErrorErrorErrorErrorerror klein ist, beschreibt der optimierte Parametersatz die Abbildungsgeometrie innerhalb des kalibrierten Volumens konsistent und kann für genaue Messungen verwendet werden.

Für perspektivische Tiltobjektive und objektseitig telezentrische Tiltobjektive kann der Abstand der Bildebene nur eindeutig bestimmt werden, falls der Tilt nicht 0 Grad ist. Je kleiner der Tilt ist, desto ungenauer kann der Abstand der Bildebene bestimmt werden. Daher kann der optimierte Abstand der Bildebene möglicherweise signifikant vom nominalen Abstand der Bildebene des Aufbaus abweichen. In so einem Fall prüfen Sie bitte ErrorErrorErrorErrorerror. Falls ErrorErrorErrorErrorerror klein ist, beschreibt der optimierte Parametersatz die Abbildungsgeometrie innerhalb des kalibrierten Volumens konsistent und kann für genaue Messungen verwendet werden.

Für perspektivische Tiltobjektive und objektseitig telezentrische Tiltobjektive, die um die horizontale oder vertikale Achse verschwenkt sind, d.h. für die der Rotationswinkel 0, 90, 180 oder 270 Grad beträgt, können der Tilt-Winkel , Skalierungsfaktor , die Brennweite (für perspektivische Tiltobjektive) bzw. der Vergrößerungsmaßstab (für objektseitig telezentrische Tiltobjektive) und der Abstand der verkippten Bildebene vom Zentrum der perspektivischen Projektion nicht eindeutig bestimmt werden. In diesem Fall sollte durch folgenden Aufruf von der Optimierung ausgeschlossen werden: set_calib_data (CalibDataID, 'camera', 'general', \ 'excluded_settings', 'sx').

Weiterhin ist zu beachten, dass es für Tiltobjektive nur möglich ist, und gleichzeitig zu bestimmen. Dies beruht auf einer Implementationsentscheidung, die dazu führt, dass die Optimierung numerisch stabiler wird. Folglich können und von der Optimierung nur gemeinsam und mit folgendem Aufruf ausgeschlossen werden: set_calib_data (CalibDataID, 'camera', 'general', \ 'excluded_settings', 'tilt').

Lochkameras mit Tiltobjektiven mit großer Brennweite haben näherungsweise ein telezentrisches Abbildungverhalten. Auch in diesem Fall sind, wie bereits beschrieben, und die Verkippungsparameter und korreliert. Sie können gleichzeitig nur unpräzise bestimmt werden. In diesem Fall ist es ratsam, von der Optimierung auszuschließen.

Bei telezentrischen Objektiven gibt es immer zwei mögliche Lagen einer Kalibrierplatte pro Bild. Daher ist es unmöglich, zu entscheiden, welche der beiden Lagen tatsächlich vorhanden ist. Diese Mehrdeutigkeit wirkt sich auch auf die Schwenkparameter und von telezentrischen Tiltobjektiven aus. Folglich kann die Kamerakalibrierung, abhängig von den Startparametern für und alternative Werte statt der nominalen zurückliefern. In so einem Fall prüfen Sie bitte ErrorErrorErrorErrorerror. Falls ErrorErrorErrorErrorerror klein ist, beschreibt der optimierte Parametersatz die Abbildungsgeometrie innerhalb des kalibrierten Volumens konsistent und kann für genaue Messungen verwendet werden.


Liste der Operatoren

calibrate_camerasCalibrateCamerasCalibrateCamerascalibrate_cameras
Bestimmen aller Kameraparameter durch simultane Ausgleichsrechnung.
clear_calib_dataClearCalibDataClearCalibDataclear_calib_data
Freigeben des Speichers eines Kalibrierdatenmodells.
clear_camera_setup_modelClearCameraSetupModelClearCameraSetupModelclear_camera_setup_model
Freigeben des Speichers eines Kameraaufbaumodells.
create_calib_dataCreateCalibDataCreateCalibDatacreate_calib_data
Anlegen eines generischen HALCON-Kalibrierdatenmodells.
create_camera_setup_modelCreateCameraSetupModelCreateCameraSetupModelcreate_camera_setup_model
Anlegen eines HALCON-Kameraaufbaumodells.
deserialize_calib_dataDeserializeCalibDataDeserializeCalibDatadeserialize_calib_data
Deserialisieren eines serialisierten Kalibrierdatenmodells.
deserialize_camera_setup_modelDeserializeCameraSetupModelDeserializeCameraSetupModeldeserialize_camera_setup_model
Deserialisieren eines serialisierten Kameraaufbaumodells.
get_calib_dataGetCalibDataGetCalibDataget_calib_data
Abfragen der Kalibrierdaten, -einstellungen und -ergebnisse eines Kalibrierdatenmodells.
get_calib_data_observ_contoursGetCalibDataObservContoursGetCalibDataObservContoursget_calib_data_observ_contours
Abfragen konturbasierter Beobachtungsdaten aus dem Kalibrierdatenmodell.
get_calib_data_observ_pointsGetCalibDataObservPointsGetCalibDataObservPointsget_calib_data_observ_points
Abfragen punktbasierter Beobachtungsdaten aus dem Kalibrierdatenmodell.
get_camera_setup_paramGetCameraSetupParamGetCameraSetupParamget_camera_setup_param
Abfragen generischer Kameraaufbaumodellparameter.
query_calib_data_observ_indicesQueryCalibDataObservIndicesQueryCalibDataObservIndicesquery_calib_data_observ_indices
Abfragen von Information zur Beziehung zwischen Kameras, Kalibrierkörpern und Kalibrierkörperposen.
read_calib_dataReadCalibDataReadCalibDataread_calib_data
Einlesen eines Kalibrierdatenmodells aus einer Datei.
read_camera_setup_modelReadCameraSetupModelReadCameraSetupModelread_camera_setup_model
Einlesen eines Kameraaufbaumodells aus einer Datei.
remove_calib_dataRemoveCalibDataRemoveCalibDataremove_calib_data
Entfernen eines Datensatzes aus dem Kalibrierdatenmodell.
remove_calib_data_observRemoveCalibDataObservRemoveCalibDataObservremove_calib_data_observ
Entfernen einer Beobachtung aus dem Kalibrierdatenmodell
serialize_calib_dataSerializeCalibDataSerializeCalibDataserialize_calib_data
Serialisieren eines Kalibrierdatenmodells.
serialize_camera_setup_modelSerializeCameraSetupModelSerializeCameraSetupModelserialize_camera_setup_model
Serialisieren eines Kameraaufbaumodells.
set_calib_dataSetCalibDataSetCalibDataset_calib_data
Setzen von Parametern für das Kalibrierdatenmodell.
set_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObjectset_calib_data_calib_object
Definieren des Kalibrierkörpers im Kalibrierdatenmodell.
set_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParamset_calib_data_cam_param
Definieren des Typs und der Startwerte für die internen Parameter der Kamera.
set_calib_data_observ_pointsSetCalibDataObservPointsSetCalibDataObservPointsset_calib_data_observ_points
Punktbasierte Beobachtungsdaten im Kalibrierdatenmodell speichern.
set_camera_setup_cam_paramSetCameraSetupCamParamSetCameraSetupCamParamset_camera_setup_cam_param
Definieren des Typs, der internen Parameter und der Pose einer Kamera im Kameraaufbaumodell.
set_camera_setup_paramSetCameraSetupParamSetCameraSetupParamset_camera_setup_param
Setzen von generischen Parametern im Kameraaufbaumodell.
write_calib_dataWriteCalibDataWriteCalibDatawrite_calib_data
Schreiben des Kalibrierdatenmodells in eine Datei.
write_camera_setup_modelWriteCameraSetupModelWriteCameraSetupModelwrite_camera_setup_model
Schreiben eines Kameraaufbaumodells in eine Datei.