Calibration Assistent

Zur Umrechnung von Bildpunkten in Weltpunkte ist eine geometrische Kamera-Kalibrierung erforderlich, bei der die dafür benötigten Parameter bestimmt werden. In diesem Beispiel wird die geometrische Kalibrierung einer Kamera mit Hilfe eines asymmetrischen Kreismusters und des Kalibrierungsassistenten gezeigt. Die Schritte können analog auch für die anderen Kalibriermuster (siehe Camera Calibration) durchgeführt werden. Lediglich Schritt 2 muss entsprechend angepasst werden.

Um dieses Beispiel durchzuführen, öffnen Sie zuerst das Projekt mit angelegter Kamera und danach den Kalibrierungsassistenten der Kamera-Instanz.

Calibration Assistent 1:

Schritt 1 – Bild-Akquise

Als erstes müssen Bilder des Kalibrationsmusters in den Assistenten geladen werden, die von der zu kalibrierenden Kamera gemacht wurden. Dies kann entweder über eine direkte Bildaufnahme mit der Kamera oder durch das Einladen von existierenden Bildern geschehen. Für dieses Beispiel finden Sie im zugehörigen Bildordner vier geeignete Bilder ImgCalibAsymCirclesx.bmp eines asymmetrischen Kreismusters. Laden Sie diese Bilder über Load Images... in den Kalibrierungsassistenten.

Calibration Assistent 2:

Schritt 2 – Asymmetrisches Kreismuster definieren

In diesem Beispiel wird als Kalibriermuster ein asymmetrisches Kreismuster genutzt. Um einen der anderen Mustertypen zu verwenden, beachten Sie die jeweilige Definition:

Für die eingeladenen Beispielbilder muss das asymmetrische Kreismuster im Kalibrierungsassistenten angewählt werden:

Calibration Assistent 3:

Bedingt durch die Asymmetrie ist entweder die erste (x1) oder die zweite (x2) Zeile des Kreismusters eingerückt. Da in diesem Fall die erste (x1) Zeile eingerückt ist, wählen Sie Start Indent.

Calibration Assistent 4:

Calibration Assistent 5:

Die Breite des Musters Width entspricht der Anzahl von Punkten/Kreisen in einer Zeile, während die Höhe Height der Zeilenanzahl entspricht. Bei Distance X wird der kürzeste Abstand in X-Richtung zwischen zwei Kreisen angegeben. Dies ist beim asymmetrischen Muster der Abstand zum nächsten Kreis in der darunter / darüber liegenden Zeile, Einzeichnung im Bild beachten. Der Abstand zwischen zwei Zeilen wird in Distance Y angegeben.

Calibration Assistent 6:

Der Assistent erwartet schwarze Kreise auf weißen Grund. Da in diesem Beispiel ein Muster bestehend aus weißen Kreisen auf schwarzen Grund verwendet wird, muss die Farbe invertiert werden, wählen Sie dazu Color inverted an.

Calibration Assistent 7:

Schritt 3 – Intrinsische Parameter berechnen

Nach der vollständigen Definition des Kalibriermusters können die intrinsischen Parameter über den Button Calibrate Intrinics berechnet werden. Anschließend sollte der Reproj. Error zwischen 0 und 1 liegen und die Kamera Matrix, sowie die Distortion Coefficients bestimmt sein.

Calibration Assistent 8:

Ist dies nicht der Fall, gibt der Tooltip beim Reproj. Error Hinweise auf den möglichen Fehler. Zudem wird unter C:\ProgramData\Beckhoff\Vision\_CalibrationAssistantOutput eine Bildserie erstellt, die weiteren Aufschluss auf die Erkennung des Musters gibt. Schreibrechte auf das Verzeichnis sind notwendig.

Schritt 4 – Extrinsische Parameter berechnen

Nach den intrinsischen Parametern können die extrinsischen Parameter berechnet werden. Dazu wird nur noch ein Bild verwendet, und zwar das Bild, bei dem sich das Muster in der Ebene befindet, auf der zum Beispiel später die Bauteile vermessen werden. Von den Beispielbildern ist dies das Erste. Klicken Sie daher das erste eingeladene Bild an, sodass es in der Bildvorschau erscheint.

Zudem kann der Nullpunkt des Musters Extrinsic Orgin angegeben werden. Standardmäßig ist dieser in der Mitte des Musters.

Calibration Assistent 9:

Über den Button Calibrate Extrinsics werden anschließend die Rotation Matrix und der Translation Vector berechnet. Die Ergebnisse finden Sie wieder unter Results.

Calibration Assistent 10:

Schritt 5 – Ergebnisse in den Image Provider der Kamera schreiben

War die Kalibrierung erfolgreich, können Sie die Ergebnisse über Write Results in den Image Provider der Kamera schreiben. Dieser Schritt ist nötig, damit der Kamera-Funktionsbaustein FB_VN_GevCameraControl in der SPS auf die Kalibrationsergebnisse zugreifen kann.

Calibration Assistent 11:

Im Image Provider sind die Kalibrierungsergebnisse unter Parameter (Init) zu finden, wenn Show Hidden Parameter ausgewählt ist.

