Geometric Vision mit Ladybug-Kameras
Effektives Entzerren und Zusammenfügen der Bilder der sechs Sensoren des Kamerasystems wird erreicht durch die präzise Kalibrierung der geometrischen Positionen und Orientierungen der Sensoren sowie die Verzerrungsmodelle der Objektive. Dank dieser Kalibrierung lassen sich die Bilddaten photogrammetrisch analysieren. Dieser Anwendungshinweis beschreibt die Zuordnung zwischen dem Kamerakoordinatensystem und einzelnen Sensoren.
Koordinatensysteme auf Ladybug-Kameras
Jedes Objektiv verfügt über ein eigenes rechtshändiges 3D-Koordinatensystem. Außerdem gibt es ein Ladybug-3D-Koordinatensystem, das der Kamera als Ganzes zugeordnet ist. Das sind insgesamt sieben 3D-Koordinatensysteme auf jeder Ladybug-Kamera. Außerdem gibt es für jeden Sensor ein 2D-Pixel-Raster-Koordinatensystem.
3D-Koordinatensystem des Objektivs
Jedes der sechs Objektive verfügt über ein eigenes 3D-Koordinatensystem.
- Ursprung ist das optische Zentrum des Objektivs.
- Die Z-Achse zeigt aus dem Sensor in Richtung Szene, d. h., sie ist die optische Achse.
- Die X- und Y-Achsen sind relativ zum Pixelraster des Bildsensors, der diesem Objektiv zugeordnet ist.
- Die Y-Achse zeigt entlang der Bildspalten. Die positive Y-Richtung verläuft in Richtung aufsteigender Zeilennummern. Dies zeigt aus der Sicht eines normal ausgerichteten Bildes nach unten.
- Die X-Achse zeigt entlang der Bildzeilen. Die positive X-Richtung verläuft in Richtung aufsteigender Spaltennummern. Dies zeigt in einem normal ausgerichteten Bild nach rechts.
- Dieses Koordinatensystem wird verwendet, um den 3D-Raum aus der Sicht jedes Objektiv-Sensor-Paares darzustellen. Die Einheiten sind Meter, keine Pixel.
Abbildung 1: 3D-Sensor-Koordinaten
Sensor-2D-Koordinatensystem
Jeder Sensor verfügt über ein eigenes 2D-Koordinatensystem.
- Die u- und v-Achsen sind das bildbasierte 2D-Bildkoordinatensystem für den entzerrten Bildraum und werden in Pixeln gemessen.
- Der Ursprung des Koordinatensystems befindet sich am Schnittpunkt der optischen Achse und der entzerrten Bildebene und ist für jeden Sensor unterschiedlich.
- Die u-Achse zeigt entlang der Zeilen des Bildsensors in Richtung aufsteigender Spaltennummer (d. h. nach rechts).
- Die v-Achse zeigt entlang der Spalten in Richtung aufsteigender Zeilennummer (d. h. nach unten).
Abbildung 2: 2D-Sensor-Koordinaten
Ladybug-Kamerakoordinatensystem
Das Ladybug-Kamerakoordinatensystem ist im Ladybug-Gehäuse zentriert und wird durch die Position der sechs Objektiv-Koordinatensysteme bestimmt.
- Der Ursprung ist das Zentrum der fünf horizontalen Kameraursprünge.
- Die Z-Achse verläuft parallel zur optischen Achse des oberen Objektivs (Objektiv 5) (*).
- Die X-Achse verläuft parallel zur optischen Achse von Objektiv 0 (*).
- Die Y-Achse entspricht einem rechtshändigen Koordinatensystem, das auf den X- und Z-Achsen basiert.
- Es kann einige Variationen von LD2 – LD3 – LD5 geben.
- (*) Hinweis – Aufgrund der Montagetoleranzen sind die optischen Achsen von Objektiv 5 und Objektiv 0 typischerweise nicht perfekt senkrecht. Die X-Achse des Ladybug-Kamerakoordinatensystems wird leicht angepasst, um sicherzustellen, dass sie senkrecht sind.
Abbildung 3: Globale Koordinaten
Zugehörige Objektiv-Koordinatensysteme und das Ladybug-Koordinatensystem
Die Position jedes Objektiv-Koordinatensystems relativ zum Ladybug-Koordinatensystem ist über die Ladybug API abrufbar. Verwenden Sie zunächst ladybugGetCameraUnitExtrinsics(), definiert in ladybuggeom.h, um die 3D-Translation und die durch den Euler-Winkel definierte Rotation abzurufen.
/**
* Ruft den extrinsischen 6-D-Vektor für die angegebene Kameraeinheit ab.
*
* Der extrinsische Vektor 6-D ist in der EulerZYX-Konvention (siehe Craig
* Introduction to Robotics S. 45–49). Die Anordnungen der extrinsischen
* Komponenten sind:
*
* – Element 0 – Rx – Drehung um X (rad)
* – Element 1 – Ry – Drehung um Y (rad)
* – Element 2 – Rz – Drehung um Z (rad)
* – Element 3 – Tx – Translation entlang X (Meter)
* – Element 4 – Ty – Translation entlang Y (Meter)
* – Element 5 – Ty – Translation entlang Z (Meter)
*
* Mit extrinsisch meinen wir, dass die entsprechende 4x4-Transformationsmatrix
* die Zuordnung eines Punktes in den Koordinaten der lokalen Kameraeinheit zu demjenigen
* des Ladybug-Koordinatenrahmens ermöglicht. Wenn s=sin und c=cos sind, ist das Format der
* Matrix unten angegeben.
*
* Beispiel:
* Um dies Craigs Matrix zuzuordnen:
* – Rz = alpha
* – Ry = beta
* – Rx = gamma
*
* – |X'| |((cRz)(cRy)) ((cRz)(sRy)(sRx)-(sRz)(cRx)) ((cRz)(sRy)(cRx)+(sRz)(sRx)) Tx||X|
* – |Y'|=|((sRz)(cRy)) ((sRz)(sRy)(sRx)+(cRz)(cRx)) ((sRz)(sRy)(cRx)-(cRz)(sRx)) Ty||Y|
* – |Z'| |((-sRy)) ((cRy)(sRx)) ((cRy)(cRx))) Tz||Z|
* – |1 | |0 0 0 1 ||1|
*
* @param context – Aufzurufender LadybugContext.
* @param uiCamera – Kameraindex von Interesse.
* @param ardEulerZYX – Der zurückgegebene extrinsische 6-D EulerZYX Vektor.
*
* @return – Ein LadybugError zeigt den Erfolg der Funktion an.
*/
LADYBUGDLL_API LadybugError
ladybugGetCameraUnitExtrinsics(
LadybugContext context,
unsigned int uiCamera,
double ardEulerZYX[6] );
Beachten Sie, dass die Funktionskommentare veranschaulichen, wie die bereitgestellten Euler-Winkel (Rx, Ry, Rz) und die Translation (Tx, Ty, Tz) in eine 4x4-Transformation T umgewandelt werden. Dafür wird eine homogene Standard-Transformationsformulierung verwendet:
Wenn im entsprechenden Koordinatensystem ist.
Sobald diese homogene Transformation abgerufen wurde, kann sie verwendet werden, um den Ursprung des Objektivkoordinatenrahmens im Ladybug-Koordinatenrahmen oder die Achsen des Objektivkoordinatenrahmens im Ladybug-Koordinatenrahmen zu berechnen und umgekehrt.
Umwandlung einer Pixelposition in einen 3D-Strahl
Eine häufige Aufgabe bei der Verwendung der Ladybug-Kamera für Geometric Vision ist die Interpretation einer Pixelposition in einem bestimmten Bild zu einem 3D-Strahl im Ladybug-Koordinatensystem. Es gibt eine Vielzahl von Bildräumen, aus denen das Pixel extrahiert werden kann, beispielsweise kugelförmig, zylindrisch, entzerrt oder roh. Es wird empfohlen, für diese Art von Anwendung Rohbilder zu verwenden. Rohbilder sind die einzigen Bilder, die nicht erneut abgetastet wurden. Daher sollten sie die beste Genauigkeit bei der Suche oder Verfolgung von Bildmerkmalen bieten.
Um eine Pixelposition in einem Rohbild in einen 3D-Strahl im Ladybug-Koordinatensystem umzuwandeln, sollten die folgenden Schritte durchgeführt werden:
1. Mit ladybugGetCameraUnitFocalLength() die Brennweite für die entsprechende Kamera ermitteln
2. Das Bildzentrum für die Kamera mit ladybugGetCameraUnitImageCenter() ermitteln
3. Den 6D-Extrinsikvektor (Euler-Winkel und Translation) für die Kamera mit ladybugGetCameraUnitExtrinsics() ermitteln
4. 2D-Pixelposition mit ladybugRectifyPixel() entzerren
5. Die (u,v) Pixelkoordinate für diese entzerrte Bildposition suchen
6. Die entzerrte 2D-Pixelposition in einen 3D-Strahl innerhalb des lokalen Kamerakoordinatensystems umwandeln
7. Den lokalen 3D-Strahl in einen 3D-Strahl im Ladybug-Koordinatensystem umwandeln
Um die (u,v) Pixelposition von einer entzerrten Bildposition (Spalte, Reihe) zu finden, müssen die Bildzentrumsinformationen berücksichtigt werden:
Wenn dies gleich der Pixelzeilenposition und gleich der Bildmittelzeilenposition ist.
Die entzerrte Bildposition (u,v) kann durch Interpretieren des entzerrten Bildes unter Verwendung des Standard-Pinhole-Kameramodells in einen lokalen 3D-Strahlenwert umgewandelt werden. Beachten Sie, dass die für die Kamera erhaltene Brennweite und Bildmitte in Pixeln angegeben ist und nur für das entzerrte Bild der angegebenen Kamera gültig ist. Zur Berechnung des lokalen 3D-Strahlens aus der entzerrten 2D-Pixelposition ist Z willkürlich und kann auf 1 gesetzt werden. Die Pin-Hole-Modellgleichungen ergeben:
Den Vektor . Um diesen Vektor in das Ladybug-Koordinatensystem umzuwandeln, wendet man einfach die 3x3-Rotationskomponente der in Abschnitt 1.5 gezeigten homogenen Transformation an:
Wenn R die obere linke 3x3-Submatrix von T ist. Der Ursprung dieses Vektors ist der Ursprung des lokalen Koordinatensystems, das in das Ladybug-Kamerakoordinatensystem umgewandelt wird, oder
Umwandeln einer Pixelposition in einen 3D-Strahl, der für den Objektivversatz korrigiert wurde
Die Zuordnung eines 2D-Rohpixels zu einem 3D-Strahl wird dadurch erschwert, dass jedes Objektivzentrum von der Mitte des Ladybug-Koordinatensystems versetzt ist. Um die genauesten Ergebnisse zu erzielen, muss der Strahl sowohl einen Ausgangspunkt als auch eine Richtung haben, nicht nur eine Richtung von der Mitte des Ladybug-Koordinatensystems.
Die Zuordnung eines Rohpixels erfolgt in zwei Schritten:
1. Zuordnung des Rohpixels zu seinen entzerrten Koordinaten – API: ladybugRectifyPixel()
/**
* Ordnet eine verzerrte (rohe) Pixelposition dem entsprechenden Punkt im
* entzerrten Bild zu.
*
* Diese Funktion muss nach ladybugSetOffScreenImageSize() aufgerufen werden, die
* die Auflösung entzerrter Bilder festlegt.
*
* @param context – Aufzurufender LadybugContext.
* @param uiCamera – Kameraindex, dem dieses Bild entspricht.
* @param dDistortedRow – Zeilenkoordinate des zuzuordnenden verzerrten (rohen) Pixels.
* @param dDistortedCol – Spaltenkoordinate des zuzuordnenden verzerrten (rohen) Pixels.
* @param pdRectifiedRow – Position zur Rückgabe der Zeilenkoordinate desselben Punktes
* im entzerrten Bild.
* @param pdRectifiedCol – Position zur Rückgabe der Spaltenkoordinate desselben
* Punktes im entzerrten Bild.
*
* @return – Ein LadybugError zeigt den Erfolg der Funktion an.
* LADYBUG_OVEREXPOSED wird zurückgegeben, wenn der Durchschnitt der ausgewählten Region die
* Intensität 254/255 für jeden Kanal überschreitet.
*
* @see ladybugSetOffScreenImageSize()
*/
LADYBUGDLL_API LadybugError
ladybugRectifyPixel(
LadybugContext context,
unsigned int uiCamera,
double dDistortedRow,
double dDistortedCol,
double* pdRectifiedRow,
double* pdRectifiedCol
2. Zuordnung der entzerrten Koordinaten zu einer Strahlposition und -richtung – API: ladybugRCtoXYZ()
/**
* Projiziert einen 2D-Punkt auf einer bestimmten Kameraeinheit in einen 3D-Strahl im Ladybug-
* Koordinatenrahmen. Der Strahl ist als Ausgangspunkt und Richtung definiert.
* Der Startpunkt berücksichtigt den Versatz der Kameraeinheit zur
* Mitte der Ladybug-Kamera, die eine genaue Projektion des
* Strahls in Abständen ermöglicht, die sich vom Stitching-Radius unterscheiden.
*
* @param context – Aufzurufender LadybugContext.
* @param dRectifiedRow – Die entzerrte Zeile des 2D-Eingangspunkts.
* @param dRectifiedCol – Die entzerrte Spalte des 2D-Eingangspunkts.
* @param uiCamera – Die Kameraeinheit.
* @param pdLocationX – Die X-Komponente der Ausgangsstrahlposition.
* @param pdLocationY – Die Y-Komponente der Ausgangsstrahlposition.
* @param pdLocationZ – Die Z-Komponente der Ausgangsstrahlposition.
* @param pdDirectionX – Die X-Komponente der Ausgangsstrahlenrichtung.
* @param pdDirectionY – Die X-Komponente der Ausgangsstrahlenrichtung.
* @param pdDirectionZ – Die X-Komponente der Ausgangsstrahlenrichtung.
*
* @return – Ein LadybugError zeigt den Erfolg der Funktion an.
*/
LADYBUGDLL_API LadybugError
ladybugRCtoXYZ(
LadybugContext context,
double dRectifiedRow,
double dRectifiedCol,
unsigned int uiCamera,
double* pdLocationX,
double* pdLocationY,
double* pdLocationZ,
double* pdDirectionX,
double* pdDirectionY,
double* pdDirectionZ);
Beispielcode für diesen und andere Zuordnungstypen, die nicht so stark auf die API-Funktionalität angewiesen sind, ist im Beispiel ladybugTranslate2dTo3d verfügbar, das im Ladybug SDK enthalten ist.
Umwandlung eines 3D-Punkts in eine Pixelposition
Die Umkehrung des in den Abschnitten 1.6 und 1.7 beschriebenen Pixel-zu-3D-Problems wird durch die Notwendigkeit, erst herausfinden zu müssen, in welches Objektiv ein 3D-Punkt projiziert wird, leicht erschwert. Ansonsten ist es über die Funktion ladybugXYZtoRC() unkompliziert. Die Informationen zur Funktionskopfzeile finden Sie unten.
/**
* Projiziert einen 3D-Punkt (in Bezug auf die Ladybug-Koordinatenrahmen) auf
* die angezeigte Kameraeinheit und kehrt zurück zum entzerrten
* Bild.
*
* @param context – Aufzurufender LadybugContext.
* @param dLadybugX – X-Koordinate des zu projizierenden Punktes.
* @param dLadybugY – Y-Koordinate des zu projizierenden Punktes.
* @param dLadybugZ – Z-Koordinate des zu projizierenden Punktes.
* @param uiCamera – Kameraindex, dem dieses Bild entspricht.
* @param pdRectifiedRow – Die zurückgegebene entzerrte Zeilenposition, an der der 3D-Punkt liegt
* (ist kleiner als 0, wenn der Punkt nicht
* auf das entzerrte Bild projiziert wird).
* @param pdRectifiedCol – Die zurückgegebene entzerrte Spaltenposition, an der der 3D-Punkt liegt
* (ist kleiner als 0, wenn der Punkt nicht
* auf das entzerrte Bild projiziert wird).
* @param pdNormalized – Der Abstand vom entzerrten Pixel zum Brennpunkt,
* normalisiert durch die Brennweite. Kann auf NULL gesetzt werden, wenn
* der Anrufer nicht an diesem Wert interessiert ist.
*
* @return – Ein LadybugError zeigt den Erfolg der Funktion an.
*/
LADYBUGDLL_API LadybugError
ladybugXYZtoRC(
LadybugContext context,
double dLadybugX,
double dLadybugY,
double dLadybugZ,
unsigned int uiCamera,
double* pdRectifiedRow,
double* pdRectifiedCol,
double* pdNormalized);
Um zu bestimmen, in welche Objektive ein 3D-Punkt projiziert wird, kann diese Funktion für jede der sechs Objektivpositionen verwendet werden (durch entsprechende Einstellung des Parameters uiCamera). Wenn der Rückgabecode erfolgreich ist (LADYBUG_OK), projiziert der durch dLadybugX, Y und Z definierte 3D-Punkt in die Kamera uiCamera in der entzerrten Zeile in der Spaltenposition, die von pdRectifiedRow und pdRectifiedCol bereitgestellt wird. Die Position des Pixels im Rohbild kann mithilfe von ladybugUnrectifypPixel bestimmt werden.
Genauigkeit der Kalibrierung
Die durchschnittliche Genauigkeit einer Ladybug-Kamera beträgt 2 mm bei einem Abstand von 10 m oder 0,0116 Grad, wie unten dargestellt.
Transformationsfehler lokal zu Ladybug
Es gibt einen Fehler in Bezug darauf, wie gut das mathematische Modell mit der tatsächlichen Position und Ausrichtung des Objektivs in Bezug auf das Ladybug-Kamerakoordinatensystem übereinstimmen kann. Dies bezieht sich auf die Differenz zwischen der tatsächlichen physischen Position und der während der Kamerakalibrierung berechneten Position.
Dies bezieht sich auf:
Zugehörige Objektiv-Koordinatensysteme und das Ladybug-Koordinatensystem
Umwandlung eines 3D-Punkts in eine Pixelposition
Fehler bei der Entzerrung
Es gibt einen Fehler, der damit verknüpft ist, wie gut das mathematische Modell mit der zugrunde liegenden Objektivverzerrung übereinstimmen kann.
Dies bezieht sich auf:
Umwandlung einer Pixelposition in einen 3D-Strahl
Umwandlung eines 3D-Punkts in eine Pixelposition
Fehler: Parallaxe zum Mittelpunkt der Kamera
Der Parallaxenfehler ist eine zusätzliche Fehlerquelle, die nicht in der oben angegebenen Genauigkeit von 2 mm bei 10 m enthalten ist.
Der Parallaxenfehler ist der Unterschied zwischen zwei Strahlen, die von zwei verschiedenen Startpositionen auf das gleiche Ziel zeigen. In diesem Fall liegt der Positionsunterschied zwischen dem Objektivzentrum und dem Kamerakoordinatenzentrum.
Die folgenden Diagramme zeigen die Winkeldifferenz, die den gleichen Punkt im 3D-Raum zwischen dem Zeitpunkt, zu dem sich das Objektivzentrum in der tatsächlichen Position befindet, und dem Zeitpunkt, zu dem sich das Objektivzentrum in der Mitte des Ladybug-Koordinatensystems befindet, beobachtet.