create_aniso_shape_model_xld
— Vorbereiten eines anisotrop skalierten Formmodells für das Matching
aus XLD-Konturen.
create_aniso_shape_model_xld(Contours : : NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin, ScaleCMax, ScaleCStep, Optimization, Metric, MinContrast : ModelID)
create_aniso_shape_model_xld
erzeugt ein anisotrop skaliertes
Formmodell für das Matching aus den XLD Konturen Contours
. Die
XLD Konturen repräsentieren dabei die Grauwertkanten des zu suchenden Objekts
im Bild. Im Gegensatz zu dem Operator create_aniso_shape_model
, der
ein Formmodell aus einem Bild erzeugt, erzeugt der Operator
create_aniso_shape_model_xld
das Formmodell aus XLD Konturen, d.h.,
ohne die Verwendung eines Bildes.
Der Ausgabeparameter ModelID
ist ein Handle für dieses Modell,
der in nachfolgenden Aufrufen von find_aniso_shape_model
verwendet wird. Als Ursprung (Referenzpunkt) des Modells wird der Schwerpunkt des
kleinsten umschließenden Rechtecks der Konturen Contours
, das
parallel zu den Koordinatenachsen liegt, verwendet. Falls ein anderer
Ursprung gewünscht wird, kann dieser mit set_shape_model_origin
gesetzt werden.
Das Modell wird für mehrere Pyramidenebenen generiert und im
Speicher abgelegt. Falls eine vollständige Vorabgenerierung des
Modells gewählt wird (siehe unten), wird das Modell in mehreren
Rotationen und anisotropen Skalierungen (unabhängigen Skalierungen
in Zeilen- und Spaltenrichtung) auf jeder Ebene generiert. Das Modell kann
mit set_shape_model_clutter
um Störparameter erweitert werden.
Die Anzahl der Pyramidenebenen wird mit NumLevels
festgelegt. Sie sollte so groß wie möglich gewählt werden, da
hierdurch das Auffinden des Modells erheblich beschleunigt wird.
Bei der Wahl von NumLevels
ist aber darauf zu achten, dass
das Modell auf der obersten Pyramidenstufe noch erkennbar ist und
genügend viele Punkte besitzt (mindestens vier). Falls
nicht genügend Modellpunkte erzeugt werden, wird die Anzahl der
Pyramidenstufen intern solange reduziert, bis auf der obersten
Pyramidenstufe genügend Modellpunkte vorhanden sind. Falls durch
diese Anpassung ein Modell mit keiner Pyramidenstufe entstehen
würde, d.h. falls schon auf der untersten Pyramidenstufe zu wenige
Modellpunkte vorhanden sind, liefert
create_aniso_shape_model_xld
eine Fehlermeldung zurück.
Falls für NumLevels
'auto' übergeben wird, wählt
create_aniso_shape_model_xld
die Anzahl der Pyramidenstufen
automatisch. Die gewählte Anzahl von Pyramidenstufen
kann mit get_shape_model_params
abgefragt werden. In
seltenen Fällen kann es vorkommen, dass
create_aniso_shape_model_xld
die Anzahl der Pyramidenstufen zu
hoch oder zu niedrig bestimmt. Falls die Anzahl der Pyramidenstufen
zu hoch gewählt wird, kann das dazu führen, dass das Modell im Bild
nicht erkannt wird oder dass sehr niedrige Parameter für MinScore
oder Greediness
in find_aniso_shape_model
selektiert
werden müssen, damit das Modell gefunden wird. Falls die Anzahl der
Pyramidenstufen zu niedrig gewählt wird, kann es zu erhöhten
Laufzeiten in find_aniso_shape_model
kommen. In diesen
Fällen sollte die Anzahl der Pyramidenstufen manuell gewählt werden.
Die Parameter AngleStart
und AngleExtent
legen den
Winkelbereich für die möglichen Rotationen des Objektes im Bild fest.
Das Objekt kann also mit find_aniso_shape_model
nur in
diesem Winkelbereich gefunden werden. Der Parameter
AngleStep
gibt die Schrittweite der Winkel in dem gewählten
Winkelbereich an. Falls bei find_aniso_shape_model
keine
Subpixelgenauigkeit spezifiziert wird, gibt AngleStep
also
die erreichbare Winkelgenauigkeit an. AngleStep
sollte
aufgrund der Größe des Objektes gewählt werden. Kleinere Modelle
besitzen nur eine kleine Anzahl von verschiedenen diskreten
Rotationen im Bild. Deshalb sollte AngleStep
für kleinere
Modelle größer gewählt werden. Falls AngleExtent
kein
ganzzahliges Vielfaches von AngleStep
ist, wird
AngleStep
entsprechend angepasst.
Um sicherzustellen, dass find_aniso_shape_model
für
Modellinstanzen ohne Rotation Winkel von exakt 0.0 zurückgibt, wird der
Winkelbereich der möglichen Rotationen folgendermaßen angepasst: Wenn
kein positiver ganzzahliger Wert n existiert, für den
AngleStart
plus n mal AngleStep
genau Null ergibt,
wird AngleStart
um höchstens AngleStep
verringert,
und AngleExtent
wird um AngleStep
vergrößert.
Die Parameter ScaleRMin
, ScaleRMax
,
ScaleCMin
und ScaleCMax
legen den Bereich der
möglichen anisotropen Skalierung des Objektes in Zeilen- und
Spaltenrichtung im Bild fest. Eine Skalierung von 1 in beiden
Skalierungsfaktoren entspricht der Originalgröße des Modells. Die
Parameter ScaleRStep
und ScaleCStep
geben die
Schrittweite der Skalierungen an. Falls bei
find_aniso_shape_model
keine Subpixelgenauigkeit
spezifiziert wird, geben ScaleRStep
und ScaleCStep
also die erreichbare Genauigkeit der Skalierungen an. Wie
AngleStep
sollten ScaleRStep
und
ScaleRStep
aufgrund der Größe des Objektes gewählt werden.
Falls der jeweilige Skalierungsbereich kein ganzzahliges Vielfaches
von ScaleRStep
und ScaleCStep
ist, werden
ScaleRStep
und ScaleCStep
entsprechend angepasst.
Um sicherzustellen, dass find_aniso_shape_model
für
Modellinstanzen ohne Skalierung Skalierungen von exakt 1.0
zurückgibt, wird der Bereich der möglichen
Skalierungen folgendermaßen angepasst: Wenn keine positiven
ganzzahligen Werte n und m existieren, für die ScaleRMin
plus n mal ScaleRStep
sowie ScaleCMin
plus m mal
ScaleCStep
genau 1.0 ergeben, werden ScaleRMin
und ScaleCMin
um höchstens ScaleRStep
bzw.
ScaleCStep
verringert, und ScaleRMax
und
ScaleCMax
werden so erhöht, dass der jeweilige
Skalierungsbereich um ScaleRStep
bzw. ScaleCStep
vergrößert wird.
Es ist zu beachten, dass die Transformationen intern so behandelt werden, dass erst die Skalierungen und dann die Rotation angewendet werden. Daher sollte das Modell im Normalfall so ausgerichtet werden, dass es im Modellbild horizontal oder vertikal erscheint.
Bei besonders großen Modellen kann es auch sinnvoll sein, die Anzahl
der Modellpunkte durch Setzen des Parameters Optimization
auf einen Wert ungleich 'none' zu setzen. Falls
Optimization
= 'none' , werden alle Modellpunkte
abgespeichert. Ansonsten wird die Anzahl der Punkte entsprechend
dem Parameter Optimization
reduziert. Falls die Anzahl der
Punkte reduziert wird, kann es bei find_aniso_shape_model
notwendig werden, den Parameter Greediness
auf einen
kleineren Wert, z.B. 0.7 oder 0.8, zu setzen. Bei kleineren
Modellen bewirkt die Reduktion der Anzahl der Punkte keine
Beschleunigung, da dadurch typischerweise wesentlich mehr
potentielle Instanzen des Modells untersucht werden müssen.
Falls für Optimization
'auto' übergeben wird, wählt
create_aniso_shape_model_xld
die Reduktion der Punkte
automatisch.
Der Parameter Metric
legt fest, unter welchen Bedingungen
das Muster im Bild noch erkannt wird.
Falls Metric
= 'use_polarity' , muss das Objekt im Bild
dieselben Kontrasteigenschaften aufweisen wie das Modell. Wenn z.B. das
Modell ein helles Objekt auf dunklem Hintergrund ist, wird das
Objekt im Bild nur dann gefunden, wenn es auch heller als der
Hintergrund ist.
Falls Metric
= 'ignore_global_polarity' , wird das Objekt
auch dann im Bild gefunden, wenn sich der Kontrast global umkehrt. Im
obigen Beispiel würde das Objekt also auch dann gefunden, wenn es dunkler
als der Hintergrund ist. Die Laufzeit von find_aniso_shape_model
erhöht sich in diesem Fall geringfügig.
Es ist zu beachten, dass die beiden Werte 'use_polarity' und
'ignore_global_polarity' für Metric
nur dann
verwendet werden können, wenn bei allen Konturen, die in Contours
übergeben wurden, das Attribut 'edge_direction' gesetzt ist, da es
die Polarität der Kanten festlegt. Für weitere Informationen zu
Konturattributen wie 'edge_direction' siehe
get_contour_attrib_xld
.
Ansonsten besteht die Möglichkeit, die beiden Werte für Metric
mit
dem Operator set_shape_model_metric
zu setzen, der die Polarität
der Kanten aus einem Bild bestimmt.
Falls Metric
= 'ignore_local_polarity' , wird das Modell
auch dann gefunden, wenn sich die Kontrastverhältnisse lokal ändern. Dieser
Modus kann z.B. dann sinnvoll sein, wenn das Objekt aus einem Teil
mittleren Grauwerts besteht, auf dem entweder dunkle oder helle
Unterobjekte liegen können. Da sich in diesem Fall die Laufzeit von
find_aniso_shape_model
aber wesentlich erhöht, ist es in
solchen Fällen meist sinnvoller, mehrere Modelle mit
create_aniso_shape_model_xld
zu erzeugen und mit
find_aniso_shape_models
zu suchen.
Die obigen drei Metriken können nur auf einkanalige Bilder angewendet
werden. Falls im Modellbild oder in den Suchbildern ein mehrkanaliges Bild
übergeben wird, wird stillschweigend nur der erste Kanal des Bildes
verwendet.
Falls Metric
= 'ignore_color_polarity' , wird das
Modell auch dann gefunden, falls sich die Farbkontraste lokal ändern
können. Dies ist z.B. der Fall, wenn Teile des Objektes ihre Farbe
ändern können, z.B. von rot auf grün. Dieser Modus ist insbesondere
dann sinnvoll, wenn nicht vorab bekannt ist, in welchen Kanälen das
Objekt zu erkennen ist. Auch hier kann sich die Laufzeit von
find_aniso_shape_model
erheblich erhöhen. Die Metrik
'ignore_color_polarity' kann auf Bilder mit einer
beliebigen Anzahl von Kanälen angewendet werden. Falls sie mit
einkanaligen Bildern verwendet wird, hat sie dieselbe Wirkung wie
'ignore_local_polarity' . Es ist zu beachten, dass für
Metric
= 'ignore_color_polarity' die
Kanäle nicht einer spektralen Unterteilung des Lichtes (wie z.B. bei
einem RGB-Bild) entsprechen müssen. Die Kanäle können z.B. auch
durch Beleuchtung des Objektes aus unterschiedlichen Richtungen
entstanden sein.
Es ist auch zu beachten, dass die beiden ersten Werte für Metric
('use_polarity' und 'ignore_global_polarity' ) nur dann
verwendet werden können, wenn bei allen Konturen, die in Contours
übergeben wurden, das Attribut 'edge_direction' gesetzt ist, da es
die Polarität der Kanten festlegt. Für weitere Informationen zu
Konturattributen wie 'edge_direction' siehe
get_contour_attrib_xld
.
Ansonsten besteht die Möglichkeit, die beiden Werte für Metric
mit
dem Operator set_shape_model_metric
zu setzen, der die Polarität
der Kanten aus einem Bild bestimmt.
Mit MinContrast
wird festgelegt, welchen Grauwertkontrast
die Objektkanten später bei der Erkennung mit
find_aniso_shape_model
im Bild mindestens besitzen müssen.
Mit anderen Worten stellt dieser Parameter somit eine Abgrenzung des
Objektes von Rauschen im Bild dar. Eine gute Wahl ist deshalb der
Bereich von Grauwertänderungen, der durch das Rauschen im Bild
verursacht wird. Falls die Grauwerte z.B. in einem Bereich von 10
Graustufen durch Rauschen schwanken, sollte MinContrast
auf
10 gesetzt werden. Falls mehrkanalige Bilder für das Modell und für
die Suchbilder verwendet werden, und falls der Parameter
Metric
auf 'ignore_color_polarity' gesetzt wird
(siehe oben), muss das Rauschen in einem Kanal noch mit der Wurzel
der Anzahl der Kanäle multipliziert werden, um MinContrast
zu bestimmen. Falls die Grauwerte in einem Kanal z.B. in einem
Bereich von 10 Graustufen schwanken, sollte MinContrast
bei
einem dreikanaligen Bild auf 17 gesetzt werden. Falls das
Modell später in sehr kontrastarmen Bildern erkannt werden soll,
muss MinContrast
entsprechend klein gewählt werden. Falls
das Modell mit erheblichen Verdeckungen erkannt werden soll, sollte
MinContrast
etwas größer als der Grauwertbereich, der durch
das Rauschen verursacht wird, gewählt werden, um eine robuste und
genaue Lageschätzung des verdeckten Modells zu gewährleisten.
Optional kann in Optimization
ein zweiter Wert übergeben
werden. Dieser Wert legt fest, ob das Modell vollständig vorab
generiert wird oder nicht. Der zweite Wert von
Optimization
ist hierzu auf 'pregeneration' oder
'no_pregeneration' zu setzen. Falls der zweite Wert nicht
angegeben wird, wird der mit
set_system('pregenerate_shape_models',...)
eingestellte
Modus verwendet. Mit der Standardeinstellung
('pregenerate_shape_models' = 'false' ) wird das
Modell nicht vollständig vorab generiert. Die vollständige
Vorabgenerierung des Modells führt im Normalfall zu leicht
geringeren Laufzeiten in find_aniso_shape_model
, da das
Modell nicht zur Laufzeit transformiert werden muss. Allerdings
sind in diesem Fall der Speicherbedarf und die Zeit, die zur
Modellerzeugung benötigt wird, wesentlich höher. Zu beachten ist
auch, dass in den zwei Modi nicht dieselben Ergebnisse erwartet
werden können, da intern bei der Transformation zur Laufzeit
notwendigerweise andere Daten für die transformierten Modelle
entstehen, als bei der Vorabgenerierung. Falls das Modell nicht
vorab generiert wird, werden z.B. in find_aniso_shape_model
typischerweise leicht niedrigere Bewertungen (Scores)
zurückgeliefert, so dass es unter Umständen notwendig sein kann,
einen niedrigeren Wert für MinScore
als bei vollständiger
Vorabgenerierung zu verwenden. Außerdem können sich die durch
Interpolation gewonnenen Subpixelpositionen geringfügig
unterscheiden. Falls höchste Genauigkeit gewünscht wird, sollte die
Lage des Modells mittels Ausgleichsrechnung (Least-Squares
Adjustment) bestimmt werden.
Falls eine vollständige Vorabgenerierung des Modells gewählt wird,
wird das Modell in dem gewählten Winkelbereich und
Skalierungsbereich vorab generiert und im Speicher abgelegt. Der
Speicherbedarf zur Speicherung des Modells ist also proportional zur
Anzahl der Winkelschritte, zur Anzahl der Skalierungsschritte und
zur Anzahl der Punkte im Modell. Wenn also AngleStep
,
ScaleRStep
oder ScaleCStep
zu klein bzw.
AngleExtent
oder der Skalierungsbereich zu groß gewählt
werden, kann es vorkommen, dass das Modell nicht mehr in den
(virtuellen) Speicher passt. In diesem Fall muss entweder
AngleStep
, ScaleRStep
oder ScaleCStep
größer oder AngleExtent
oder der Skalierungsbereich kleiner
gewählt werden. In jedem Fall ist es aus Laufzeitgründen
vorteilhaft, wenn das Modell komplett in den Hauptspeicher passt und
somit ein Paging durch das Betriebssystem vermieden werden kann. Da
die Möglichkeit zur subpixelgenauen Winkelbestimmung in
find_aniso_shape_model
gegeben ist, kann bei Modellen mit
einem Durchmesser von ca. 200 Pixeln AngleStep
>= 1° und ScaleRStep
,
ScaleCStep
>= 0.02 gewählt werden.
Falls AngleStep
=
0 oder ScaleRStep
, ScaleCStep
=
'auto' übergeben wird, wählt
create_aniso_shape_model_xld
automatisch eine Schrittweite für
die Winkel bzw. Skalierungen basierend auf der Größe des Modells
aus. Die automatisch gewählten Schrittweiten können mit
get_shape_model_params
abgefragt werden.
Falls eine vollständige Vorabgenerierung des Modells nicht gewählt
wird, wird das Modell nur in einer Referenzlage auf jeder Ebene
erzeugt. In diesem Fall muss das Modell zur Laufzeit in
find_aniso_shape_model
auf die verschiedenen Winkel und
Skalierungen transformiert werden. Dadurch kann es vorkommen, dass
das Auffinden des Modells etwas mehr Zeit benötigt.
Es ist zu beachten, dass vorabgenerierte Modelle für eine spezifische Bildgröße bestimmt sind. Aus Laufzeitgründen ist die Verwendung von Bildern mit verschiedenen Größen während der Suche mit dem gleichen Modell nicht parallel möglich. In diesem Fall müssen Kopien des gleichen Modells verwendet werden. Anderenfalls kann das Programm abstürzen.
Die XLD-Konturen, die in Contours
übergeben werden, sollten
in etwa auf die mittlere Größe skaliert worden sein, in der das Objekt
in den Suchbildern erscheint. Die Produkte
und sollten
also etwa 1 ergeben.
Im Gegensatz zum Operator create_aniso_shape_model
ist es
nicht möglich die Mindestgröße der Modellkomponenten anzugeben. Um
kleine Modellkomponenten im Formmodell zu vermeiden, können kurze
Konturen vor dem Aufruf von create_aniso_shape_model_xld
mit
dem Operator select_contours_xld
eliminiert werden.
Dieser Operator liefert ein Handle zurück. Es ist zu beachten, dass der Zustand einer Instanz dieses Handletyps durch bestimmte Operatoren geändert werden kann, obwohl das Handle als Eingabeparameter in diesen Operatoren verwendet wird.
Contours
(input_object) xld_cont(-array) →
object
Eingabekonturen, die zum Aufbau des Modells verwendet werden.
NumLevels
(input_control) integer →
(integer / string)
Maximale Anzahl von Pyramidenebenen.
Defaultwert: 'auto'
Werteliste: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'
AngleStart
(input_control) angle.rad →
(real)
Kleinste auftretende Rotation des Musters.
Defaultwert: -0.39
Wertevorschläge: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
AngleExtent
(input_control) angle.rad →
(real)
Ausdehnung des Winkelbereichs.
Defaultwert: 0.79
Wertevorschläge: 6.29, 3.14, 1.57, 0.79, 0.39
Restriktion: AngleExtent >= 0
AngleStep
(input_control) angle.rad →
(real / string)
Schrittweite der Winkel (Auflösung).
Defaultwert: 'auto'
Wertevorschläge: 'auto' , 0.0175, 0.0349, 0.0524, 0.0698, 0.0873
Restriktion: AngleStep > 0 && AngleStep <= pi / 16
ScaleRMin
(input_control) number →
(real)
Kleinste auftretende Skalierung des Musters in Zeilenrichtung.
Defaultwert: 0.9
Wertevorschläge: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriktion: ScaleRMin > 0
ScaleRMax
(input_control) number →
(real)
Größte auftretende Skalierung des Musters in Zeilenrichtung.
Defaultwert: 1.1
Wertevorschläge: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
Restriktion: ScaleRMax >= ScaleRMin
ScaleRStep
(input_control) number →
(real / string)
Schrittweite der Skalierung (Auflösung) in Zeilenrichtung.
Defaultwert: 'auto'
Wertevorschläge: 'auto' , 0.01, 0.02, 0.05, 0.1, 0.15, 0.2
Restriktion: ScaleRStep > 0
ScaleCMin
(input_control) number →
(real)
Kleinste auftretende Skalierung des Musters in Spaltenrichtung.
Defaultwert: 0.9
Wertevorschläge: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriktion: ScaleCMin > 0
ScaleCMax
(input_control) number →
(real)
Größte auftretende Skalierung des Musters in Spaltenrichtung.
Defaultwert: 1.1
Wertevorschläge: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
Restriktion: ScaleCMax >= ScaleCMin
ScaleCStep
(input_control) number →
(real / string)
Schrittweite der Skalierung (Auflösung) in Spaltenrichtung.
Defaultwert: 'auto'
Wertevorschläge: 'auto' , 0.01, 0.02, 0.05, 0.1, 0.15, 0.2
Restriktion: ScaleCStep > 0
Optimization
(input_control) string(-array) →
(string)
Art der Optimierung und optional Methode der Modellgenerierung.
Defaultwert: 'auto'
Werteliste: 'auto' , 'no_pregeneration' , 'none' , 'point_reduction_high' , 'point_reduction_low' , 'point_reduction_medium' , 'pregeneration'
Metric
(input_control) string →
(string)
Art der zum Matchen verwendeten Metrik.
Defaultwert: 'ignore_local_polarity'
Werteliste: 'ignore_color_polarity' , 'ignore_global_polarity' , 'ignore_local_polarity' , 'use_polarity'
MinContrast
(input_control) number →
(integer)
Minimaler Kontrast des Objektes in den Suchbildern.
Defaultwert: 5
Wertevorschläge: 1, 2, 3, 5, 7, 10, 20, 30, 40
ModelID
(output_control) shape_model →
(handle)
Handle des Modells.
Sind die Parameterwerte korrekt, dann liefert
create_aniso_shape_model_xld
den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine
Fehlerbehandlung durchgeführt. Wenn der Parameter NumLevels
so
gewählt wurde, dass das Modell zu wenige Punkte besitzt, wird die
Fehlermeldung 8510 zurückgeliefert.
read_contour_xld_dxf
,
edges_sub_pix
,
select_contours_xld
find_aniso_shape_model
,
find_aniso_shape_models
,
get_shape_model_params
,
clear_shape_model
,
write_shape_model
,
set_shape_model_origin
,
set_shape_model_param
,
set_shape_model_metric
,
set_shape_model_clutter
create_shape_model_xld
,
create_scaled_shape_model_xld
Matching