2D-Transformationen

Liste der Operatoren ↓

Um den Ort eines Punktes in einem Bild festzulegen, braucht es eine Konvention, wie dies geschehen soll. Eine solche Konvention wird durch das Koordinatensystem festgelegt. In HALCON werden verschiedene Koordinatensysteme verwendet. Diese Kapitelreferenz gibt einen Überblick über die Systeme, die in 2D verwendet werden.

Pixel sind eigenständig und um sie zu adressieren gibt es ein Koordinatensystem, welches nur die ganzen Zahlen verwendet, das Pixel-Koordinatensystem. Mit einer feineren Auflösung werden Koordinaten in Fließkommazahlen benötigt, z.B. . Dies führt zu Subpixel-genauen Koordinatensystemen. In HALCON verwenden wir drei verschiedene Implementierungen dieser Subpixel-Koordinatensystemen:

Davon unterscheiden sich die ersten beiden bloß in der Wahl des Ursprungspunktes, wie in den folgenden Abbildungen ersichtlich wird. Kalibrierung ermöglicht die Zuordnung von Bild-Koordinaten und reellen Distanzen. Für mehr Informationen zu kalibrierten Koordinaten wird auf den „Solution Guide III-C - 3D Vision“ verwiesen.

HALCON Standard-Koordinatensystem

Pixel-genaues Koordinaten

Das Pixel-Koordinatensystem behandelt das Bild wie ein Netz diskreter Einheiten, den Pixeln. In HALCON setzen wir den Ursprung in die Mitte des Pixels oben links. Zur Zuordnung der Koordinaten eines Pixels werden wie in einer Matrix Zeile und Spalte angegeben.

Für ein Bild der Größe Höhe Breite = Pixel bedeutet dies, dass die Zeilen-Koordinate von bis läuft und die Spalten-Koordinate von bis , eine Visualisierung findet sich in der unten folgenden Abbildung.

Subpixel-genaues Koordinatensystem: Pixel-zentriert

Der Ursprung dieses Koordinatensystems liegt im Zentrum des Pixels oben links und damit bettet diese Konvention das Pixel-Koordinatensystem ein. Dies bedeutet, dass die Ecke oben links die Koordinaten hat und für ein Bild der Größe Höhe Breite = Pixel hat die Ecke unten rechts die Koordinaten (= , die Koordinaten-Werte starten bei 0). Der Pixel (k,l) bedeckt die Fläche des Rechteckes , , , . Diese Konvention wird in HALCON das Standard-Koordinatensystem oder auch das Bild-Koordinatensystem genannt.

Dieses Koordinatensystem ist wie eine Projektion der xy-Achse des 3D-Kamera-Koordinatensystems. Entsprechend haben die Achsen die Zuordnung Zeile: y-Koordinate, Spalte: x-Koordinate.

image/svg+xml (0,0) (0,5) (0,2) (6,0) (2,0) image/svg+xml (0.0,0.0) y x
(1) (2)
Darstellung der standard Pixel- und Subpixel-Koordinatensysteme in HALCON. Das Kreuz bezeichnet den Pixel in der Ecke unten rechts. Seine Mitte hat die Koordinaten (in Pixel-Koordinaten (1)), (Standard-Koordinaten (2)). Das Kreiszentrum hat die Koordinaten .

Kartesisches Nicht-Standard Koordinatensystem in HALCON

Wird ein Bild um (=90 Grad) um seinen Ursprung rotiert, so erwartet man, dass sich ursprüngliches Bild und gedrehtes Bild in einer Ecke berühren, sich aber nicht überlagern. Ebenso soll eine Skalierung des Bildes nicht zu negativen Bild-Koordinaten führen. Dafür muss der Ursprung in einer Ecke sein. Dies motiviert das folgende Koordinatensystem.

Subpixel-genaues Koordinatensystem: Ecken-zentriert:

In diesem Koordinatensystem liegt der Ursprung in der Ecke oben links. Somit hat das Zentrum des Pixels oben links die Koordinaten und für ein Bild der Größe Höhe Breite = Pixel hat die Ecke unten rechts die Koordinaten . Der Pixel bedeckt die Fläche des Rechtecks , , , .

image/svg+xml (0.0,0.0) y x
Darstellung des kartesischen Ecken-zentrierten Subpixel-genauen Koordinatensystems in HALCON. Das Kreuz bezeichnet den Pixel in der Ecke unten rechts. Seine Mitte hat die Koordinaten . Das Kreiszentrum hat auch in dieser Darstellung die Koordinaten .