Calibration Assistent 12:

Achten Sie darauf, nach diesem Schritt durch einen Klick auf Calibration Assistent 13: die Konfiguration zu aktivieren. Anderenfalls stehen die Kalibrationsergebnisse nicht in der SPS zur Verfügung.

Schritt 6 – Kalibrationsergebnisse in die SPS laden

Über den Funktionbaustein FB_VN_GevCameraControl können Sie die Kalibrierungsparameter in die SPS laden:

Variablen

hr                        :   HRESULT;
fbCamera                  :   FB_VN_GevCameraControl;
aCameraMatrix             :   TcVnMatrix3x3_LREAL;
aDistortionCoefficients   :   TcVnArray8_LREAL;
aRotationMatrix           :   TcVnMatrix3x3_LREAL;
aTranslationVector        :   TcVnVector3_LREAL;

Code

hr := fbCamera.GetCameraMatrix(aCameraMatrix);
hr := fbCamera.GetDistortionCoefficients(aDistortionCoefficients);
hr := fbCamera.GetRotationMatrix(aRotationMatrix);
hr := fbCamera.GetTranslationVector(aTranslationVector);

Schritt 7 – Bildpunkte in Weltkoordinaten transformieren

Anschließend bestimmen Sie zum Beispiel mit der Funktion F_VN_TransformCoordinatesImageToWorld_Points von einem Punkt im Bild die Koordinaten in der realen Welt in Bezug auf den Nullpunkt des Kalibriermusters:

Variablen

aPointImage               :   TcVnPoint2_LREAL;
aPointWorld               :   TcVnPoint3_LREAL

Code

hr := F_VN_TransformCoordinatesImageToWorld_Point(
        aSrcPoint                 :=  aPointImage,
        aDestPoint                :=  aPointWorld,
        aCameraMatrix             :=  aCameraMatrix,
        aDistortionCoefficients   :=  aDistortionCoefficients,
        aRotationMatrix           :=  aRotationMatrix,
        aTranslationVector        :=  aTranslationVector,
        fZ                        :=  0,
        hrPrev                    :=  hr);

Schritt 8 – Weltpunkte in Bildkoordinaten transformieren.

Ebenso kann diese Transformation mit der Funktion F_VN_TransformCoordinatesWorldToImage_Points umgekehrt erfolgen, sodass Punkte aus dem Weltkoordinatensystem so transformiert werden, dass sie an der korrekten Stelle im Bild dargestellt werden können. Dies ist sinnvoll, um Hilfslinien zur besseren Orientierung im Bild anzuzeigen. Im folgend dargestellten Code wird damit das Weltkoordinatensystem ins Bild eingezeichnet.

Variablen

i                         :   INT;
aLine                     :   TcVnVector4_DINT;
aCoordinatesWorld         :   ARRAY[0..4] OF TcVnPoint3_LREAL := [ [0,0,0], [50,0,0], [-50, 0, 0], [0, 50, 0], [0, -50, 0] ];
aCoordinatesImage         :   ARRAY[0..4] OF TcVnPoint2_REAL;

Code

FOR i:= 0 TO 4 DO
    hr := F_VN_TransformCoordinatesWorldToImage_Point(
            aSrcPoint                :=  aCoordinatesWorld[i],
            aDestPoint               :=  aCoordinatesImage[i],
            aCameraMatrix            :=  aCameraMatrix,
            aDistortionCoefficients  :=  aDistortionCoefficients,
            aRotationMatrix          :=  aRotationMatrix,
            aTranslationVector       :=  aTranslationVector,
            hrPrev                   :=  hr);

    IF i > 0 THEN
        aLine[0] := REAL_TO_DINT(aCoordinatesImage[0][0]);
        aLine[1] := REAL_TO_DINT(aCoordinatesImage[0][1]);
        aLine[2] := REAL_TO_DINT(aCoordinatesImage[i][0]);
        aLine[3] := REAL_TO_DINT(aCoordinatesImage[i][1]);
    hr := F_VN_DrawLine_TcVnVector4_DINT(aLine , ipImageRes, aColorGreen, 3, hr);
    END_IF
END_FOR

Schritt 9 – Ergebnisse ansehen

Wenn das Programm ausgeführt wird, muss zunächst noch das Abspielen des Kamera-Streams gestartet werden. Öffnen Sie dazu den Karteireiter Record/Playback des Kamera-Objekts, wählen die CameraSimulation.tcs Datei im entsprechenden Bildordner aus und starten das Playback.

Danach kann das Ergebnisbild im ADS Image Watch begutachtet werden. Man erkennt die eingezeichneten Koordinatenachsen und die ermittelten Weltkoordinaten der einzelnen Punkte auf dem Bild.

Calibration Assistent 14:

Wenn Sie bei der extrinsischen Kalibrierung in Schritt 4 ein anderes Bild verwenden oder einen anderen Koordinatenursprung verwenden, sieht das Ergebnis entsprechend anders aus. Der Koordinatenachsen sind verschoben und die Weltkoordinaten der Bildpunkte sind auch angepasst.

Calibration Assistent 15: