KlassenKlassenKlassenKlassen | | | | Operatoren

calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras (Operator)

Name

calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras — Kalibrieren einer oder mehrerer Kameras.

Signatur

calibrate_cameras( : : CalibDataID : Error)

Herror calibrate_cameras(const Hlong CalibDataID, double* Error)

Herror T_calibrate_cameras(const Htuple CalibDataID, Htuple* Error)

Herror calibrate_cameras(const HTuple& CalibDataID, double* Error)

double HCalibData::CalibrateCameras() const

void CalibrateCameras(const HTuple& CalibDataID, HTuple* Error)

double HCalibData::CalibrateCameras() const

void HOperatorSetX.CalibrateCameras(
[in] VARIANT CalibDataID, [out] VARIANT* Error)

double HCalibDataX.CalibrateCameras()

static void HOperatorSet.CalibrateCameras(HTuple calibDataID, out HTuple error)

double HCalibData.CalibrateCameras()

Beschreibung

Der Operator calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras kalibriert einen Aufbau von einer oder mehreren Kameras aufgrund der im Kalibrierdatenmodell gespeicherten Daten. CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID. Das Kalibrierverfahren hängt von dem generischen Kalibrieraufbautyp ab, der mit CalibSetup beim Erstellen des Modells mit dem Operator create_calib_datacreate_calib_dataCreateCalibDatacreate_calib_dataCreateCalibDataCreateCalibData festgesetzt ist. Zur Zeit wird nur der Aufbautyp 'calibration_object'"calibration_object""calibration_object""calibration_object""calibration_object""calibration_object" unterstützt.

In diesem Aufbau werden eine oder mehrere Kameras kalibriert, d.h. ihre internen Parameter (z.B. Brennweite) und ihre Posen relativ zum Koordinatensystem der so genannten Referenzkamera berechnet (siehe den Abschnitt Zu Grunde liegendes 3D-Kameramodell für detailliertere Beschreibung des verwendeten 3D-Punktprojektionsmodells). Hierfür werden ein oder mehrere Kalibrierkörper (z.B. die HALCON-Kalibrierplatte) vor die Kameras gelegt. Diese Körper haben bekannte und präzise metrische Eigenschaften. Die Kalibrierkörper werden von den Kameras beobachtet, wobei sie sich in unterschiedlichen Kalibrierkörperposen befinden, d.h. die Kameras nehmen ein Bild in jeder ihrer Posen auf und extrahieren die metrische Information. Es is zu beachten, dass nur Kameras desselben Kameratyps in einem Kalibrieraufbau kalibriert werden. Außerdem können Zeilenkameras nur alleine (NumCameras=1) im Aufbau kalibriert werden.

Die Kamerakalibrierung entspricht einer Optimierung, bei der die internen Parameter und die Posen der Kameras, sowie die Posen der Kalibrierkörper so bestimmt werden, dass die Rückprojektion der modellierten Kalibrierkörpermerkmale in die modellierten Kameras am besten zu den beobachteten Punktprojektionen passen. Es ist zu beachten, dass die Startwerte für die internen Kameraparameter im Voraus eingegeben werden müssen. Die Startposen der Kameras und der Kalibrierkörper werden dagegen am Anfang nicht benötigt. Stattdessen wird für jede Beobachtung eine grob geschätzte Pose des beobachteten Kalibrierkörpers relativ zu der beobachtenden Kamera benötigt. Von diesen Posen werden die Kamera- und Kalibrierkörperstartposen zu Beginn des Kalibrierungsprozesses im Operator calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras bestimmt (siehe den Abschnitt "Die tatsächliche Kalibrierung durchführen" für weitere Informationen).

Vorbereitung der Eingabekalibrierdaten

Bevor der Operator calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras aufgerufen wird, müssen 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_dataCreateCalibDatacreate_calib_dataCreateCalibDataCreateCalibData, 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_paramSetCalibDataCamParamset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParam.

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

  4. Sammeln von Beobachtungen mit dem Operator set_calib_data_observ_pointsset_calib_data_observ_pointsSetCalibDataObservPointsset_calib_data_observ_pointsSetCalibDataObservPointsSetCalibDataObservPoints, d.h. die Bildkoordinaten der extrahierten Kalibrierkörpermarker und eine grob geschätzte Pose des Kalibrierkörpers relativ zur beobachtenden Kamera.

  5. Kalibrierungsprozess konfigurieren, z.B. die Referenzkamera setzen oder bestimmte interne oder externe Kameraparameter von der Optimierung ausschließen. Kalibrierungseinstellungen für den ganzen Aufbau oder für einzelne Kameras bzw. Kalibrierkörperposen können mit dem Operator set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData angepasst werden.

    Wenn bestimmte Kameraparameter bekannt sind, z.B. die Zellgrößen des Kamerasensors, brauchen sie nicht kalibriert 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 Kameratyp, welcher im Aufbau kalibriert wird, führt calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras die Kalibrierung auf zwei unterschiedliche Weisen durch.