Für dieses Koordinatensystem sind Rotationen im mathematisch positiven Drehsinn und somit gegen den Uhrzeigersinn definiert. Somit bildet eine Rotation um (=90 Grad) die erste Achse (= x-Achse) auf die zweite Achse (= y-Achse) ab. Entsprechend sind die Achsen wie folgt zugeordnet, Zeile: x-Koordinate, Spalte: y-Koordinate.

image/svg+xml x y 0 α
Darstellung einer Rotation ( ) im Ecken-zentrierten Koordinatensystem.

Operatoren, welche die Parameter in beliebigen Kartesischen Koordinatensysteme akzeptieren

Der Operator affine_trans_point_2daffine_trans_point_2dAffineTransPoint2dAffineTransPoint2dAffineTransPoint2d wendet die durch HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D definierte Transformation auf die Punkt-Koordinaten an. Das heißt, der Operator affine_trans_point_2daffine_trans_point_2dAffineTransPoint2dAffineTransPoint2dAffineTransPoint2d kann in beiden Kartesischen Koordinatensystemen verwendet werden, solange die Transformation und die Punkte im selben Koordinatensystem gegeben werden.

Die Operatoren angle_llangle_llAngleLlAngleLlAngleLl und angle_lxangle_lxAngleLxAngleLxAngleLx können zwar Eingabepunkte in Pixel-zentrierten Koordinaten erhalten, doch der Winkel wird stets nach der Konvention der Rotationen im mathematisch positiven Drehsinn zurückgegeben, d.h., gegen den Uhrzeigersinn, und mit der horizontalen Achse als 0-Wert, wie im ecken-zentrierter Koordinatensystem.

Operatoren, welche die Parameter in verschiedenen Koordinatensystemen erwarten

In HALCON gibt es Operatoren, welche die Eingaben in verschiedenen Koordinatensystemen erwarten. Einerseits ist das Objekt in seinen üblichen Koordinaten, den Standard-Koordinaten anzugeben. Andererseits erwartet der Operator für die Transformationsmatrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D ecken-zentrierte Koordinaten mit deren oben erläuterten Vorteilen bezüglich Transformationen. Diese Operatoren transformieren die Koordinaten des Objekts von Standard-Koordinaten (mit dem Ursprung in der Mitte des Pixels oben links) in ecken-zentrierte Koordinaten (mit dem Ursprung in der Ecke oben links des Pixels oben links). Nach der Transformation mit HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D wird das Resultat zurücktransformiert und in Standard-Koordinaten ausgegeben.

Dies gilt für folgende Operatoren:

These operators are

Eine Transformation (z.B. eine Rotation um einen bestimmten Punkt), die durch eine Matrix im Standard-Koordinatensystem repräsentiert wird, kann z.B. über folgende Transformation als entsprechende Matrix in Ecken-zentrierten Koordinaten notiert werden:

hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp) hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)

Es ist zu beachten, dass die zuvor erwähnten Operatoren beginnend mit projective_ eine projektive Transformationsmatrix verwenden. Diese Transformationsmatrix kann z.B. über 3D Kamera-Posen erhalten werden. Wird dies getan, so ist die verwendete Matrix in einer Projektion der xy-Ebene des 3D Koordinatensystems gegeben. Entsprechend haben die Achsen die Zuordnung Zeile: y-Koordinate, Spalte: x-Koordinate.

Form-basiertes Matching und Korrelations-basiertes Matching

Die Resultate von form-basiertem Matching, wie z.B. find_shape_modelfind_shape_modelFindShapeModelFindShapeModelFindShapeModel, werden in ecken-zentrierten Koordinaten gegeben. Somit kann man diese Resultate direkte zur Erstellung von Transformationsmatrizen HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D in ecken-zentrierten Koordinaten verwenden. Solche Transformationsmatrizen können mit Operatoren wie z.B. affine_trans_contour_xldaffine_trans_contour_xldAffineTransContourXldAffineTransContourXldAffineTransContourXld und weiteren unter Operatoren, welche die Parameter in verschiedenen Koordinatensystemen erwarten gelisteten Operatoren angewendet werden.

Die Verwendung der Prozedur dev_display_shape_matching_results wird zur Darstellung der Resultate von form-basiertem Matching, insbesondere der Operatoren

stark empfohlen.

