find_aniso_shape_modelsT_find_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models (Operator)

Name

find_aniso_shape_modelsT_find_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models — Suche der besten Matches mehrerer anisotrop skalierter Formmodelle.

Signatur

find_aniso_shape_models(Image : : ModelIDs, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, SubPixel, NumLevels, Greediness : Row, Column, Angle, ScaleR, ScaleC, Score, Model)

Herror T_find_aniso_shape_models(const Hobject Image, const Htuple ModelIDs, const Htuple AngleStart, const Htuple AngleExtent, const Htuple ScaleRMin, const Htuple ScaleRMax, const Htuple ScaleCMin, const Htuple ScaleCMax, const Htuple MinScore, const Htuple NumMatches, const Htuple MaxOverlap, const Htuple SubPixel, const Htuple NumLevels, const Htuple Greediness, Htuple* Row, Htuple* Column, Htuple* Angle, Htuple* ScaleR, Htuple* ScaleC, Htuple* Score, Htuple* Model)

void FindAnisoShapeModels(const HObject& Image, const HTuple& ModelIDs, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple& ScaleRMin, const HTuple& ScaleRMax, const HTuple& ScaleCMin, const HTuple& ScaleCMax, const HTuple& MinScore, const HTuple& NumMatches, const HTuple& MaxOverlap, const HTuple& SubPixel, const HTuple& NumLevels, const HTuple& Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model)

static void HShapeModel::FindAnisoShapeModels(const HImage& Image, const HShapeModelArray& ModelIDs, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple& ScaleRMin, const HTuple& ScaleRMax, const HTuple& ScaleCMin, const HTuple& ScaleCMax, const HTuple& MinScore, const HTuple& NumMatches, const HTuple& MaxOverlap, const HTuple& SubPixel, const HTuple& NumLevels, const HTuple& Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model)