Für projektive Flächenkameras ('area_scan_division'"area_scan_division""area_scan_division""area_scan_division""area_scan_division""area_scan_division" und 'area_scan_polynomial'"area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial""area_scan_polynomial") wird die Kalibrierung in vier Schritten durchgeführt. Erstens versucht der Algorithmus eine Kette von Beobachtungsposen zu bauen, welche alle Kameras und Kalbirierobjektposen verbindet, z.B.:

        obs[0,0,0]            obs[1,0,0]     obs[1,0,1]           obs[2,0,1]      obs[2,..]
  camera[0] -> calib_obj_pose[0,0] <- camera[1] -> calib_obj_pose[0,1] <- camera[2] -> ...
(ref_camera)

Wenn eine Kamera nicht erreicht werden kann (d.h. die Kamera beobachtet keine Kalibrierkörperpose, die in der Kette eingegliedert ist), wird der Kalibrierungsprozess abgebrochen und ein Fehler zurückgegeben. Ansonsten initialisiert der Algorithmus die Posen aller Objekte im Aufbau beim Durchlaufen der Kette. Im zweiten Schritt optimiert calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras alle Kamera- und Kalibrierkörperposeparameter, die nicht explizit aus der Optimierung ausgeschlossen wurden. Im dritten Schritt korrigiert der Algorithmus anhand des soweit kalibrierten Kameraaufbaus jene Beobachtungen, die Konturdaten enthalten (siehe find_calib_objectfind_calib_objectFindCalibObjectfind_calib_objectFindCalibObjectFindCalibObject), und kalibriert den Aufbau zur Berücksichtigung der Korrekturen erneut. Sollten keine Kontourbeobachtungsdaten im Modell vorhanden sein, wird dieser Schritt übersprungen. Im letzten Schritt berechnet calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras die Standardabweichungen und die Kovarianzen der kalibrierten Kameraparameter.

Für 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" oder 'area_scan_telecentric_polynomial'"area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial""area_scan_telecentric_polynomial") werden dieselben vier Schritte durchlaufen wie bei den projektiven Flächenkameras. Für den ersten Schritt (Aufbau einer Kette von Beobachtungen, die alle Kameras und Kalibrierobjektposen verbindet) gelten 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. Kann die relative Lage der Kameras nicht bestimmt werden, liefert die Kalibrierung einen entsprechenden Fehler. Man kann das System mit zusätzlichen Kalibrierkörpern erweitern solange sie von allen Kameras gesehen werden oder weitere Kameras hinzufügen sofern diese alle Kalibrierkörper sehen.

Falls nicht jede Kamera jeden Kalibrierkörper beobachtet, muss eine zusätzliche Voraussetzung erfüllt werden. Dies kann nur für vier oder mehr Kameras auftreten. Hierfür wird der Kalibrieraufbau so in mehrere Teilsysteme zerlegt, dass in jedem Teilsystem jeder Kalibrierkörper von jeder Kamera des Teilsystems beobachtet wird. Zwei Teilsysteme werden verbunden, wenn sie sich gegenseitig überlappen, d.h. wenn in jedem System mindestens eine Kamera einen Kalibrierkörper im anderen Teilsystem beobachtet. Können nicht alle Teilsysteme verkettet werden liefert die Kalibrierung einen Fehler.

Für Zeilenkameras, ('line_scan'"line_scan""line_scan""line_scan""line_scan""line_scan"), ruft der Operator intern den Operator camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration auf. Dadurch bleiben einige Beschränkungen des Operators camera_calibrationcamera_calibrationCameraCalibrationcamera_calibrationCameraCalibrationCameraCalibration erhalten: Neben der bereits erwähnten Beschränkung auf nur eine Kamera pro Aufbau werden keine Beobachtungen akzeptiert, in denen nicht alle Kalibrierkörpermarker extrahiert wurden. Darüber hinaus werden keine Informationen über die Standardabweichungen und die Kovarianzen der Kameraparameter erfasst.

