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.
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.
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:
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.
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.
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.
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.
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.
Über den Button Calibrate Extrinsics werden anschließend die Rotation Matrix und der Translation Vector berechnet. Die Ergebnisse finden Sie wieder unter Results.
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.
Im Image Provider sind die Kalibrierungsergebnisse unter Parameter (Init) zu finden, wenn Show Hidden Parameter ausgewählt ist.
Achten Sie darauf, nach diesem Schritt durch einen Klick auf 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.
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.