void HShapeModel::FindAnisoShapeModels(const HImage& Image, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const HString& SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const

void HShapeModel::FindAnisoShapeModels(const HImage& Image, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const char* SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const

void HShapeModel::FindAnisoShapeModels(const HImage& Image, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const wchar_t* SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const   ( Nur Windows)

void HImage::FindAnisoShapeModels(const HShapeModelArray& ModelIDs, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple& ScaleRMin, const HTuple& ScaleRMax, const HTuple& ScaleCMin, const HTuple& ScaleCMax, const HTuple& MinScore, const HTuple& NumMatches, const HTuple& MaxOverlap, const HTuple& SubPixel, const HTuple& NumLevels, const HTuple& Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const

void HImage::FindAnisoShapeModels(const HShapeModel& ModelIDs, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const HString& SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const

void HImage::FindAnisoShapeModels(const HShapeModel& ModelIDs, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const char* SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const

void HImage::FindAnisoShapeModels(const HShapeModel& ModelIDs, double AngleStart, double AngleExtent, double ScaleRMin, double ScaleRMax, double ScaleCMin, double ScaleCMax, double MinScore, Hlong NumMatches, double MaxOverlap, const wchar_t* SubPixel, Hlong NumLevels, double Greediness, HTuple* Row, HTuple* Column, HTuple* Angle, HTuple* ScaleR, HTuple* ScaleC, HTuple* Score, HTuple* Model) const   ( Nur Windows)

static void HOperatorSet.FindAnisoShapeModels(HObject image, HTuple modelIDs, HTuple angleStart, HTuple angleExtent, HTuple scaleRMin, HTuple scaleRMax, HTuple scaleCMin, HTuple scaleCMax, HTuple minScore, HTuple numMatches, HTuple maxOverlap, HTuple subPixel, HTuple numLevels, HTuple greediness, out HTuple row, out HTuple column, out HTuple angle, out HTuple scaleR, out HTuple scaleC, out HTuple score, out HTuple model)

static void HShapeModel.FindAnisoShapeModels(HImage image, HShapeModel[] modelIDs, HTuple angleStart, HTuple angleExtent, HTuple scaleRMin, HTuple scaleRMax, HTuple scaleCMin, HTuple scaleCMax, HTuple minScore, HTuple numMatches, HTuple maxOverlap, HTuple subPixel, HTuple numLevels, HTuple greediness, out HTuple row, out HTuple column, out HTuple angle, out HTuple scaleR, out HTuple scaleC, out HTuple score, out HTuple model)

void HShapeModel.FindAnisoShapeModels(HImage image, double angleStart, double angleExtent, double scaleRMin, double scaleRMax, double scaleCMin, double scaleCMax, double minScore, int numMatches, double maxOverlap, string subPixel, int numLevels, double greediness, out HTuple row, out HTuple column, out HTuple angle, out HTuple scaleR, out HTuple scaleC, out HTuple score, out HTuple model)

void HImage.FindAnisoShapeModels(HShapeModel[] modelIDs, HTuple angleStart, HTuple angleExtent, HTuple scaleRMin, HTuple scaleRMax, HTuple scaleCMin, HTuple scaleCMax, HTuple minScore, HTuple numMatches, HTuple maxOverlap, HTuple subPixel, HTuple numLevels, HTuple greediness, out HTuple row, out HTuple column, out HTuple angle, out HTuple scaleR, out HTuple scaleC, out HTuple score, out HTuple model)

void HImage.FindAnisoShapeModels(HShapeModel modelIDs, double angleStart, double angleExtent, double scaleRMin, double scaleRMax, double scaleCMin, double scaleCMax, double minScore, int numMatches, double maxOverlap, string subPixel, int numLevels, double greediness, out HTuple row, out HTuple column, out HTuple angle, out HTuple scaleR, out HTuple scaleC, out HTuple score, out HTuple model)

def find_aniso_shape_models(image: HObject, model_ids: MaybeSequence[HHandle], angle_start: MaybeSequence[float], angle_extent: MaybeSequence[float], scale_rmin: MaybeSequence[float], scale_rmax: MaybeSequence[float], scale_cmin: MaybeSequence[float], scale_cmax: MaybeSequence[float], min_score: MaybeSequence[float], num_matches: MaybeSequence[int], max_overlap: MaybeSequence[float], sub_pixel: MaybeSequence[str], num_levels: MaybeSequence[int], greediness: MaybeSequence[float]) -> Tuple[Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[float], Sequence[int]]

Beschreibung

find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models findet die besten NumMatchesNumMatchesNumMatchesnumMatchesnum_matches Instanzen der anisotrop skalierten Formmodelle, die in ModelIDsModelIDsModelIDsmodelIDsmodel_ids übergeben werden, im Eingabebild ImageImageImageimageimage. Die Modelle müssen zuvor mit create_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model erzeugt oder mit read_shape_modelread_shape_modelReadShapeModelReadShapeModelread_shape_model eingelesen worden sein. Im Gegensatz zu find_aniso_shape_modelfind_aniso_shape_modelFindAnisoShapeModelFindAnisoShapeModelfind_aniso_shape_model kann also eine Mehrzahl von Modellen gleichzeitig im selben Bild gesucht werden.

Die Position, Rotation und Skalierung in Zeilen- und Spaltenrichtung der gefundenen Instanzen des Modells werden in RowRowRowrowrow, ColumnColumnColumncolumncolumn, AngleAngleAngleangleangle, ScaleRScaleRScaleRscaleRscale_r und ScaleCScaleCScaleCscaleCscale_c zurückgeliefert. In ScoreScoreScorescorescore wird die Bewertung der gefundenen Instanzen zurückgegeben. Der gefundene Modelltyp wird in ModelModelModelmodelmodel zurückgeliefert. Nähere Informationen finden Sie in den parameterspezifischen Abschnitten.

Besonderheiten der Parametersemantik

Gegenüber find_aniso_shape_modelfind_aniso_shape_modelFindAnisoShapeModelFindAnisoShapeModelfind_aniso_shape_model unterscheidet sich die Semantik aller Eingabeparameter etwas. Alle Eingabeparameter müssen entweder genau ein Element enthalten, oder dieselbe Anzahl von Elementen wie ModelIDsModelIDsModelIDsmodelIDsmodel_ids. (NumLevelsNumLevelsNumLevelsnumLevelsnum_levels kann auch zwei oder zweimal die Anzahl von Elementen wie ModelIDsModelIDsModelIDsmodelIDsmodel_ids 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 ModelIDsModelIDsModelIDsmodelIDsmodel_ids verwendet. Zusätzliche Details können in den parameterspezifischen Abschnitten weiter unten gefunden werden. Ein Aufruf von find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models mit mehreren Werten für ModelIDsModelIDsModelIDsmodelIDsmodel_ids, NumMatchesNumMatchesNumMatchesnumMatchesnum_matches und MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap entspricht von der Wirkung her also mehreren unabhängigen Aufrufen von find_aniso_shape_modelfind_aniso_shape_modelFindAnisoShapeModelFindAnisoShapeModelfind_aniso_shape_model mit den jeweiligen Parametern, ist allerdings wesentlich effizienter.

Eingabeparameter im Detail

ImageImageImageimageimage und seine Region:

Der Definitionsbereich des Bildes ImageImageImageimageimage 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_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model verwendet wurde. Ein eventuell mit set_shape_model_originset_shape_model_originSetShapeModelOriginSetShapeModelOriginset_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 MinScoreMinScoreMinScoreminScoremin_score 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')set_system("border_shape_models","true")SetSystem("border_shape_models","true")SetSystem("border_shape_models","true")set_system("border_shape_models","true") für alle Modelle oder mit set_shape_model_param(ModelID,'border_shape_models','true')set_shape_model_param(ModelID,"border_shape_models","true")SetShapeModelParam(ModelID,"border_shape_models","true")SetShapeModelParam(ModelID,"border_shape_models","true")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 MinScoreMinScoreMinScoreminScoremin_score 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_circledilation_circleDilationCircleDilationCircledilation_circle zu vergrößern.

Wie üblich wird die Region des Eingabebildes ImageImageImageimageimage als Suchbereich für den Referenzpunkt der Modelle ModelIDsModelIDsModelIDsmodelIDsmodel_ids verwendet. Konsistent mit der obigen Semantik kann ImageImageImageimageimage also ein einzelnes Bildobjekt beinhalten oder ein Bildobjekttupel. Falls ImageImageImageimageimage ein einzelnes Bildobjekt enthält, wird dessen Region als Suchbereich für alle Modelle in ModelIDsModelIDsModelIDsmodelIDsmodel_ids verwendet. Falls ImageImageImageimageimage mehrere Bildobjekte enthält, wird die jeweilige Region als Suchbereich für das entsprechende Modell aus ModelIDsModelIDsModelIDsmodelIDsmodel_ids verwendet. In diesem Fall müssen die Bilder, abgesehen von ihrer Region, identisch sein, d.h. ihre Pointer müssen das gleiche Bild referenzieren und somit identisch sein (siehe get_image_pointer1get_image_pointer1GetImagePointer1GetImagePointer1get_image_pointer1 zum Überprüfen der Pointer). Folglich kann ImageImageImageimageimage nicht in beliebiger Weise mit concat_objconcat_objConcatObjConcatObjconcat_obj aufgebaut werden, sondern muss aus demselben Bild mit add_channelsadd_channelsAddChannelsAddChannelsadd_channels oder äquivalenten Aufrufen erzeugt werden. Falls das nicht der Fall ist, wird eine Fehlermeldung zurückgeliefert.

AngleStartAngleStartAngleStartangleStartangle_start, AngleExtentAngleExtentAngleExtentangleExtentangle_extent, ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin, ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax, ScaleCMinScaleCMinScaleCMinscaleCMinscale_cmin, ScaleCMaxScaleCMaxScaleCMaxscaleCMaxscale_cmax:

Die Parameter AngleStartAngleStartAngleStartangleStartangle_start und AngleExtentAngleExtentAngleExtentangleExtentangle_extent legen den Winkelbereich fest, in dem nach dem Modell gesucht wird. Die Parameter ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin, ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax, ScaleCMinScaleCMinScaleCMinscaleCMinscale_cmin und ScaleCMaxScaleCMaxScaleCMaxscaleCMaxscale_cmax legen den Bereich der Skalierungen in Zeilen- und Spaltenrichtung 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_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model angegeben worden ist. Dies bedeutet insbesondere, dass die Winkelbereiche des Modells und der Suche sich überlappen müssen.

Wird in ModelIDsModelIDsModelIDsmodelIDsmodel_ids ein Modell übergeben, das mit create_shape_modelcreate_shape_modelCreateShapeModelCreateShapeModelcreate_shape_model oder mit create_scaled_shape_modelcreate_scaled_shape_modelCreateScaledShapeModelCreateScaledShapeModelcreate_scaled_shape_model erzeugt wurde, wird das Modell mit einer isotropen Skalierung von 1.0 bzw. mit einer isotropen Skalierung zwischen ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin und ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax gesucht. In diesem Fall werden in ScaleRScaleRScaleRscaleRscale_r und ScaleCScaleCScaleCscaleCscale_c identische Werte zurückgeliefert.

Beachten Sie, dass in einigen Fällen Instanzen mit einer Rotation oder Skalierung gefunden werden, die geringfügig außerhalb des angegebenen Winkel- und Skalierungsbereichs liegen. Dies kann vorkommen, wenn der angegebene Bereich kleiner ist als der bei der Erstellung des Modells angegebene Bereich. AngleStartAngleStartAngleStartangleStartangle_start und AngleExtentAngleExtentAngleExtentangleExtentangle_extent sowie ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin/ScaleCMinScaleCMinScaleCMinscaleCMinscale_cmin und ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax/ScaleCMaxScaleCMaxScaleCMaxscaleCMaxscale_cmax 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 der angegebenen Bereiche liegen.

MinScoreMinScoreMinScoreminScoremin_score:

Der Parameter MinScoreMinScoreMinScoreminScoremin_score 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 MinScoreMinScoreMinScoreminScoremin_score gewählt werden kann, desto schneller verläuft die Suche. Falls erwartet werden kann, dass das Modell niemals verdeckt wird, kann MinScoreMinScoreMinScoreminScoremin_score 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 MinScoreMinScoreMinScoreminScoremin_score liegen.

Falls ein einzelner Wert in MinScoreMinScoreMinScoreminScoremin_score übergeben wird, wird dieser Wert auf alle Instanzen angewandt, die mit allen Modellen gefunden werden. Falls MinScoreMinScoreMinScoreminScoremin_score mehrere Einträge enthält, werden die Werte einzeln für die entsprechenden Modelle verwendet.

Falls die Formmodelle mit set_shape_model_clutterset_shape_model_clutterSetShapeModelClutterSetShapeModelClutterset_shape_model_clutter um Störparameter erweitert wurden und dadurch 'use_clutter'"use_clutter""use_clutter""use_clutter""use_clutter" aktiviert wurde, wird in MinScoreMinScoreMinScoreminScoremin_score 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 NumMatchesNumMatchesNumMatchesnumMatchesnum_matches. Die verschiedenen Formmodelle müssen den gleichen Wert für 'use_clutter'"use_clutter""use_clutter""use_clutter""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 MinScoreMinScoreMinScoreminScoremin_score die doppelte Anzahl an Einträgen enthalten sein wie in ModelIDsModelIDsModelIDsmodelIDsmodel_ids. Dabei müssen der minimale Score und der maximale Störwert verschränkt in MinScoreMinScoreMinScoreminScoremin_score angegeben werden. Werden in ModelIDsModelIDsModelIDsmodelIDsmodel_ids 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 MinScoreMinScoreMinScoreminScoremin_score = [0.9,0.1,0.8,0.2] angegeben werden.

NumMatchesNumMatchesNumMatchesnumMatchesnum_matches:

Mit NumMatchesNumMatchesNumMatchesnumMatchesnum_matches kann angegeben werden, wie viele Instanzen des Modells im Bild höchstens gefunden werden sollen. Falls mehr als NumMatchesNumMatchesNumMatchesnumMatchesnum_matches Instanzen eine Bewertung größer als MinScoreMinScoreMinScoreminScoremin_score erreichen, werden nur die besten NumMatchesNumMatchesNumMatchesnumMatchesnum_matches Instanzen zurückgeliefert. Falls weniger als NumMatchesNumMatchesNumMatchesnumMatchesnum_matches Instanzen gefunden werden, werden nur diese Instanzen zurückgeliefert, d.h. der Parameter MinScoreMinScoreMinScoreminScoremin_score hat Vorrang vor NumMatchesNumMatchesNumMatchesnumMatchesnum_matches. Sollen alle Modellinstanzen, deren Bewertung MinScoreMinScoreMinScoreminScoremin_score übersteigt, im Bild gefunden werden, muss NumMatchesNumMatchesNumMatchesnumMatchesnum_matches 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 NumMatchesNumMatchesNumMatchesnumMatchesnum_matches gleich 1 nicht mit dem Match mit dem höchsten Score übereinstimmt, der von NumMatchesNumMatchesNumMatchesnumMatchesnum_matches 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, NumMatchesNumMatchesNumMatchesnumMatchesnum_matches 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_clutterset_shape_model_clutterSetShapeModelClutterSetShapeModelClutterset_shape_model_clutter um Störparameter erweitert wurde, berücksichtigt NumMatchesNumMatchesNumMatchesnumMatchesnum_matches auch den zweiten Wert, der in MinScoreMinScoreMinScoreminScoremin_score ü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 NumMatchesNumMatchesNumMatchesnumMatchesnum_matches, werden die besten NumMatchesNumMatchesNumMatchesnumMatchesnum_matches Instanzen in Bezug auf ihren Störwert zurückgegeben. MinScoreMinScoreMinScoreminScoremin_score hat weiterhin Vorrang vor NumMatchesNumMatchesNumMatchesnumMatchesnum_matches und NumMatchesNumMatchesNumMatchesnumMatchesnum_matches muss weiterhin auf 0 gesetzt werden um alle Modellinstanzen zu erhalten, die die Bedingungen von MinScoreMinScoreMinScoreminScoremin_score 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 NumMatchesNumMatchesNumMatchesnumMatchesnum_matches.

Enthält NumMatchesNumMatchesNumMatchesnumMatchesnum_matches einen Wert, liefert find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models die NumMatchesNumMatchesNumMatchesnumMatchesnum_matches besten Instanzen des Modells unabhängig von der Art des Modells zurück. Falls z.B. in ModelIDsModelIDsModelIDsmodelIDsmodel_ids zwei Modelle übergeben werden und NumMatchesNumMatchesNumMatchesnumMatchesnum_matches = 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 NumMatchesNumMatchesNumMatchesnumMatchesnum_matches mehrere Werte enthält, werden so viele Instanzen des jeweiligen Modells in ModelIDsModelIDsModelIDsmodelIDsmodel_ids zurückgeliefert, wie durch das entsprechende Element von NumMatchesNumMatchesNumMatchesnumMatchesnum_matches angegeben. Falls z.B. NumMatchesNumMatchesNumMatchesnumMatchesnum_matches = [1,1] gewählt wird, wird eine Instanz des ersten Modells und eine des zweiten Modells zurückgeliefert.

MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap:

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 MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap 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 MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap ü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_rectangle2smallest_rectangle2SmallestRectangle2SmallestRectangle2smallest_rectangle2). Bei MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap=0 dürfen sich die gefundenen Instanzen nicht überlappen, bei MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap=1 werden alle gefundenen Instanzen zurückgeliefert.

Falls MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap 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 MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap übergeben werden, wird die Überlappung nur innerhalb der gefundenen Instanzen des jeweiligen Typs der Modelle in ModelIDsModelIDsModelIDsmodelIDsmodel_ids 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.

SubPixelSubPixelSubPixelsubPixelsub_pixel:

Der Parameter SubPixelSubPixelSubPixelsubPixelsub_pixel gibt an, ob die Extraktion subpixelgenau erfolgen soll. Falls SubPixelSubPixelSubPixelsubPixelsub_pixel auf 'none'"none""none""none""none" (oder 'false'"false""false""false""false" für Rückwärtskompatibilität) gesetzt wird, wird die Lage des Modells nur pixelgenau bzw. mit der bei create_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model angegebenen Winkel- und Skalierungsauflösung bestimmt. Falls SubPixelSubPixelSubPixelsubPixelsub_pixel auf 'interpolation'"interpolation""interpolation""interpolation""interpolation" (oder 'true'"true""true""true""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'"interpolation""interpolation""interpolation""interpolation" kostet dieser Modus zusätzliche Rechenzeit. Mit den verschiedenen Modi ('least_squares'"least_squares""least_squares""least_squares""least_squares", 'least_squares_high'"least_squares_high""least_squares_high""least_squares_high""least_squares_high" und 'least_squares_very_high'"least_squares_very_high""least_squares_very_high""least_squares_very_high""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 SubPixelSubPixelSubPixelsubPixelsub_pixel 'interpolation'"interpolation""interpolation""interpolation""interpolation" gewählt werden. Falls die Ausgleichsrechnung gewünscht wird, sollte 'least_squares'"least_squares""least_squares""least_squares""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 SubPixelSubPixelSubPixelsubPixelsub_pixel zusätzlich die maximal zulässige Objektdeformation in Pixeln anzugeben. Dies kann mit Hilfe des optionalen Parameterwertes 'max_deformation '"max_deformation ""max_deformation ""max_deformation ""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 SubPixelSubPixelSubPixelsubPixelsub_pixel der Wert 'max_deformation 2'"max_deformation 2""max_deformation 2""max_deformation 2""max_deformation 2" zusätzlich zum oben beschriebenen Modus für die subpixelgenaue Extraktion übergeben werden, also z.B. ['least_squares', 'max_deformation 2']["least_squares", "max_deformation 2"]["least_squares", "max_deformation 2"]["least_squares", "max_deformation 2"]["least_squares", "max_deformation 2"]. Mit 'max_deformation 0'"max_deformation 0""max_deformation 0""max_deformation 0""max_deformation 0" wird das Objekt ohne Deformationen gesucht, also so als ob man kein 'max_deformation '"max_deformation ""max_deformation ""max_deformation ""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'"max_deformation""max_deformation""max_deformation""max_deformation" und AngleExtentAngleExtentAngleExtentangleExtentangle_extent 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'"max_deformation""max_deformation""max_deformation""max_deformation" oder AngleExtentAngleExtentAngleExtentangleExtentangle_extent 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""least_squares""least_squares""least_squares", 'least_squares_high'"least_squares_high""least_squares_high""least_squares_high""least_squares_high" oder 'least_squares_very_high'"least_squares_very_high""least_squares_very_high""least_squares_very_high""least_squares_very_high" (siehe oben) wählt (im Vergleich zu 'none'"none""none""none""none" oder 'interpolation'"interpolation""interpolation""interpolation""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 SubPixelSubPixelSubPixelsubPixelsub_pixel die Subpixel-Extraktion genauso oft angegeben werden, wie die Anzahl von Elementen in ModelIDsModelIDsModelIDsmodelIDsmodel_ids. 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 ModelIDsModelIDsModelIDsmodelIDsmodel_ids angegeben sind und für das erste Modell die Subpixel-Extraktion 'interpolation'"interpolation""interpolation""interpolation""interpolation" gewählt werden soll sowie keine Objektdeformation erlaubt ist und für das zweite Modell die Subpixel-Extraktion 'least_squares'"least_squares""least_squares""least_squares""least_squares" gewünscht ist sowie eine maximale Objektdeformation von 3 Pixeln erlaubt ist, dann kann für den Parameter SubPixelSubPixelSubPixelsubPixelsub_pixel das Tupel ['interpolation', 'least_squares', 'max_deformation 3']["interpolation", "least_squares", "max_deformation 3"]["interpolation", "least_squares", "max_deformation 3"]["interpolation", "least_squares", "max_deformation 3"]["interpolation", "least_squares", "max_deformation 3"] übergeben werden. Alternativ kann auch das äquivalente Tupel ['interpolation', 'max_deformation 0', 'least_squares', 'max_deformation 3']["interpolation", "max_deformation 0", "least_squares", "max_deformation 3"]["interpolation", "max_deformation 0", "least_squares", "max_deformation 3"]["interpolation", "max_deformation 0", "least_squares", "max_deformation 3"]["interpolation", "max_deformation 0", "least_squares", "max_deformation 3"] übergeben werden.

NumLevelsNumLevelsNumLevelsnumLevelsnum_levels:

Mit NumLevelsNumLevelsNumLevelsnumLevelsnum_levels 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_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model angegebenen Bereich beschnitten. Falls NumLevelsNumLevelsNumLevelsnumLevelsnum_levels als 0 angegeben wird, wird die mit create_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model angegebene Anzahl verwendet.

In manchen Fällen kann es sein, dass die Anzahl der Pyramidenebenen, die beispielsweise automatisch mit create_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_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 MinScoreMinScoreMinScoreminScoremin_score auf einen sehr geringen Wert zu setzen, um alle Matches zu finden, kann der Wert von NumLevelsNumLevelsNumLevelsnumLevelsnum_levels mit get_shape_model_paramsget_shape_model_paramsGetShapeModelParamsGetShapeModelParamsget_shape_model_params ermittelt werden und dann ein etwas geringerer Wert in find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models genutzt werden. Diese Herangehensweise führt oft zu besseren Ergebnissen hinsichtlich Geschwindigkeit und Robustheit.

Optional kann NumLevelsNumLevelsNumLevelsnumLevelsnum_levels 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'"least_squares""least_squares""least_squares""least_squares" für SubPixelSubPixelSubPixelsubPixelsub_pixel 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 NumLevelsNumLevelsNumLevelsnumLevelsnum_levels zweimal die Anzahl von Elementen in ModelIDsModelIDsModelIDsmodelIDsmodel_ids angegeben werden. Dabei sind die Anzahl der Pyramidenebenen und der untersten Pyramidenebenen verschränkt anzugeben. Falls z.B. zwei Modelle in ModelIDsModelIDsModelIDsmodelIDsmodel_ids 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 NumLevelsNumLevelsNumLevelsnumLevelsnum_levels = [5,2,4,1] zu wählen. Falls genau zwei Modelle in ModelIDsModelIDsModelIDsmodelIDsmodel_ids 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 NumLevelsNumLevelsNumLevelsnumLevelsnum_levels 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 NumLevelsNumLevelsNumLevelsnumLevelsnum_levels negativ angegeben werden. Wird z.B. NumLevelsNumLevelsNumLevelsnumLevelsnum_levels = [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.

Wenn ein Modell mit adapt_shape_model_high_noiseadapt_shape_model_high_noiseAdaptShapeModelHighNoiseAdaptShapeModelHighNoiseadapt_shape_model_high_noise angepasst wurde wird die geschätzte untere Pyramidenstufe per Standardeinstellung verwendet. Der Benutzer kann den geschätzten Wert dennoch überschreiben, indem er jeweils zwei Werte an NumLevelsNumLevelsNumLevelsnumLevelsnum_levels übergibt und damit explizit die untere Pyramidenstufe setzt.

GreedinessGreedinessGreedinessgreedinessgreediness:

Der Parameter GreedinessGreedinessGreedinessgreedinessgreediness bestimmt, wie „gierig“ die Suche durchgeführt werden soll. Für GreedinessGreedinessGreedinessgreedinessgreediness=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 GreedinessGreedinessGreedinessgreedinessgreediness=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 GreedinessGreedinessGreedinessgreedinessgreediness=1 wird die maximale Suchgeschwindigkeit erreicht. In den allermeisten Fällen wird das Formmodell für GreedinessGreedinessGreedinessgreedinessgreediness=0.9 immer sicher gefunden.

Ausgabeparameter im Detail

RowRowRowrowrow, ColumnColumnColumncolumncolumn, AngleAngleAngleangleangle, ScaleRScaleRScaleRscaleRscale_r, ScaleCScaleCScaleCscaleCscale_c:

Die Position, Rotation und Skalierung in Zeilen- und Spaltenrichtung der gefundenen Instanzen des Modells werden in RowRowRowrowrow, ColumnColumnColumncolumncolumn, AngleAngleAngleangleangle, ScaleRScaleRScaleRscaleRscale_r und ScaleCScaleCScaleCscaleCscale_c zurückgeliefert. Die Koordinaten RowRowRowrowrow und ColumnColumnColumncolumncolumn 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_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model verwendet wurde. Ein anderer Ursprung kann mit set_shape_model_originset_shape_model_originSetShapeModelOriginSetShapeModelOriginset_shape_model_origin festgelegt werden.

Beachten Sie, dass die Koordinaten RowRowRowrowrow und ColumnColumnColumncolumncolumn 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_aniso_shape_modelfind_aniso_shape_modelFindAnisoShapeModelFindAnisoShapeModelfind_aniso_shape_model angegebene Beispiel zeigt, wie diese Matrix erzeugt wird und wie man damit das Modell an der gefundenen Position im Suchbild visualisiert.

Beachten Sie, dass die Visualisierung aber auch mit der Prozedur dev_display_shape_matching_results realisiert werden kann.

ScoreScoreScorescorescore:

In ScoreScoreScorescorescore 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_clutterset_shape_model_clutterSetShapeModelClutterSetShapeModelClutterset_shape_model_clutter um Störparameter erweitert wurde, gibt ScoreScoreScorescorescore, 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 ScoreScoreScorescorescore = [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.

ModelModelModelmodelmodel:

Der gefundene Modelltyp wird in ModelModelModelmodelmodel zurückgeliefert. Die Elemente von ModelModelModelmodelmodel sind ein Index in das Tupel ModelIDsModelIDsModelIDsmodelIDsmodel_ids, d.h. sie können Werte von 0 bis |ModelIDsModelIDsModelIDsmodelIDsmodel_ids|-1 enthalten. Ein Wert von 0 in einem Element von ModelModelModelmodelmodel entspricht also einer Instanz des ersten in ModelIDsModelIDsModelIDsmodelIDsmodel_ids übergebenen Modells.

Setzen eines Timeout

Mittels des Operators set_shape_model_paramset_shape_model_paramSetShapeModelParamSetShapeModelParamset_shape_model_param können Sie einen 'timeout'"timeout""timeout""timeout""timeout" für find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models angeben. Falls die durch ModelIDsModelIDsModelIDsmodelIDsmodel_ids referenzierten Modelle unterschiedliche Werte für 'timeout'"timeout""timeout""timeout""timeout" besitzen, wählt find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models den niedrigsten aus. Wenn find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models diesen 'timeout'"timeout""timeout""timeout""timeout" erreicht endet er ohne Ergebnis und gibt den Fehlercode 9400 (H_ERR_TIMEOUT) zurück. Abhängig von der Größe der Skalierungsintervalle, die durch ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin, ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax, ScaleCMinScaleCMinScaleCMinscaleCMinscale_cmin und ScaleCMaxScaleCMaxScaleCMaxscaleCMaxscale_cmax festgelegt werden, benötigt find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models 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_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models den in 'timeout'"timeout""timeout""timeout""timeout" angegebenen Wert um diese Zeitspanne.

MinContrast bei mehreren Modellen

Wenn über den Parameter ModelIDsModelIDsModelIDsmodelIDsmodel_ids mehrere Modelle übergeben werden, sollten diese mit dem gleichen Wert für MinContrastMinContrastMinContrastminContrastmin_contrast erzeugt worden sein. Falls sie mit unterschiedlichen Werten für MinContrastMinContrastMinContrastminContrastmin_contrast erzeugt worden sind, wird in find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_shape_models der kleinste dieser Werte verwendet.

Darstellung der Resultate

Die Verwendung der Prozedur dev_display_shape_matching_results wird zur Darstellung der Resultate formbasierten Matchings stark empfohlen.

Weitere Informationen

Ein Überblick zu den verschiedenen in HALCON verwendeten 2D Koordinatensystemen ist in der Einleitung zum Kapitel Transformationen / 2D-Transformationen gegeben.

Ausführungsinformationen

Dieser Operator unterstützt Cancel-Timeouts und Interrupts.

Parameter

ImageImageImageimageimage (input_object)  (multichannel-)image(-array) objectHImageHObjectHObjectHobject (byte / uint2)

Eingabebild, in dem die Modelle gefunden werden sollen.

ModelIDsModelIDsModelIDsmodelIDsmodel_ids (input_control)  shape_model(-array) HShapeModel, HTupleMaybeSequence[HHandle]HTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle der Modelle.

AngleStartAngleStartAngleStartangleStartangle_start (input_control)  angle.rad(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Kleinste auftretende Rotation der Modelle.

Default: -0.39

Wertevorschläge: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0

AngleExtentAngleExtentAngleExtentangleExtentangle_extent (input_control)  angle.rad(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Ausdehnung des Winkelbereichs.

Default: 0.79

Wertevorschläge: 6.29, 3.14, 1.57, 0.79, 0.39, 0.0

Restriktion: AngleExtent >= 0

ScaleRMinScaleRMinScaleRMinscaleRMinscale_rmin (input_control)  number(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Kleinste auftretende Skalierung der Modelle in Zeilenrichtung.

Default: 0.9

Wertevorschläge: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0

Restriktion: ScaleRMin > 0

ScaleRMaxScaleRMaxScaleRMaxscaleRMaxscale_rmax (input_control)  number(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Größte auftretende Skalierung der Modelle in Zeilenrichtung.

Default: 1.1

Wertevorschläge: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5

Restriktion: ScaleRMax >= ScaleRMin

ScaleCMinScaleCMinScaleCMinscaleCMinscale_cmin (input_control)  number(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Kleinste auftretende Skalierung der Modelle in Spaltenrichtung.

Default: 0.9

Wertevorschläge: 0.5, 0.6, 0.7, 0.8, 0.9, 1.0

Restriktion: ScaleCMin > 0

ScaleCMaxScaleCMaxScaleCMaxscaleCMaxscale_cmax (input_control)  number(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Größte auftretende Skalierung der Modelle in Spaltenrichtung.

Default: 1.1

Wertevorschläge: 1.0, 1.1, 1.2, 1.3, 1.4, 1.5

Restriktion: ScaleCMax >= ScaleCMin

MinScoreMinScoreMinScoreminScoremin_score (input_control)  real(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Minimale Bewertung der zu findenden Instanzen der Modelle.

Default: 0.5

Wertevorschläge: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0

Wertebereich: 0 ≤ MinScore MinScore MinScore minScore min_score ≤ 1

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.05

NumMatchesNumMatchesNumMatchesnumMatchesnum_matches (input_control)  integer(-array) HTupleMaybeSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Anzahl der zu findenden Instanzen der Modelle (oder 0 für alle Treffer).

Default: 1

Wertevorschläge: 0, 1, 2, 3, 4, 5, 10, 20

MaxOverlapMaxOverlapMaxOverlapmaxOverlapmax_overlap (input_control)  real(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

Maximale Überlappung der zu findenden Instanzen der Modelle.

Default: 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

Wertebereich: 0 ≤ MaxOverlap MaxOverlap MaxOverlap maxOverlap max_overlap ≤ 1

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.05

SubPixelSubPixelSubPixelsubPixelsub_pixel (input_control)  string(-array) HTupleMaybeSequence[str]HTupleHtuple (string) (string) (HString) (char*)

Subpixelgenauigkeit falls ungleich 'none'"none""none""none""none".

Default: 'least_squares' "least_squares" "least_squares" "least_squares" "least_squares"

Wertevorschläge: 'none'"none""none""none""none", 'interpolation'"interpolation""interpolation""interpolation""interpolation", 'least_squares'"least_squares""least_squares""least_squares""least_squares", 'least_squares_high'"least_squares_high""least_squares_high""least_squares_high""least_squares_high", 'least_squares_very_high'"least_squares_very_high""least_squares_very_high""least_squares_very_high""least_squares_very_high", 'max_deformation 1'"max_deformation 1""max_deformation 1""max_deformation 1""max_deformation 1", 'max_deformation 2'"max_deformation 2""max_deformation 2""max_deformation 2""max_deformation 2", 'max_deformation 3'"max_deformation 3""max_deformation 3""max_deformation 3""max_deformation 3", 'max_deformation 4'"max_deformation 4""max_deformation 4""max_deformation 4""max_deformation 4", 'max_deformation 5'"max_deformation 5""max_deformation 5""max_deformation 5""max_deformation 5", 'max_deformation 6'"max_deformation 6""max_deformation 6""max_deformation 6""max_deformation 6"

NumLevelsNumLevelsNumLevelsnumLevelsnum_levels (input_control)  integer(-array) HTupleMaybeSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Anzahl der verwendeten Pyramidenebenen (und unterste zu verwendende Pyramidenebene falls |NumLevelsNumLevelsNumLevelsnumLevelsnum_levels| = 2).

Default: 0

Werteliste: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

GreedinessGreedinessGreedinessgreedinessgreediness (input_control)  real(-array) HTupleMaybeSequence[float]HTupleHtuple (real) (double) (double) (double)

„Gierigkeit“ der Suchheuristik (0: sicher aber langsam; 1: schnell aber Matches können „übersehen“ werden).

Default: 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

Wertebereich: 0 ≤ Greediness Greediness Greediness greediness greediness ≤ 1

Minimale Schrittweite: 0.01

Empfohlene Schrittweite: 0.05

RowRowRowrowrow (output_control)  point.y-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Zeilenkoordinate der gefundenen Instanzen der Modelle.

ColumnColumnColumncolumncolumn (output_control)  point.x-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Spaltenkoordinate der gefundenen Instanzen der Modelle.

AngleAngleAngleangleangle (output_control)  angle.rad-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Rotationswinkel der gefundenen Instanzen der Modelle.

ScaleRScaleRScaleRscaleRscale_r (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Skalierung der gefundenen Instanzen der Modelle in Zeilenrichtung.

ScaleCScaleCScaleCscaleCscale_c (output_control)  number-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Skalierung der gefundenen Instanzen der Modelle in Spaltenrichtung.

ScoreScoreScorescorescore (output_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Bewertung der gefundenen Instanzen der Modelle.

ModelModelModelmodelmodel (output_control)  integer-array HTupleSequence[int]HTupleHtuple (integer) (int / long) (Hlong) (Hlong)

Index der gefundenen Instanzen der Modelle.

Beispiel (HDevelop)

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_aniso_shape_model (ImageReduced1,'auto', -0.39, 0.79, 'auto', 0.9, \
                          1.1, 'auto', 0.9, 1.1, 'auto', 'auto', \
                          'use_polarity', 'auto', 'auto', ModelID1)
create_aniso_shape_model (ImageReduced2,'auto', -0.39, 0.79, 'auto', 0.9, \
                          1.1, 'auto', 0.9, 1.1, 'auto', 'auto', \
                          'use_polarity', 'auto', 'auto', ModelID2)
ModelIDs:=[ModelID1, ModelID2]
find_aniso_shape_models(Image, ModelIDs, -0.39, 0.79, 0.9, 1.1, 0.9, 1.1, \
                        0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, \
                        Angle, ScaleR, ScaleC, Score, Model)
* Display results
dev_display_shape_matching_results (ModelIDs, 'red', Row, Column, Angle, \
                                    ScaleR, ScaleC, Model)

Ergebnis

Sind die Parameterwerte korrekt, dann liefert find_aniso_shape_modelsfind_aniso_shape_modelsFindAnisoShapeModelsFindAnisoShapeModelsfind_aniso_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>)set_system("no_object_result",<Result>)SetSystem("no_object_result",<Result>)SetSystem("no_object_result",<Result>)set_system("no_object_result",<Result>) festlegen. Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

add_channelsadd_channelsAddChannelsAddChannelsadd_channels, create_aniso_shape_modelcreate_aniso_shape_modelCreateAnisoShapeModelCreateAnisoShapeModelcreate_aniso_shape_model, read_shape_modelread_shape_modelReadShapeModelReadShapeModelread_shape_model, set_shape_model_originset_shape_model_originSetShapeModelOriginSetShapeModelOriginset_shape_model_origin, set_shape_model_clutterset_shape_model_clutterSetShapeModelClutterSetShapeModelClutterset_shape_model_clutter

Nachfolger

clear_shape_modelclear_shape_modelClearShapeModelClearShapeModelclear_shape_model

Alternativen

find_generic_shape_modelfind_generic_shape_modelFindGenericShapeModelFindGenericShapeModelfind_generic_shape_model

Siehe auch

set_systemset_systemSetSystemSetSystemset_system, get_systemget_systemGetSystemGetSystemget_system, set_shape_model_paramset_shape_model_paramSetShapeModelParamSetShapeModelParamset_shape_model_param

Modul

Matching