find_shape_models
— Suche der besten Matches mehrerer Formmodelle.
find_shape_models(Image : : ModelIDs, AngleStart, AngleExtent, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Score, Model)
find_shape_models
findet die besten NumMatches
Instanzen der Formmodelle, die in dem Tupel ModelIDs
übergeben werden, im Eingabebild Image
. Die Modelle müssen
zuvor mit create_shape_model
erzeugt oder mit
read_shape_model
eingelesen worden sein.
Im Gegensatz zu find_shape_model
kann also eine Mehrzahl von
Modellen gleichzeitig im selben Bild gesucht werden.
Die Position und Rotation der gefundenen Instanzen des Modells wird
in Row
, Column
und Angle
zurückgeliefert.
In Score
wird die Bewertung der
gefundenen Instanzen zurückgegeben. Der gefundene Modelltyp wird in
Model
zurückgeliefert.
Nähere Informationen finden Sie in den parameterspezifischen Abschnitten.
Gegenüber find_shape_model
unterscheidet sich die Semantik
aller Eingabeparameter etwas. Alle
Eingabeparameter müssen entweder genau ein Element enthalten, oder
dieselbe Anzahl von Elementen wie ModelIDs
.
(NumLevels
kann auch zwei oder zweimal die Anzahl von
Elementen wie ModelIDs
enthalten; siehe unten.) Im ersten
Fall wird der Wert des Eingabeparameters für alle Modelle gleich
verwendet. Im zweiten Fall wird das jeweilige Element des
Eingabeparameters für das entsprechende Modell in ModelIDs
verwendet. Zusätzliche Details können in den parameterspezifischen
Abschnitten weiter unten gefunden werden. Ein Aufruf von
find_shape_models
mit mehreren Werten für ModelIDs
, NumMatches
und
MaxOverlap
entspricht von der Wirkung her also mehreren
unabhängigen Aufrufen von find_shape_model
mit den
jeweiligen Parametern, ist allerdings wesentlich effizienter.
Der Definitionsbereich des Bildes Image
gibt den
Suchbereich für den Referenzpunkt des Modells an, d.h. für den
Schwerpunkt der Region des Bildes, das zur Erzeugung des Formmodells
mit create_shape_model
verwendet wurde. Ein eventuell mit
set_shape_model_origin
anders gesetzter Ursprung wird nicht
berücksichtigt. Das Modell wird innerhalb des Definitionsbereiches
des Eingabebildes nur an den Stellen gesucht, an denen das Modell
vollständig in das Bild passt. Das bedeutet, dass das Modell nicht
gefunden werden kann, wenn es aus dem Bild herausragt, selbst wenn
es eine Bewertung größer als MinScore
erreichen würde
(siehe unten). Außerdem kann es sein, dass das Modell, wenn es in einer der
Pyramidenebenen den Bildrand berührt, ebenfalls nicht gefunden wird, auch
wenn es im ursprünglichen Bild vollständig enthalten ist. Als Daumenregel
gilt hier, dass das Modell dann nicht gefunden werden könnte, wenn seine
Distanz zum Bildrand unter fällt.
Dieses Verhalten kann mit
set_system('border_shape_models','true')
für alle Modelle oder mit
set_shape_model_param(ModelID, 'border_shape_models','true')
speziell für ein Modell umgestellt werden, so dass auch Modelle
gefunden werden, die aus dem
Bild herausragen, falls sie eine Bewertung größer als MinScore
erreichen. Dabei werden Punkte außerhalb des Bildes als verdeckt angesehen,
d.h. sie verringern die Bewertung. Es ist zu beachten, dass dieser
Modus die Laufzeit der Suche erhöht.
Es ist weiter zu beachten, dass in seltenen Fällen, die typischerweise nur
in künstlichen Bildern auftreten, auch dann kein Modell gefunden wird, wenn
das Modell in einer Pyramidenebene die reduzierte Bilddomäne berührt. In
diesem Fall kann es helfen, die Region der Domäne um
, z.B., mit dilation_circle
zu vergrößern.
Wie üblich wird die Region des Eingabebildes
Image
als Suchbereich für den Referenzpunkt der Modelle
ModelIDs
verwendet. Konsistent mit der obigen Semantik
kann Image
also ein einzelnes Bildobjekt beinhalten oder
ein Bildobjekttupel. Falls Image
ein einzelnes Bildobjekt
enthält, wird dessen Region als Suchbereich für alle Modelle in
ModelIDs
verwendet. Falls Image
mehrere
Bildobjekte enthält, wird die jeweilige Region als Suchbereich für
das entsprechende Modell aus ModelIDs
verwendet. In diesem
Fall müssen die Bilder, abgesehen von ihrer Region, identisch sein. D.h.
Image
kann nicht in beliebiger Weise mit concat_obj
aufgebaut werden, sondern muss aus demselben Bild mit
add_channels
oder äquivalenten Aufrufen erzeugt werden.
Falls das nicht der Fall ist, wird eine Fehlermeldung
zurückgeliefert.
Die Parameter AngleStart
und AngleExtent
legen den
Winkelbereich fest, in dem nach dem Modell gesucht wird. Der
Winkelbereich wird gegebenenfalls auf den Bereich beschnitten, der
bei der Erzeugung des Modells mit create_shape_model
angegeben worden ist. Dies bedeutet insbesondere, dass die
Winkelbereiche des Modells und der Suche sich überlappen
müssen.
Beachten Sie, dass in einigen Fällen Instanzen mit einer Rotation
gefunden werden, die geringfügig außerhalb des angegebenen
Bereichs liegt. Dies kann vorkommen, wenn der angegebene Bereich
kleiner ist als der bei der Erstellung des Modells angegebene Bereich.
AngleStart
und AngleExtent
werden nur auf der höchsten
Pyramidenstufe überprüft. Matches, die auf der höchsten Pyramidenstufe
gefunden werden, werden bis zur untersten Pyramidenstufe verfeinert.
Aus Leistungsgründen wird bei der Verfeinerung jedoch nicht mehr überprüft,
ob die Matches immer noch innerhalb des angegebenen Bereichs liegen.
Der Parameter MinScore
legt fest, welche Bewertung ein
potentieller Match mindestens besitzen muss, damit er als eine
Instanz des Modells im Bild angesehen wird. Je größer der Wert von
MinScore
gewählt werden kann, desto schneller verläuft die
Suche. Falls erwartet werden kann, dass das Modell niemals verdeckt
wird, kann MinScore
auf so hohe Werte wie 0.8 oder sogar
0.9 gesetzt werden. Werden die Matches nicht bis zur untersten
Pyramidenebene verfolgt (siehe unten) kann es in manchen Fällen
vorkommen, dass Instanzen gefunden werden, deren Score geringfügig
unter dem Wert von MinScore
liegen.
Falls ein einzelner Wert in MinScore
übergeben wird, wird dieser
Wert auf alle Instanzen angewandt, die mit allen Modellen gefunden werden.
Falls MinScore
mehrere Einträge enthält, werden die Werte
einzeln für die entsprechenden Modelle verwendet.
Falls die Formmodelle mit set_shape_model_clutter
um Störparameter
erweitert wurden und dadurch 'use_clutter' aktiviert wurde, wird in
MinScore
zu jedem der vorhandenen Werte für den minimalen Score ein
weiterer Wert erwartet, welcher den maximalen Störwert eines potentiellen
Matches angibt, um als Instanz des Modells im Bild betrachtet werden zu
können. Die Laufzeit mit Nutzung von Störparametern ist mindestens so hoch
wie die Laufzeit ohne Störparameter mit auf 0 gesetztem Parameter
NumMatches
. Die verschiedenen Formmodelle müssen den gleichen Wert
für 'use_clutter' haben.
Wird der maximale Störwert separat für jedes Modell spezifiziert, was immer
dann nötig ist, wenn auch der minimale Score für jedes
Modell gesetzt wird, muss in MinScore
die doppelte Anzahl an
Einträgen enthalten sein wie in ModelIDs
. Dabei müssen der minimale
Score und der maximale Störwert verschränkt in MinScore
angegeben
werden. Werden in ModelIDs
beispielsweise zwei Modelle angegeben,
wobei für Ersteres ein minimaler Score von 0.9 und für das zweite 0.8
festgelegt wird und der maximale Störwert des ersten Modells 0.1, für das
zweite Modell 0.2 betragen soll, muss MinScore
=
[0.9,0.1,0.8,0.2] angegeben werden.
Mit NumMatches
kann angegeben werden, wieviele Instanzen
des Modells im Bild höchstens gefunden werden sollen. Falls mehr
als NumMatches
Instanzen eine Bewertung größer als
MinScore
erreichen, werden nur die besten
NumMatches
Instanzen zurückgeliefert. Falls weniger als
NumMatches
Instanzen gefunden werden, werden nur diese
Instanzen zurückgeliefert, d.h. der Parameter MinScore
hat Vorrang vor NumMatches
. Sollen alle Modellinstanzen, deren
Bewertung MinScore
übersteigt, im Bild gefunden werden,
muss NumMatches
auf 0 gesetzt werden.
Beim Tracken der Matches durch die Bildpyramide werden auf jeder
Ebene Matches verworfen, die wenig vielversprechend sind. Dadurch ist
es möglich, dass Matches verworfen werden, die auf der niedrigsten
Pyramidenebene einen höheren Score gehabt hätten. Beispielsweise kann das
dazu führen, dass der gefundene Match für NumMatches
gleich
1 nicht mit dem Match mit dem höchsten Score übereinstimmt, der von
NumMatches
gleich 0 oder > 1 zurückgegeben wird.
Falls erwartet wird, dass mehrere Objekte mit einem ähnlichen Score gefunden
werden können, aber nur das Modell mit dem höchsten Score
zurückgegeben werden soll, kann es vorteilhaft sein, NumMatches
zu
erhöhen, und dann den Match mit dem höchsten Score auszuwählen.
Für den Fall, dass das Formmodell mit set_shape_model_clutter
um Störparameter erweitert wurde, berücksichtigt NumMatches
auch den zweiten Wert, der in MinScore
übergeben wird.
Gefundene Instanzen weisen in diesem Fall einen Score auf, der größer als
der erste Eintrag ist, sowie einen Störwert der niedriger als der
zweite Eintrag ist. Ist die Anzahl gefundener Instanzen größer als
NumMatches
, werden die besten NumMatches
Instanzen in
Bezug auf ihren Störwert zurückgegeben. MinScore
hat weiterhin
Vorrang vor NumMatches
und NumMatches
muss weiterhin
auf 0 gesetzt werden um alle Modellinstanzen zu erhalten, die die
Bedingungen von MinScore
erfüllen.
Es ist zu beachten, dass beim Tracken der Matches durch die Bildpyramide
keine Matches verworfen werden, wenn Störparameter verwendet werden.
Die Laufzeit mit Nutzung von Störparametern ist daher mindestens so hoch
wie die Laufzeit ohne Störparameter mit auf 0 gesetztem
Parameter NumMatches
.
Falls
NumMatches
einen Wert enthält, liefert
find_shape_models
die NumMatches
besten Instanzen
des Modells unabhängig von der Art des Modells zurück. Falls
z.B. in ModelIDs
zwei Modelle übergeben werden und
NumMatches
= 2 gewählt wird, kann es sein, dass zwei
Instanzen des ersten Modells und keine des zweiten Modells, eine
Instanz des ersten Modells und eine des zweiten Modells oder keine
Instanz des ersten Modells und zwei des zweiten Modells
zurückgeliefert werden. Falls hingegen NumMatches
mehrere
Werte enthält, werden so viele Instanzen des jeweiligen Modells in
ModelIDs
zurückgeliefert, wie durch das entsprechende
Element von NumMatches
angegeben. Falls
z.B. NumMatches
= [1,1] gewählt wird, wird eine Instanz
des ersten Modells und eine des zweiten Modells zurückgeliefert.
Falls das Modell Symmetrien aufweist, kann es vorkommen, dass
mehrere Instanzen an ähnlichen Positionen im Bild, aber mit
verschiedenen Rotationen gefunden werden. Mit dem Parameter
MaxOverlap
kann bestimmt werden, um welchen Anteil,
ausgedrückt als Zahl zwischen 0 und 1, sich zwei Instanzen höchstens
überlappen dürfen, damit sie als verschieden angesehen werden, und
somit zurückgeliefert werden. Falls sich zwei Instanzen um mehr als
MaxOverlap
überlappen, wird nur die beste gefundene Instanz
zurückgeliefert. Die Berechnung der Überlappung erfolgt anhand der
kleinsten umschließenden Rechtecke beliebiger Orientierung der
Konturen (siehe smallest_rectangle2
). Bei
MaxOverlap
=0 dürfen sich die gefundenen Instanzen nicht
überlappen, bei MaxOverlap
=1 werden alle gefundenen
Instanzen zurückgeliefert.
Falls MaxOverlap
einen Wert
enthält, wird die Überlappung für alle gefundenen Instanzen des
Modells unabhängig von der Art des Modells berechnet. D.h., dass
sich zu viel überlappende Instanzen verschiedener und gleicher
Modelle eliminiert werden. Falls hingegen mehrere Werte in
MaxOverlap
übergeben werden, wird die Überlappung nur
innerhalb der gefundenen Instanzen des jeweiligen Typs der Modelle
in ModelIDs
berechnet. D.h., es werden nur sich zu viel
überlappende Instanzen gleicher Modelle eliminiert. Modelle
verschiedenen Typs können sich in diesem Modus vollständig
überlappen.
Der Parameter SubPixel
gibt an, ob die Extraktion
subpixelgenau erfolgen soll. Falls SubPixel
auf
'none' (oder 'false' für Rückwärtskompatibilität)
gesetzt wird, wird die Lage des Modells nur pixelgenau bzw. mit der
bei create_shape_model
angegebenen Winkelauflösung bestimmt.
Falls SubPixel
auf 'interpolation' (oder
'true' ) gesetzt wird, werden sowohl die Position als auch
die Rotation subpixelgenau bestimmt. Dabei wird die Lage des
Modells anhand der Score-Funktion interpoliert. Dieser Modus kostet
fast keine Rechenzeit und liefert in den meisten Anwendungen eine
ausreichende Genauigkeit. In manchen Anwendungen ist eine möglichst
hohe Genauigkeit wichtig. In diesen Fällen kann die Lage des
Modells durch Ausgleichsrechnung, d.h., durch Minimierung der
Abstände der Modellpunkte und der zugehörigen Bildpunkte
(Least-Squares Adjustment), bestimmt werden. Im Gegensatz zu
'interpolation' kostet dieser Modus zusätzliche Rechenzeit.
Mit den verschiedenen Modi ('least_squares' ,
'least_squares_high' und
'least_squares_very_high' ) kann dabei die Genauigkeit
festgelegt werden, mit der der minimale Abstand gesucht wird. Je
höher die Genauigkeit gewählt wird, desto länger dauert allerdings
auch die Subpixel-Extraktion. Im Normalfall sollte für
SubPixel
'interpolation' gewählt werden. Falls
die Ausgleichsrechnung gewünscht wird, sollte
'least_squares' gewählt werden, da sich so der optimale
Kompromiss zwischen Laufzeit und Genauigkeit ergibt.
Objekte, die im Vergleich zum Modell leicht deformiert im Bild
erscheinen, können in manchen Fällen entweder nicht oder nur mit
einer geringen Genauigkeit gefunden werden. Für solche Objekte
besteht die Möglichkeit, im Parameter SubPixel
zusätzlich
die maximal zulässige Objektdeformation in Pixeln anzugeben. Dies
kann mit Hilfe des optionalen Parameterwertes
'max_deformation ' und einer nachfolgenden Ganzzahl
zwischen 0 und 32 (im selben String), die die
maximale Deformation beschreibt, erfolgen. Kann die Form des
Objektes z.B. bis zu 2 Pixel von der im Modell gespeicherten Form
abweichen, muss im Parameter SubPixel
der Wert
'max_deformation 2' zusätzlich zum oben beschriebenen Modus
für die subpixelgenaue Extraktion übergeben werden, also z.B.
['least_squares', 'max_deformation 2'] . Mit
'max_deformation 0' wird das Objekt ohne Deformationen
gesucht, also so als ob man kein 'max_deformation '
übergeben hätte. Zu beachten ist, dass größere Werte für die
maximale Deformation oft zu erhöhten Laufzeiten führen. Außerdem
besteht bei einem zu großen Wert die Gefahr, dass falsche Kandidaten
gefunden werden. Beide Probleme können hauptsächlich bei kleinen
Objekten oder Objekten mit feinen Strukturen auftreten. Der Grund
hierfür ist, dass solche Objekte durch große erlaubte Deformationen
ihre für die Suche wichtige charakteristische Form verlieren. Zu
beachten ist auch, dass die Genauigkeit von teilweise verdeckten
Objekten für höhere Deformationen abnehmen kann wenn Störobjekte in
der Nähe des Objektes vorhanden sind. Die maximale Deformation
sollte demnach immer nur so groß wie nötig und so gering wie möglich
gewählt werden. Näherungsweise rotationssymmetrische Objekt könnten
nicht gefunden werden, falls 'max_deformation' und
AngleExtent
beide auf einen Wert größer 0 gesetzt sind. In dem Fall
kann es zu Mehrdeutigkeiten kommen, die nicht aufgelöst werden können,
sodass der Match als falsch verworfen wird. Wenn das passiert, versuchen
Sie, entweder 'max_deformation' oder AngleExtent
auf 0 zu
setzen oder das Modell so zu verändern, dass weniger Symmetrien auftreten.
Die Score-Berechnung bei Deformationswerten größer
0 hängt von der Art der Subpixel-Extraktion ab. In den
meisten Fällen wird sich der Score eines Matches verändern, wenn man
'least_squares' , 'least_squares_high' oder
'least_squares_very_high' (siehe oben) wählt (im Vergleich
zu 'none' oder 'interpolation' ). Außerdem wird
sich der Score in der Regel erhöhen, wenn man bei einer der
Least-Squares-Adjustment-Methoden die maximale Deformation erhöht,
da dann zu den Modellpunkten mehr zugehörige Bildpunkte gefunden
werden können. Für einen aussagekräftigen Score und zum Vermeiden
falscher Matches wird empfohlen, das Erlauben einer Deformation
mit einer Subpixel-Extraktion mit einer der
Least-Squares-Adjustment-Methoden zu kombinieren.
Falls die Subpixel-Extraktion und/oder die maximale Objektdeformation
für jedes Modell einzeln spezifiziert werden sollen, muss in
SubPixel
die Subpixel-Extraktion genauso oft angegeben werden,
wie die Anzahl von Elementen in ModelIDs
. Nach jedem übergebenen
Wert für die Subpixel-Extraktion kann optional ein zweiter Wert übergeben
werden, der die maximale Objektdeformation für das jeweilige Modell
beschreibt. Wird nach dem Wert für die Subpixel-Extraktion kein Wert
für die Objektdeformation übergeben, wird das entsprechende Modell ohne
Deformation gesucht. Falls z.B. zwei Modelle in ModelIDs
angegeben
sind und für das erste Modell die Subpixel-Extraktion
'interpolation' ohne zulässige Objektdeformation gewählt werden
soll und für das zweite Modell die Subpixel-Extraktion
'least_squares' gewünscht ist sowie eine maximale
Objektdeformation von 3 Pixeln, dann kann für den
Parameter SubPixel
das Tupel
['interpolation', 'least_squares', 'max_deformation 3']
übergeben werden. Alternativ kann auch das äquivalente Tupel
['interpolation', 'max_deformation 0', 'least_squares',
'max_deformation 3'] übergeben werden.
Mit NumLevels
wird die Anzahl der Pyramidenebenen
festgelegt, die bei der Suche verwendet werden soll. Die Anzahl der
Ebenen wird gegebenenfalls auf den bei der Erzeugung mit
create_shape_model
angegebenen Bereich beschnitten. Falls
NumLevels
als 0 angegeben wird, wird die mit
create_shape_model
angegebene Anzahl verwendet.
In manchen Fällen kann es sein, dass die Anzahl der Pyramidenebenen,
die beispielsweise automatisch mit create_shape_model
ermittelt
wurde, zu hoch ist. Dann werden eventuell Instanzen, die eine sehr hohe
finale Bewertung gehabt hätten, bereits auf der höchsten Pyramidenebene
ausgeschlossen und damit nicht gefunden. Anstatt nun MinScore
auf
einen sehr geringen Wert zu setzen, um alle Matches zu finden, kann der
Wert von NumLevels
mit get_shape_model_params
ermittelt
werden und dann ein etwas geringerer Wert in find_shape_models
genutzt werden. Diese Herangehensweise führt oft zu besseren Ergebnissen
hinsichtlich Geschwindigkeit und Robustheit.
Optional kann NumLevels
einen zweiten Wert enthalten, der die
unterste Pyramidenebene spezifiziert, bis auf welche die Matches
verfolgt werden sollen. Ein Wert von [4,2] bedeutet also,
dass das Matching auf der vierten Pyramidenebene begonnen wird und
auf der zweituntersten Pyramidenebene beendet wird (die unterste
Pyramidenebene hat den Wert 1). Dieser Mechanismus kann dazu
verwendet werden, Laufzeit einzusparen. Allerdings ist in diesem
Modus im allgemeinen die Genauigkeit der gefundenen Lageparameter
geringer als im Normalfall, in dem die Matches bis auf die unterste
Pyramidenebene verfolgt werden. Falls eine hohe Genauigkeit erzielt
werden soll, empfiehlt es sich also, mindestens
'least_squares' für SubPixel
zu verwenden. Falls
die unterste zu verwendende Pyramidenebene zu groß gewählt wird,
kann es vorkommen, dass die gewünschte Genauigkeit nicht mehr
erreicht werden kann, oder dass falsche Instanzen des Modells
gefunden werden, weil das Modell auf den oberen Pyramidenstufen
nicht eindeutig genug ist, um eine sichere Selektion der korrekten
Instanz des Modells zu ermöglichen. In diesem Fall muss ein
kleinerer Wert für die unterste zu verwendende Pyramidenebene
gewählt werden.
Falls die unterste Pyramidenebene für jedes Modell
einzeln spezifiziert werden soll, müssen in NumLevels
zweimal die Anzahl von Elementen in ModelIDs
angegeben
werden. Dabei sind die Anzahl der Pyramidenebenen und der untersten
Pyramidenebenen verschränkt anzugeben. Falls z.B. zwei Modelle in
ModelIDs
angegeben sind, die oberste Pyramidenebene für das
erste Modell 5 und für das zweite Modell 4 sein soll und die
unterste Pyramidenebene für das erste Modell 2 und für das zweite 1
sein soll, so ist NumLevels
= [5,2,4,1] zu
wählen. Falls genau zwei in ModelIDs
angegeben sind,
ergibt sich als Spezialfall, dass, falls die unterste Pyramidenebene
spezifiziert werden soll, die oberste und unterste Pyramidenebene
für beide Modelle explizit spezifiziert werden muss, selbst wenn
sie gleich sind. Ein Tupel der Länge zwei in NumLevels
wird in diesem Fall nämlich als Spezifikation der obersten
Pyramidenebene für die zwei Modelle interpretiert.
In mangelhaften Eingabebildern, d.h., in Bildern die z.B. unscharf,
deformiert oder verrauscht sind, kann auf der untersten
Pyramidenebene oft keine Instanz des Formmodells gefunden werden, da
aufgrund der mangelhaften Bildqualität nicht genügend
Kanteninformation vorhanden ist, oder die Kanten zu stark deformiert
sind. Auf höheren Pyramidenebenen dagegen kann die
Kanteninformation noch ausreichend sein um Instanzen des Modells zu
finden, wobei auch hierbei die oben beschriebenen Einschränkungen
bezüglich Genauigkeit und Robustheit gelten. Die Wahl der passenden
Pyramidenebene, d.h., der untersten Pyramidenebene auf der noch eine
Instanz des Modells gefunden wird, hängt sowohl vom Modell als auch
vom Eingabebild ab. Diese Pyramidenebene kann also von Bild zu Bild
variieren. Um das Matching auf mangelhaften Bildern zu erleichtern,
kann die unterste Pyramidenebene, auf der noch eine Instanz des
Modells gefunden wird, während des Matchings automatisch bestimmt
werden. Um diesen als 'increased tolerance mode' bezeichneten
Mechanismus zu aktivieren, muss die unterste
Pyramidenebene in NumLevels
negativ angegeben werden. Wird
z.B. NumLevels
= [5,2,4,-1] gesetzt, so ist die
unterste Pyramidenebene für das erste Modell 2. Kann auf der
Pyramidenebene 2 keine Instanz des ersten Formmodells gefunden
werden, so wird für dieses Modell kein Ergebnis zurückgegeben. Für
das zweite Modell ist in diesem Beispiel die unterste Pyramidenebene
auf -1 gesetzt. Daher wird versucht, eine Instanz des
Formmodells auf der Pyramidenebene 1 zu finden. Kann auf dieser
Pyramidenebene keine Instanz gefunden werden, so wird die unterste
Pyramidenebene ermittelt, auf der noch Instanzen des Modells
gefunden wurden. Die Instanzen dieser Pyramidenebene werden dann
als Ergebnis zurückgegeben.
Der Parameter Greediness
bestimmt, wie „gierig“ die Suche
durchgeführt werden soll. Für Greediness
=0 wird eine
sichere Suchheuristik verwendet, die das Modell, falls im Bild
vorhanden, immer findet, wenn die anderen Parameter passend gesetzt sind.
Allerdings ist die Suche hiermit relativ
zeitaufwendig. Für Greediness
=1 wird eine unsicherere
Suchheuristik verwendet, bei der es in seltenen Fällen vorkommen
kann, dass das Modell nicht gefunden wird, obwohl es im Bild
sichtbar ist. Für Greediness
=1 wird die maximale
Suchgeschwindigkeit erreicht. In den allermeisten Fällen wird das
Formmodell für Greediness
=0.9 immer sicher gefunden.
Die Position und Rotation der gefundenen Instanzen der Modelle wird
in Row
, Column
und Angle
zurückgeliefert.
Die Koordinaten Row
und Column
sind die
Koordinaten des Ursprungs des Modells im Suchbild. Normalerweise
ist der Ursprung des Modells der Schwerpunkt der Region des Bildes,
das zur Erzeugung des Formmodells mit create_shape_model
verwendet wurde. Ein anderer Ursprung kann mit
set_shape_model_origin
festgelegt werden.
Beachten Sie, dass die Koordinaten Row
und Column
nicht exakt mit dem Ursprung des Modells übereinstimmen und daher
nicht direkt verwendet werden sollten. Die Werte sind dafür
optimiert, die Transformationsmatrix zu erzeugen, mit der die
Matching-Ergebnisse für verschiedene Aufgaben verwendet werden
können, z.B. um ROIs für andere Bildverarbeitungsschritte einem
Objekt nachzuführen. Das bei find_shape_model
angegebene
Beispiel zeigt, wie diese Matrix erzeugt wird und wie man damit das
Modell an der gefundenen Position im Suchbild visualisiert und die
exakten Koordinaten berechnet.
Beachten Sie, dass die Visualisierung aber auch mit der Prozedur dev_display_shape_matching_results realisiert werden kann.
In Score
wird die Bewertung der gefundenen
Instanzen zurückgegeben. Die Bewertung ist eine Zahl zwischen 0 und
1 und ist ein ungefähres Maß dafür, welcher Anteil des Modells im
Bild zu sehen ist. Falls z.B. die Hälfte des Modells im Bild
verdeckt ist, kann die Bewertung nicht größer als 0.5 sein.
Falls das Formmodell mit set_shape_model_clutter
um
Störparameter erweitert wurde, gibt Score
, nach den oben
genannten Werten, auch den Störwert jeder gefundenen Instanz zurück.
Falls beispielsweise die Hälfte der Störregion Störkanten
aufweist entspricht der Störwert 0.5.
Werden z.B. zwei Instanzen gefunden,
wobei für Erstere eine Bewertung von 0.9 und für die zweite 0.8
erreicht wird und der Störwert der ersten Instanz 0.2, der
zweiten Instanz 0.1 ist, wird Score
=
[0.9,0.8,0.2,0.1] zurückgegeben.
Es ist zu beachten, dass von sämtlichen Ergebnissen des formbasierten
Matchings die Störwerte am stärksten von Beleuchtungsänderungen
beeinflusst werden.
Der gefundene Modelltyp wird in Model
zurückgeliefert. Die
Elemente von Model
sind ein Index in das Tupel
ModelIDs
, d.h. sie können Werte von 0 bis
|ModelIDs
|-1 enthalten. Ein Wert von 0 in einem Element
von Model
entspricht also einer Instanz des ersten in
ModelIDs
übergebenen Modells.
Mittels des Operators set_shape_model_param
können Sie einen
'timeout' für find_shape_models
angeben. Falls die durch
ModelIDs
referenzierten Modelle unterschiedliche Werte für
'timeout' besitzen, wählt find_shape_models
den
niedrigsten aus. Wenn find_shape_models
diesen 'timeout'
erreicht endet er ohne Ergebnis und gibt den Fehlercode 9400 (H_ERR_TIMEOUT)
zurück.
Wenn über den Parameter ModelIDs
mehrere Modelle übergeben werden,
sollten diese mit dem gleichen Wert für MinContrast
erzeugt worden
sein. Falls sie mit unterschiedlichen Werten für MinContrast
erzeugt worden sind, wird in find_shape_models
der kleinste dieser
Werte verwendet.
Die Verwendung der Prozedur dev_display_shape_matching_results
wird zur Darstellung der Resultate formbasierten Matchings
stark empfohlen.
Ein Überblick zu den verschiedenen in HALCON verwendeten 2D Koordinatensystemen ist in der Einleitung zum Kapitel Transformationen / 2D-Transformationen gegeben.
Dieser Operator unterstützt Cancel-Timeouts und Interrupts.
Image
(input_object) (multichannel-)image(-array) →
object (byte / uint2)
Eingabebild, in dem die Modelle gefunden werden sollen.
ModelIDs
(input_control) shape_model(-array) →
(handle)
Handle der Modelle.
AngleStart
(input_control) angle.rad(-array) →
(real)
Kleinste auftretende Rotation der Modelle.
Defaultwert: -0.39
Wertevorschläge: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
AngleExtent
(input_control) angle.rad(-array) →
(real)
Ausdehnung des Winkelbereichs.
Defaultwert: 0.79
Wertevorschläge: 6.29, 3.14, 1.57, 0.79, 0.39, 0.0
Restriktion: AngleExtent >= 0
MinScore
(input_control) real(-array) →
(real)
Minimale Bewertung der zu findenden Instanzen der Modelle.
Defaultwert: 0.5
Wertevorschläge: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Typischer Wertebereich: 0
≤
MinScore
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
NumMatches
(input_control) integer(-array) →
(integer)
Anzahl der zu findenden Instanzen der Modelle (oder 0 für alle Treffer).
Defaultwert: 1
Wertevorschläge: 0, 1, 2, 3, 4, 5, 10, 20
MaxOverlap
(input_control) real(-array) →
(real)
Maximale Überlappung der zu findenden Instanzen der Modelle.
Defaultwert: 0.5
Wertevorschläge: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Typischer Wertebereich: 0
≤
MaxOverlap
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
SubPixel
(input_control) string(-array) →
(string)
Subpixelgenauigkeit falls ungleich 'none' .
Defaultwert: 'least_squares'
Wertevorschläge: 'none' , 'interpolation' , 'least_squares' , 'least_squares_high' , 'least_squares_very_high' , 'max_deformation 1' , 'max_deformation 2' , 'max_deformation 3' , 'max_deformation 4' , 'max_deformation 5' , 'max_deformation 6'
NumLevels
(input_control) integer(-array) →
(integer)
Anzahl der verwendeten Pyramidenebenen (und
unterste zu verwendende Pyramidenebene falls
|NumLevels
| = 2).
Defaultwert: 0
Werteliste: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Greediness
(input_control) real(-array) →
(real)
„Gierigkeit“ der Suchheuristik (0: sicher aber langsam; 1: schnell aber Matches können „übersehen“ werden).
Defaultwert: 0.9
Wertevorschläge: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Typischer Wertebereich: 0
≤
Greediness
≤
1
Minimale Schrittweite: 0.01
Empfohlene Schrittweite: 0.05
Row
(output_control) point.y-array →
(real)
Zeilenkoordinate der gefundenen Instanzen der Modelle.
Column
(output_control) point.x-array →
(real)
Spaltenkoordinate der gefundenen Instanzen der Modelle.
Angle
(output_control) angle.rad-array →
(real)
Rotationswinkel der gefundenen Instanzen der Modelle.
Score
(output_control) real-array →
(real)
Bewertung der gefundenen Instanzen der Modelle.
Model
(output_control) integer-array →
(integer)
Index der gefundenen Instanzen der Modelle.
read_image (Image, 'pcb_focus/pcb_focus_telecentric_061') gen_rectangle1 (ROI_0, 236, 241, 313, 321) gen_circle (ROI_1, 281, 653, 41) reduce_domain (Image, ROI_0, ImageReduced1) reduce_domain (Image, ROI_1, ImageReduced2) create_shape_model (ImageReduced1, 0, rad(-45), rad(180), 0, \ 'none', 'use_polarity', 30, 10, ModelID1) create_shape_model (ImageReduced2, 0, rad(-45), rad(180), 0, \ 'none', 'use_polarity', 30, 10, ModelID2) ModelIDs:=[ModelID1, ModelID2] find_shape_models (Image, ModelIDs, rad(-45), rad(90), 0.7, [1,1], 0.5, \ 'least_squares', 0, 1, Row, Column, Angle, Score, Model) * Display results dev_display_shape_matching_results (ModelIDs, 'red', Row, Column, Angle, \ 1, 1, Model)
Sind die Parameterwerte korrekt, dann liefert
find_shape_models
den Wert 2 (H_MSG_TRUE). Das Verhalten bei leerer
Eingabe (keine Eingabebilder vorhanden) lässt sich mittels
set_system('no_object_result',<Result>)
festlegen.
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
add_channels
,
create_shape_model
,
read_shape_model
,
set_shape_model_origin
,
set_shape_model_param
,
set_shape_model_clutter
find_scaled_shape_models
,
find_aniso_shape_models
,
find_shape_model
,
find_scaled_shape_model
,
find_aniso_shape_model
,
find_ncc_model
,
find_ncc_models
Matching