affine_trans_regionT_affine_trans_regionAffineTransRegionAffineTransRegionaffine_trans_region (Operator)
Name
affine_trans_regionT_affine_trans_regionAffineTransRegionAffineTransRegionaffine_trans_region — Anwenden einer beliebigen affinen 2D-Transformation auf Regionen.
Signatur
Beschreibung
affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region wendet eine beliebige affine
2D-Transformation (Skalierung, Drehung, Verschiebung, Scherung) auf die in
RegionRegionRegionRegionregionregion übergebenen Regionen an und liefert die transformierten
Regionen in RegionAffineTransRegionAffineTransRegionAffineTransRegionAffineTransregionAffineTransregion_affine_trans zurück. Die Transformation wird
durch eine homogene Transformationsmatrix beschrieben, die in
HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d übergeben wird. Diese kann mit Hilfe der Operatoren
hom_mat2d_identityhom_mat2d_identityHomMat2dIdentityHomMat2dIdentityHomMat2dIdentityhom_mat2d_identity, hom_mat2d_scalehom_mat2d_scaleHomMat2dScaleHomMat2dScaleHomMat2dScalehom_mat2d_scale,
hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotatehom_mat2d_rotate, hom_mat2d_translatehom_mat2d_translateHomMat2dTranslateHomMat2dTranslateHomMat2dTranslatehom_mat2d_translate etc. aufgebaut werden
oder das Resultat von Operatoren wie vector_angle_to_rigidvector_angle_to_rigidVectorAngleToRigidVectorAngleToRigidVectorAngleToRigidvector_angle_to_rigid sein.
Die Einträge der homogenen Transformationsmatrix werden so interpretiert,
dass die Zeilen-Koordinate des Bildes der x-Koordinate und die
Spalten-Koordinate des Bildes der y-Koordinate des
Koordinatensystems entspricht, in dem die Transformationsmatrix definiert
wurde. Dies ist notwendig, um für das Bild ein rechtshändiges
Koordinatensystem zu erhalten. Insbesondere werden dadurch Rotationen im
korrekten Drehsinn ausgeführt. Die Koordinatenreihenfolge (x,y) der
Matrizen entspricht dann der üblichen Koordinatenreihenfolge (Zeile,Spalte)
der Bilder.
Der Parameter InterpolateInterpolateInterpolateInterpolateinterpolateinterpolate gibt dabei an, ob die Transformation mit
einer internen Interpolation ausgeführt werden soll oder nicht. Es sind die
in affine_trans_imageaffine_trans_imageAffineTransImageAffineTransImageAffineTransImageaffine_trans_image beschriebenen Optionen
'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor" und 'constant'"constant""constant""constant""constant""constant" verfügbar. Eine
Interpolation kann insbesondere bei Vergrößerungen zu glatteren
Regionenrändern führen. Allerdings steigt dadurch die Laufzeit erheblich.
Achtung
affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region ist i.a. nicht reversibel (Clipping
und Rasterung bei Rotation und Streckung).
affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region verwendet nicht das
HALCON-Standard-Koordinatensystem (mit dem Ursprung im Mittelpunkt des
linken oberen Pixels) sondern das gleiche Koordinatensystem wie
affine_trans_pixelaffine_trans_pixelAffineTransPixelAffineTransPixelAffineTransPixelaffine_trans_pixel, d.h. der Ursprung liegt in der linken
oberen Ecke des linken oberen Pixels.
Eine Transformation mit affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region
entspricht für jeden Punkt der Region einer Kette von Transformationen
(Ein- und Ausgabekoordinaten als homogene Vektoren dargestellt,
siehe affine_trans_pixelaffine_trans_pixelAffineTransPixelAffineTransPixelAffineTransPixelaffine_trans_pixel).
Dies kann zu unerwarteten Ergebnissen führen, wenn die
Transformationsmatrix unter Verwendung von Koordinaten erstellt wurde,
die von der Region mit Operatoren wie z.B. area_centerarea_centerAreaCenterAreaCenterAreaCenterarea_center
abgeleitet wurden. Wenn z.B. eine
rotationssymmetrische Region unter Verwendung von
hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotatehom_mat2d_rotate um ihren mit area_centerarea_centerAreaCenterAreaCenterAreaCenterarea_center
bestimmten Schwerpunkt rotiert wird, so liegt die transformierte Region
nicht auf der Originalregion. Dieser Effekt kann dadurch kompensiert
werden, dass vor dem Aufruf von affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region die
Transformationsmatrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d durch die beiden folgenden
Translationen modifiziert wird:
hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)HomMat2dTranslate(HomMat2D, 0.5, 0.5, HomMat2DTmp)hom_mat2d_translate(HomMat2D, 0.5, 0.5, HomMat2DTmp)
|
hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)HomMat2dTranslateLocal(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)hom_mat2d_translate_local(HomMat2DTmp, -0.5, -0.5, HomMat2DAdapted)
|
affine_trans_region(Region, RegionAffineTrans, HomMat2DAdapted, 'nearest_neighbor')affine_trans_region(Region, RegionAffineTrans, HomMat2DAdapted, "nearest_neighbor")AffineTransRegion(Region, RegionAffineTrans, HomMat2DAdapted, "nearest_neighbor")AffineTransRegion(Region, RegionAffineTrans, HomMat2DAdapted, "nearest_neighbor")AffineTransRegion(Region, RegionAffineTrans, HomMat2DAdapted, "nearest_neighbor")affine_trans_region(Region, RegionAffineTrans, HomMat2DAdapted, "nearest_neighbor")
|
Ein Überblick zu den verschiedenen in HALCON verwendeten 2D
Koordinatensystemen ist in der Einleitung zum Kapitel
Transformationen / 2D-Transformationen gegeben.
Ausführungsinformationen
- Multithreading-Typ: reentrant (läuft parallel zu nicht-exklusiven Operatoren).
- Multithreading-Bereich: global (kann von jedem Thread aufgerufen werden).
- Automatisch parallelisiert auf Tupelebene.
Parameter
RegionRegionRegionRegionregionregion (input_object) region(-array) → objectHRegionHObjectHRegionHobject
Zu transformierende Region(en).
RegionAffineTransRegionAffineTransRegionAffineTransRegionAffineTransregionAffineTransregion_affine_trans (output_object) region(-array) → objectHRegionHObjectHRegionHobject *
Region(en), die transformiert wurde(n).
Parameteranzahl: RegionAffineTrans == Region
HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d (input_control) hom_mat2d → HHomMat2D, HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)
Eingabe-Transformationsmatrix.
InterpolateInterpolateInterpolateInterpolateinterpolateinterpolate (input_control) string → HTuplestrHTupleHtuple (string) (string) (HString) (char*)
Soll die Transformation mit Interpolation ausgeführt
werden?
Defaultwert:
'nearest_neighbor'
"nearest_neighbor"
"nearest_neighbor"
"nearest_neighbor"
"nearest_neighbor"
"nearest_neighbor"
Werteliste: 'constant'"constant""constant""constant""constant""constant", 'nearest_neighbor'"nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor""nearest_neighbor"
Ergebnis
Falls die Matrix HomMat2DHomMat2DHomMat2DHomMat2DhomMat2Dhom_mat_2d eine affine Abbildung darstellt
(d.h. keine projektive Abbildung), liefert
affine_trans_regionaffine_trans_regionAffineTransRegionAffineTransRegionAffineTransRegionaffine_trans_region den Wert 2 (H_MSG_TRUE) zurück. Das Verhalten bei
leerer Eingabe (keine Eingaberegionen vorhanden) lässt sich mittels
set_system('no_object_result',<Result>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>), das bei leerer
Region mit set_system('empty_region_result',<Result>)set_system("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>)SetSystem("empty_region_result",<Result>)set_system("empty_region_result",<Result>) und
das bei leerer Ergebnisregion mit
set_system('store_empty_region',<'true'/'false'>)set_system("store_empty_region",<"true"/"false">)SetSystem("store_empty_region",<"true"/"false">)SetSystem("store_empty_region",<"true"/"false">)SetSystem("store_empty_region",<"true"/"false">)set_system("store_empty_region",<"true"/"false">) festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
Vorgänger
hom_mat2d_identityhom_mat2d_identityHomMat2dIdentityHomMat2dIdentityHomMat2dIdentityhom_mat2d_identity,
hom_mat2d_scalehom_mat2d_scaleHomMat2dScaleHomMat2dScaleHomMat2dScalehom_mat2d_scale,
hom_mat2d_translatehom_mat2d_translateHomMat2dTranslateHomMat2dTranslateHomMat2dTranslatehom_mat2d_translate,
hom_mat2d_inverthom_mat2d_invertHomMat2dInvertHomMat2dInvertHomMat2dInverthom_mat2d_invert,
hom_mat2d_rotatehom_mat2d_rotateHomMat2dRotateHomMat2dRotateHomMat2dRotatehom_mat2d_rotate,
hom_mat2d_reflecthom_mat2d_reflectHomMat2dReflectHomMat2dReflectHomMat2dReflecthom_mat2d_reflect
Nachfolger
select_shapeselect_shapeSelectShapeSelectShapeSelectShapeselect_shape
Alternativen
move_regionmove_regionMoveRegionMoveRegionMoveRegionmove_region,
mirror_regionmirror_regionMirrorRegionMirrorRegionMirrorRegionmirror_region,
zoom_regionzoom_regionZoomRegionZoomRegionZoomRegionzoom_region
Siehe auch
affine_trans_imageaffine_trans_imageAffineTransImageAffineTransImageAffineTransImageaffine_trans_image
Modul
Foundation