| Operatoren |
find_scaled_shape_model — Suche der besten Matches eines isotrop skalierten Formmodells in einem Bild.
find_scaled_shape_model(Image : : ModelID, AngleStart, AngleExtent, ScaleMin, ScaleMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, Scale, Score)
find_scaled_shape_model findet die besten NumMatches Instanzen des isotrop skalierten Formmodells ModelID im Eingabebild Image. Das Modell muss zuvor mit create_scaled_shape_model erzeugt oder mit read_shape_model eingelesen worden sein.
Die Position, Rotation und Skalierung der gefundenen Instanzen des Modells werden in Row, Column, Angle und Scale zurückgeliefert.
Die Koordinaten Row und Column beschreiben die Position des Ursprungs des Modells im Suchbild. Die Werte sind allerdings bereits geringfügig angepasst, so dass sie direkt zur Erstellung einer Transformationsmatrix verwendet werden können, die für ein Alignment oder die Visualisierung der Modellkanten benötigt wird. Diese Anpassung der Koordinaten hat mit der Art und Weise zu tun, in der HALCON ikonische Objekte transformiert, siehe hierzu affine_trans_pixel. Das Beispiel weiter unten zeigt, wie die Transformationsmatrix erzeugt wird und wie man damit das Modell an der gefundenen Position im Suchbild visualisiert und die exakten Koordinaten berechnet.
Normalerweise ist der Ursprung des Modells der Schwerpunkt der Region des Bildes, das zur Erzeugung des Formmodells mit create_scaled_shape_model verwendet wurde. Ein anderer Ursprung kann mit set_shape_model_origin festgelegt werden.
Zusätzlich wird in Score 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.
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_scaled_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). 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.
Die Parameter AngleStart und AngleExtent legen den Winkelbereich fest, in dem nach dem Modell gesucht wird. Die Parameter ScaleMin und ScaleMax legen den Bereich der Skalierungen fest, in dem nach dem Modell gesucht wird. Der Winkel- und Skalierungsbereich wird gegebenenfalls auf den Bereich beschnitten, der bei der Erzeugung des Modells mit create_scaled_shape_model angegeben worden ist. Dies bedeutet insbesondere, dass die Winkelbereiche des Modells und der Suche sich tatsächlich überlappen müssen. Eine Änderung des Winkelbereichs bei der Suche modulo erfolgt nicht. Zur Vereinfachung der Darstellung werden im Rest des Absatzes alle Winkel in Grad angegeben, obwohl sie in find_scaled_shape_model im Bogenmaß angegeben werden müssen. Falls das Modell also z.B. mit AngleStart = -20° und AngleExtent = 40° erzeugt worden ist und der Suchbereich in find_scaled_shape_model z.B. auf AngleStart = 350° und AngleExtent = 20° gesetzt wird, wird das Modell nicht gefunden, obwohl sich die Winkelbereiche bei Betrachtung modulo 360° überlappen würden. Um das Modell zu finden, muss in diesem Beispiel AngleStart = -10° gewählt werden.
Außerdem ist zu beachten, dass es in manchen Fällen vorkommen kann, dass Instanzen gefunden werden, deren Rotation oder Skalierung geringfügig außerhalb des übergebenen Winkel- bzw. Skalierungsbereichs liegt. Dies kann dann auftreten, wenn der übergebene Bereich kleiner ist als der Bereich, der bei der Erzeugung des Modells angegeben worden ist.
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.
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.
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.
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_scaled_shape_model angegebenen Winkel- und Skalierungsauflösung bestimmt. Falls SubPixel auf 'interpolation' (oder 'true') gesetzt wird, werden sowohl die Position als auch die Rotation und Skalierung 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.
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_scaled_shape_model angebenen Bereich beschnitten. Falls NumLevels als 0 angegeben wird, wird die mit create_scaled_shape_model angegebene Anzahl verwendet. 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, um Laufzeit einzusparen. Allerdings ist in diesem Modus im allgemeinen die Genauigkeit der gefundenen Lageparameter geringer, als in 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.
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 = [4,-2] gesetzt, so wird das Matching auf der vierten Pyramidenebene begonnen und auf der zweituntersten Pyramidenebene beendet. Es wird also versucht, eine Instanz des Formmodells auf der Pyramidenebene 2 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.
Mittels des Operators set_shape_model_param können sie einen 'timeout' für find_scaled_shape_model angeben. Wenn find_scaled_shape_model diesen 'timeout' erreicht endet er ohne Ergebnis und gibt den Fehlercode 9400 (H_ERR_TIMEOUT) zurück. Abhängig von der Größe des Skalierungsintervalls, das durch ScaleMin und ScaleMax festgelegt wird, benötigt find_scaled_shape_model eine signifikante Zeitspanne um den Speicher für gecachte Transformationen freizugeben, falls das Modell nicht vorberechnet wurde. Da diese Transformationen auch freigegeben werden müssen nachdem ein Timeout auftritt, überschreitet find_scaled_shape_model den in 'timeout' angegebenen Wert um diese Zeitspanne.
Eingabebild, in dem das Modell gefunden werden soll.
Handle des Modells.
Kleinste auftretende Rotation des Modells.
Defaultwert: -0.39
Wertevorschläge: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
Ausdehnung des Winkelbereichs.
Defaultwert: 0.78
Wertevorschläge: 6.29, 3.14, 1.57, 0.79, 0.39, 0.0
Restriktion: AngleExtent >= 0
Kleinste auftretende Skalierung des Modells.
Defaultwert: 0.9
Wertevorschläge: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Restriktion: ScaleMin > 0
Größte auftretende Skalierung des Modells.
Defaultwert: 1.1
Wertevorschläge: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5
Restriktion: ScaleMax >= ScaleMin
Minimale Bewertung der zu findenden Instanzen des Modells.
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
Anzahl der zu findenden Instanzen des Modells (oder 0 für alle Treffer).
Defaultwert: 1
Wertevorschläge: 0, 1, 2, 3, 4, 5, 10, 20
Maximale Überlappung der zu findenden Instanzen des Modells.
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
Subpixelgenauigkeit falls ungleich 'none'.
Defaultwert: 'least_squares'
Werteliste: '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', 'none'
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
„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
Zeilenkoordinate der gefundenen Instanzen des Modells.
Spaltenkoordinate der gefundenen Instanzen des Modells.
Rotationswinkel der gefundenen Instanzen des Modells.
Skalierung der gefundenen Instanzen des Modells.
Bewertung der gefundenen Instanzen des Modells.
create_scaled_shape_model (ImageReduced, 0, rad(-45), rad(180), 0, \
0.9, 1.1, 0, 'none', 'use_polarity', \
30, 10, ModelID)
get_shape_model_contours (ModelXLD, ModelID, 1)
find_scaled_shape_model (SearchImage, ModelID, rad(-45), rad(180), \
0.9, 1.1, 0.5, 1, 0.5, 'interpolation', \
0, 0, Row, Column, Angle, Scale, Score)
* Create transformation matrix
vector_angle_to_rigid (0, 0, 0, Row, Column, Angle, HomMat2DTmp)
hom_mat2d_scale (HomMat2DTmp, Scale, Scale, Row, Column, HomMat2DObject)
* Transform model contours for visualization
affine_trans_contour_xld (ModelXLD, ObjectXLD, HomMat2DObject)
* Calculate true position of the model origin in the search image
affine_trans_pixel (HomMat2DObject, 0, 0, RowObject, ColObject)
Sind die Parameterwerte korrekt, dann liefert find_scaled_shape_model 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.
create_scaled_shape_model, read_shape_model, set_shape_model_origin
find_shape_model, find_aniso_shape_model, find_shape_models, find_scaled_shape_models, find_aniso_shape_models, best_match_rot_mg
set_system, get_system, set_shape_model_param
Matching
| Operatoren |