Ergebnisse der Kalibrierung überprüfen

Nach erfolgreicher Kalibrierung gibt der Operator calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras die Wurzel des mittleren quadratischen Rückprojektionsfehlers der Optimierung im Parameter ErrorErrorErrorErrorErrorerror (in Pixel) zurück. Dieser Fehler gibt einen allgemeinen Hinweis dafür, ob die Optimierung erfolgreich war.

Bei der Kalibierung 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örpermarker) ein Hinweis dafür, dass die Optimierung gut zu den Beobachtungsdaten passt. Wenn der Fehler stark von 0.1 Pixel abweicht, 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 Kalbrierung mehrerer Kameras ist der Wert von dem Fehler schwieriger zu beurteilen. Als Daumenregel 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 Kalibrierungsqualität kann anhand der zurückgegebenen Standardabweichungen und Kovarianzen der Kameraparameter erfolgen (zur Zeit nur für projektive Flächenkameras siehe get_calib_dataget_calib_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData).

Kalibrierungsergebnisse 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_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData 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.

Zu Grunde liegendes 3D-Kameramodell

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_3daffine_trans_point_3dAffineTransPoint3daffine_trans_point_3dAffineTransPoint3dAffineTransPoint3d):

  /      \     / 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:

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 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 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*d^2 + K2*d^4 + K3*d^6) +
            2*P1*u'*v' + P2*(d^2 + 2*u'^2)

   v = v' + v'*(K1*d^2 + K2*d^4 + K3*d^6) +
            P1*(d^2 + 2*v'^2) + 2*P2*u'*v'

   with: d = 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.

Zum Schluss wird der Punkt vom Koordinatensystem der Bildebene ins Pixelkoordinatensystem transformiert:

    r = v' / Sy + Cy
    c = u' / Sx + Cx

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 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 vom Operator find_calib_objectfind_calib_objectFindCalibObjectfind_calib_objectFindCalibObjectFindCalibObject auch nur die Pose der ersten Bildzeile bestimmt (und von calibrate_camerascalibrate_camerasCalibrateCamerascalibrate_camerasCalibrateCamerasCalibrateCameras in den Kalibrierergebnissen gespeichert).

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

Achtung

Ein Kalibrierdatenmodell CalibDataID kann nur von einem Thread aus verwendet werden. Verschiedene Kalibrierdatenmodelle können dagegen in unterschiedlichen Threads genutzt werden.

Parallelisierung

Parameter

CalibDataIDCalibDataIDCalibDataIDCalibDataIDCalibDataIDcalibDataID (input_control)  calib_data HCalibData, HTupleHTupleHCalibData, HTupleHCalibDataX, VARIANTHtuple (integer) (IntPtr) (Hlong) (Hlong) (Hlong) (Hlong)

Handle des Kalibrierdatenmodells.

ErrorErrorErrorErrorErrorerror (output_control)  number HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)

Wurzel des mittleren quadratischen Rückprojektionsfehlers der Optimierung.

Vorgänger

create_calib_datacreate_calib_dataCreateCalibDatacreate_calib_dataCreateCalibDataCreateCalibData, set_calib_data_cam_paramset_calib_data_cam_paramSetCalibDataCamParamset_calib_data_cam_paramSetCalibDataCamParamSetCalibDataCamParam, set_calib_data_calib_objectset_calib_data_calib_objectSetCalibDataCalibObjectset_calib_data_calib_objectSetCalibDataCalibObjectSetCalibDataCalibObject, set_calib_data_observ_pointsset_calib_data_observ_pointsSetCalibDataObservPointsset_calib_data_observ_pointsSetCalibDataObservPointsSetCalibDataObservPoints, find_calib_objectfind_calib_objectFindCalibObjectfind_calib_objectFindCalibObjectFindCalibObject, set_calib_dataset_calib_dataSetCalibDataset_calib_dataSetCalibDataSetCalibData

Nachfolger

get_calib_dataget_calib_dataGetCalibDataget_calib_dataGetCalibDataGetCalibData

Literatur

J. Heikillä: „Geometric Camera Calibration Using Circular Control Points“; PAMI-22, no. 6; pp. 1066-1077; 2000.

Modul

Calibration


KlassenKlassenKlassenKlassen | | | | Operatoren