Die folgenden Abbildungen zeigen ein Beispiel, wie die Darstellung eines Matches aussieht, wenn die verwendete Transformationsmatrix in den korrekten, respektive falschen Koordinaten angegeben wird. Für Letztgenanntes, gezeigt in Abbildung (3), wurde die Transformationsmatrix in Pixel-zentrierten Koordinaten verwendet und so liegt der gezeigte Match mit affine_trans_contour_xldaffine_trans_contour_xldAffineTransContourXldAffineTransContourXldAffineTransContourXld um 0.5 Pixel falsch. Man beachte, dass dieser Effekt nur sichtbar wird, wenn Rotationen involviert sind.

image/svg+xml image/svg+xml image/svg+xml
(1) (2) (3)
Das Originalbild der Büroklammer (1), ein Teil des Matches mit den Eingabegrößen in vom Operator erwarteten Koordinaten (2) und ein Match, bei dem die Transformationsmatrix in nicht-passenden Koordinaten verwendet wurde.

Die Resultate von find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModel und find_ncc_modelsfind_ncc_modelsFindNccModelsFindNccModelsFindNccModels werden ebenso in ecken-zentrierten Koordinaten gegeben. Deshalb kann man auch mit diesen Resultaten direkt eine Transformationsmatrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2D in ecken-zentrierten Koordinaten erstellen. Diese Transformationsmatrizen sind zur direkten Anwendung mit Operatoren wie z.B. affine_trans_contour_xldaffine_trans_contour_xldAffineTransContourXldAffineTransContourXldAffineTransContourXld und weiteren unter Operatoren, welche die Parameter in verschiedenen Koordinatensystemen erwarten gelisteten Operatoren geeignet.

Zur Darstellung der Resultate korrelations-basierten Matchings wird die Prozedur dev_display_ncc_matching_results stark empfohlen.

Nicht-Kartesische Koordinatensysteme

Subpixel-genaues Koordinatensystem: Polarkoordinaten

In Polarkoordinaten werden Punkte durch einen Abstand und einen Winkel definiert. Der Abstand, Radialkoordinate genannt, wird zum festen Punkt, dem Pol, angegeben. Die Winkelkoordinate wird in Bezug zu einer fixen Achse, der Polarachse gemessen. In HALCON wird der Pol über festgelegt und die horizontalen Achse bildet die Polarachse.

Bei einer Transformation mit polar_trans_image_extpolar_trans_image_extPolarTransImageExtPolarTransImageExtPolarTransImageExt entspricht der Pixel oben links des Ausgabebildes jenem Punkt des Kreisrings im Eingabebild, der durch RadiusStartRadiusStartRadiusStartRadiusStartradiusStart und AngleStartAngleStartAngleStartAngleStartangleStart festgelegt wurde. Analog entspricht der Pixel unten rechts des Ausgabebildes jenem Punkt des Kreisrings im Eingabebild, der durch RadiusEndRadiusEndRadiusEndRadiusEndradiusEnd und AngleEndAngleEndAngleEndAngleEndangleEnd spezifiziert wurde. Dies bedeutet, dass in der üblichen Verwendungsweise (AngleStartAngleStartAngleStartAngleStartangleStart < AngleEndAngleEndAngleEndAngleEndangleEnd und RadiusStartRadiusStartRadiusStartRadiusStartradiusStart < RadiusEndRadiusEndRadiusEndRadiusEndradiusEnd) die Transformation im mathematisch positiven Drehsinn (für den Betrachter gegen den Uhrzeigersinn) durchgeführt wird. Weiter werden dann Punkte mit kleinerem Radius weiter oben im Ausgabebild angezeigt. Durch geeignetes Austauschen der Parameterwerte (z.B. AngleStartAngleStartAngleStartAngleStartangleStart > AngleEndAngleEndAngleEndAngleEndangleEnd oder RadiusStartRadiusStartRadiusStartRadiusStartradiusStart > RadiusEndRadiusEndRadiusEndRadiusEndradiusEnd) kann jeder beliebige Drehsinn des Ausgabebildes erreicht werden.

image/svg+xml α 2 2 r α 1 1 r image/svg+xml 2 r α 1 ) , ( + + + + 2 r α 2 ) , ( 1 r α 1 ) , ( 1 r α 2 ) , ( image/svg+xml α 2 2 r α 1 1 r
(1) (2) (3)
Der Kreisbogen ist gegeben durch den Pol (RowRowRowRowrow,ColumnColumnColumnColumncolumn) (+), die Polarachse (...), die zwei Winkelkoordinaten AngleStartAngleStartAngleStartAngleStartangleStart ( ), AngleEndAngleEndAngleEndAngleEndangleEnd ( ) und die zwei Radialkoordinaten RadiusStartRadiusStartRadiusStartRadiusStartradiusStart ( ), RadiusEndRadiusEndRadiusEndRadiusEndradiusEnd ( ). (1) Das Originalbild sowie die den Kreisbogen definierenden Parameter. (2) Der Kreisbogen, erhalten durch polar_trans_image_extpolar_trans_image_extPolarTransImageExtPolarTransImageExtPolarTransImageExt, in einer Darstellung bei der die Polarkoordinaten Winkel und Radius ein äquidistantes Koordinatennetz formen. (3) Der Kreisbogen in der selben Darstellung wie das Originalbild. Die Kartesischen Koordinaten wurden durch Anwendung von polar_trans_image_invpolar_trans_image_invPolarTransImageInvPolarTransImageInvPolarTransImageInv auf Bild (2) erhalten. Der Ursprung liegt im Zentrum des Pixels oben links.

Folgende Operatoren verwenden Polarkoordinaten:

Bilder mit reduzierter Domäne, Regionen und Modelle

In den vorherigen Abschnitten wurden die Koordinaten von Bildern behandelt. In Bezug auf den Ursprung und das benutzte Koordinatensystem werden Bilder mit reduzierter Domäne, Regionen und Modelle jedoch unterschiedlich behandelt.

Bilder mit reduzierter Domäne und Regionen

Sowohl Bilder mit reduzierter Domäne als auch Regionen behalten das Koordinatensystem des Bildes, auf welchem sie erstellt wurden. Dies bedeutet, dass sie den Ursprung erben und die Koordinatenwerte, die sie im Originalbild hatten, behalten.

Modelle

Modelle, können ein lokales Koordinatensystem haben. So haben z.B. Modelle, die über create_shape_modelcreate_shape_modelCreateShapeModelCreateShapeModelCreateShapeModel erhalten wurden, ihren Ursprung im Schwerpunkt der ROI, aus der sie erstellt wurden. Für mehr Informationen wird auf den „Solution Guide II-B - Matching“ verwiesen.

Kalibrierte Koordinaten

Aus Pixel-Einheiten kann keine direkte Information über reelle Distanzen gewonnen werden. Durch die Kalibrierung der Kamera ist es jedoch möglich, die Bilder zu entzerren. Dann können den Bildern Welt-Koordinaten zugeordnet werden. Für mehr Informationen wird auf den „Solution Guide III-C - 3D Vision“ verwiesen.


Liste der Operatoren

affine_trans_pixelAffineTransPixelAffineTransPixelaffine_trans_pixel
Wendet eine beliebige affine 2D-Transformation auf Pixelkoordinaten an.
affine_trans_point_2dAffineTransPoint2dAffineTransPoint2daffine_trans_point_2d
Wendet eine beliebige affine 2D-Transformation auf Punkte an.
deserialize_hom_mat2dDeserializeHomMat2dDeserializeHomMat2ddeserialize_hom_mat2d
Deserialisieren einer homogenen 2D-Transformationsmatrix.
hom_mat2d_composeHomMat2dComposeHomMat2dComposehom_mat2d_compose
Multipliziert zwei homogene 2D-Transformationsmatrizen.
hom_mat2d_determinantHomMat2dDeterminantHomMat2dDeterminanthom_mat2d_determinant
Berechnet die Determinante einer homogenen 2D-Transformationsmatrix.
hom_mat2d_identityHomMat2dIdentityHomMat2dIdentityhom_mat2d_identity
Erzeugt die homogene Transformationsmatrix der identischen 2D-Abbildung.
hom_mat2d_invertHomMat2dInvertHomMat2dInverthom_mat2d_invert
Invertiert eine homogene 2D-Transformationsmatrix.
hom_mat2d_reflectHomMat2dReflectHomMat2dReflecthom_mat2d_reflect
Fügt eine Spiegelung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_reflect_localHomMat2dReflectLocalHomMat2dReflectLocalhom_mat2d_reflect_local
Fügt eine Spiegelung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_rotateHomMat2dRotateHomMat2dRotatehom_mat2d_rotate
Fügt eine Rotation zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_rotate_localHomMat2dRotateLocalHomMat2dRotateLocalhom_mat2d_rotate_local
Fügt eine Rotation zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_scaleHomMat2dScaleHomMat2dScalehom_mat2d_scale
Fügt eine Skalierung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_scale_localHomMat2dScaleLocalHomMat2dScaleLocalhom_mat2d_scale_local
Fügt eine Skalierung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_slantHomMat2dSlantHomMat2dSlanthom_mat2d_slant
Fügt eine Scherung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_slant_localHomMat2dSlantLocalHomMat2dSlantLocalhom_mat2d_slant_local
Fügt eine Scherung zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_to_affine_parHomMat2dToAffineParHomMat2dToAffineParhom_mat2d_to_affine_par
Berechnet die affinen Transformationsparameter aus einer homogenen 2D-Transformationsmatrix.
hom_mat2d_translateHomMat2dTranslateHomMat2dTranslatehom_mat2d_translate
Fügt eine Translation zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_translate_localHomMat2dTranslateLocalHomMat2dTranslateLocalhom_mat2d_translate_local
Fügt eine Translation zu einer homogenen 2D-Transformationsmatrix hinzu.
hom_mat2d_transposeHomMat2dTransposeHomMat2dTransposehom_mat2d_transpose
Transponiert eine homogene 2D-Transformationsmatrix.
hom_mat3d_projectHomMat3dProjectHomMat3dProjecthom_mat3d_project
Projiziert eine Matrix zur affinen 3D-Transformation in eine 2D projektive Transformationsmatrix.
hom_vector_to_proj_hom_mat2dHomVectorToProjHomMat2dHomVectorToProjHomMat2dhom_vector_to_proj_hom_mat2d
Bestimmt eine projektive Transformationsmatrix unter Verwendung vorgegebener Punktkorrespondenzen.
point_line_to_hom_mat2dPointLineToHomMat2dPointLineToHomMat2dpoint_line_to_hom_mat2d
Erzeugt eine Näherung für eine affine Transformation aus Punkt-zu-Gerade-Korrespondenzen.
projective_trans_pixelProjectiveTransPixelProjectiveTransPixelprojective_trans_pixel
Projiziert Pixelkoordinaten mittels einer homogenen projektiven Transformationsmatrix.
projective_trans_point_2dProjectiveTransPoint2dProjectiveTransPoint2dprojective_trans_point_2d
Projiziert einen homogenen 2D-Punkt mittels einer projektiven Transformationsmatrix.
serialize_hom_mat2dSerializeHomMat2dSerializeHomMat2dserialize_hom_mat2d
Serialisieren einer homogenen 2D-Transformationsmatrix.
vector_angle_to_rigidVectorAngleToRigidVectorAngleToRigidvector_angle_to_rigid
Berechnet eine starre affine Transformation aus Punkten und Winkeln.
vector_field_to_hom_mat2dVectorFieldToHomMat2dVectorFieldToHomMat2dvector_field_to_hom_mat2d
Berechnen der Näherung eines Verschiebungsvektorfeldes durch eine affine Transformation.
vector_to_anisoVectorToAnisoVectorToAnisovector_to_aniso
Erzeugt eine Näherung für eine anisotrope Ähnlichkeitstransformation aus Punktkorrespondenzen.
vector_to_hom_mat2dVectorToHomMat2dVectorToHomMat2dvector_to_hom_mat2d
Erzeugt eine Näherung für eine affine Transformation aus Punktkorrespondenzen.
vector_to_proj_hom_mat2dVectorToProjHomMat2dVectorToProjHomMat2dvector_to_proj_hom_mat2d
Bestimmt eine projektive Transformationsmatrix unter Verwendung vorgegebener Punktkorrespondenzen.
vector_to_proj_hom_mat2d_distortionVectorToProjHomMat2dDistortionVectorToProjHomMat2dDistortionvector_to_proj_hom_mat2d_distortion
Bestimmung der projektiven Transformationsmatrix und des radialen Verzeichnungskoeffizienten unter Verwendung vorgegebener Punktkorrespondenzen.
vector_to_rigidVectorToRigidVectorToRigidvector_to_rigid
Erzeugt eine Näherung für eine starre affine Transformation aus Punktkorrespondenzen.
vector_to_similarityVectorToSimilarityVectorToSimilarityvector_to_similarity
Erzeugt eine Näherung für eine Ähnlichkeitstransformation aus Punktkorrespondenzen.