find_surface_model — Suche der besten Matches eines Oberflächenmodells in einer Szene.
find_surface_model( : : SurfaceModelID, ObjectModel3D, RelSamplingDistance, KeyPointFraction, MinScore, ReturnResultHandle, GenParamName, GenParamValue : Pose, Score, SurfaceMatchingResultID)
Der Operator find_surface_model sucht die besten Matches des
Oberflächenmodells SurfaceModelID in der 3D-Szene
ObjectModel3D und gibt ihre Posen in Pose zurück.
Der Matching-Vorgang ist in drei Schritte unterteilt:
Näherungsweises Matching
Grobe Pose-Verfeinerung
Exakte Pose-Verfeinerung
Die einzelnen Schritte und ihre entsprechenden generischen Parameter werden in einem separaten Abschnitt weiter unten genauer erläutert. Die weiteren Abschnitte beschreiben die Parameter und die zu beachtenden Punkte.
Die HDevelop-Prozedur debug_find_surface_model kann verwendet werden, um den Matchingprozess und die eingestellten Parameter zu visualisieren und zu überprüfen.
Zum Auffinden des Oberflächenmodells werden Punkte und Normalen der 3D-Szene verwendet. Dafür soll die Szene eine der folgenden Optionen zur Verfügung stellen:
Punkte und Punktnormalen.
Punkte und ein 2D-Mapping, z.B. für 3D-Objektmodelle die mittels
xyz_to_object_model_3d erstellt wurden.
In diesem Fall werden die Normalen mit dem 2D-Mapping berechnet.
Nur Punkte. Die Normalen werden aufgrund der 3D Umgebung abgeschätzt. Es gilt zu beachten, dass diese Option nicht empfohlen wird, da sie generell zu längeren Verarbeitungszeiten führt und die berechneten Normalen üblicherweise weniger genau sind, was in ungenaueren Ergebnissen resultiert.
Wenn das Oberflächenmodell für kantenunterstütztes oberflächenbasiertes Matching vorbereitet wurde, ist lediglich die zweite Kombination möglich, d.h. die Szene muss ein 2D-Mapping beinhalten. Für solche Oberflächenmodelle ist es notwendig, dass die Normalen einwärts ausgerichtet sind.
Wird eine vermaschte Szene mit Dreiecken oder Polygonen übergeben, etwa ein
CAD-Modell, so werden diese ignoriert und nur die Punkte der Szene
verwendet. In der Regel sollte daher nicht in einer vermaschten Szene
gesucht werden. Stattdessen sollte eine solche Szene zuvor etwa mit
sample_object_model_3d in Punkte mit Normalen umgewandelt werden.
Werden verrauschte Daten verwendet, z.B. von Time-of-Flight-Kameras, sollte der generische Parameter 'scene_normal_computation' auf 'mls' gesetzt werden um robustere Ergebnisse zu erhalten (siehe unten).
SurfaceModelID ist das Handle des Oberflächenmodells.
Das Modell muss zuvor mittels create_surface_model oder
read_surface_model erstellt, bzw eingelesen worden sein.
Gewisse Oberflächenmodell-Parameter, welche das Auffinden beeinflussen,
können über den Operator set_surface_model_param gesetzt werden,
z.B. 'pose_restriction_max_angle_diff' zum Einschränken des
Rotationsbereichs.
ObjectModel3D ist das Handle des 3D-Objektmodells mit
der Szene in der die Matches gesucht werden.
Es wird angenommen, dass die Kamera entlang der z-Achse ausgerichtet ist.
Dies ist wichtig bei der Ausrichtung der Normalen der Szene, falls diese
neu berechnet werden (siehe unten).
Der Parameter RelSamplingDistance kontrolliert die Abtastdistanz
während des Schrittes Näherungsweises Matching und bei der
Berechnung des Score im Schritt Grobe Pose-Verfeinerung.
Sein Wert wird relativ zum Durchmesser des Oberflächenmodells angegeben.
Verkleinert man RelSamplingDistance, so werden mehr
Punkte der Szene abgetastet, was zu einem stabileren aber
langsameren Matching führt.
Erhöht man RelSamplingDistance, so werden weniger Punkte
abgetastet, was zu einem weniger stabilen aber schnelleren Matching
führt.
Eine Illustration zur RelSamplingDistance befindet sich
bei dem Operator create_surface_model.
Die abgetasteten Punkte können mit dem Operator
get_surface_matching_result abgerufen werden. Für ein
robustes Matching sollten mindestens 50-100 Punkte auf jeder
zu findenden Objektinstanz liegen.
Der Parameter KeyPointFraction kontrolliert wie viele der
abgetasteten Szenenpunkte als Schlüsselpunkte ausgewählt werden.
Wird dieser Wert etwa auf 0.1 gesetzt, so werden 10% der
abgetasteten Szenepunkte als Schlüsselpunkte verwendet.
Für robuste Ergebnisse ist es wichtig, dass auf jeder zu findenden
Objektinstanz mehrere Schlüsselpunkte liegen.
Erhöht man KeyPointFraction, so werden mehr Punkte als
Schlüsselpunkte ausgewählt, was zu einem robusteren aber langsameren
Matching führt. Verringert man den Wert so werden weniger
Schlüsselpunkte ausgewählt, was zu einem weniger robusten aber
schnelleren Matching führt.
Für eine visuelle Überprüfung können die ausgewählten Schlüsselpunkte mit
dem Operator get_surface_matching_result abgerufen werden.
Der Parameter MinScore kann verwendet werden um die Ergebnisse
zu filtern. Nur Instanzen deren Bewertung größer als MinScore ist
werden zurückgegeben.
Wird MinScore auf 0 gesetzt, so werden alle gefundenen
Instanzen zurückgegeben.
Für das kantenunterstützte oberflächenbasierte Matching
(siehe create_surface_model) werden vier Einzelbewertungen
ermittelt (siehe weiter unten für ihre Beschreibung).
Entsprechend können die Resultate mit jeder dieser Bewertungen gefiltert
werden, indem MinScore ein Tupel mit bis zu vier Schwellwerten
übergeben wird.
Diese Schwellwerte sind in der gleichen Reihenfolge wie die Bewertungen
geordnet (siehe weiter unten) und fehlende Einträge werden als 0
betrachtet, was bedeutet, dass keine Ergebnisse aufgrund dieser Bewertung
herausgefiltert wird.
Zum Finden geeigneter Schwellwerte können die Einzelbewertungen gefundener
Posen mit dem Operator get_surface_matching_result erhalten
werden.
Je nach Einstellung des Verfahrens sind möglicherweise nicht alle
Bewertungen verfügbar. Für nicht verfügbare Bewertungen wird der in
MinScore eingestellte Schwellwert ignoriert.
Die vier Einzelbewertungen, deren Schwellwerte in dieser Reihenfolge in
MinScore übergeben werden müssen, sind:
Die Gesamtbewertung wie in Score und durch
'score' in get_surface_matching_result zurückgegeben.
Der Oberflächenanteil der Ergebnisbewertung, d.h. welcher Anteil der
Objektoberfläche in der Szene gefunden wurde, zurückgegeben durch
'score_surface' in get_surface_matching_result.
Der Anteil der 3D-Kanten der Ergebnisbewertung, d.h. wie gut die
3D-Kanten des Objekts mit den in der Szene gefundenen 3D-Kanten
übereinstimmen, zurückgegeben durch
'score_3d_edges' in get_surface_matching_result.
Der Anteil der 2D-Kanten der Ergebnisbewertung, d.h.
wie gut die projizierten Objektsilhouetten mit den in
den Bildern gefundenen Kanten übereinstimmen (nur für die Operatoren
find_surface_model_image und
refine_surface_model_pose_image verfügbar), zurückgegeben
durch 'score_2d_edges' in
get_surface_matching_result.
Der Parameter ReturnResultHandle bestimmt, ob ein Handle für
das Ergebnis des oberflächenbasierten Matchings zurückgegeben werden soll
oder nicht. Falls der Parameter den Wert 'true' erhält, wird das
Handle unter dem Parameter SurfaceMatchingResultID zurückgegeben.
Weitere Details des Matchingverfahrens können dann mittels
get_surface_matching_result abgerufen werden.
Die Parameter GenParamName und GenParamValue werden zum
Setzen generischer Parameter verwendet. Beide erhalten ein Tupel gleicher
Länge, wobei das Tupel von GenParamName die Namen der zu setzenden
Parameter enthält und das Tupel GenParamValue die entsprechenden
Werte.
Die möglichen Parameternamen und Parameterwerte sind im Abschnitt
Die drei Schritte des Matching-Vorgangs beschrieben.
Der Ausgabeparameter Pose gibt die Pose der gefundenen Instanzen
zurück. Er beschreibt die Pose des Oberflächenmodells im
Szenenkoordinatensystem (scs) und bezieht sich auf das
Modellkoordinatensystem des 3D-Objektmodells (mcs), welches für
create_surface_model verwendet wurde. Somit ist die Pose in der Form
(siehe auch
Transformationen / Posen und
„Solution Guide III-C - 3D Vision“).
Der Ausgabeparameter Score gibt für jede übereinstimmende Instanz
eine Bewertung zurück. Der Wert und die Interpretation der Bewertung
hängen von den folgenden Fällen ab:
Mit Pose-Verfeinerung
Falls eine Pose-Verfeinerung durchgeführt wird, stehen verschiedene
Bewertungstypen zur Verfügung. Diese sind im Abschnitt
Grobe Pose-Verfeinerung gelistet und näher erklärt.
Ein spezifischer Bewertungstyp kann über GenParamName
'score_type' gesetzt werden.
Als Standardwert wird 'model_point_fraction' verwendet.
Grob gesagt entspricht diese konkrete Bewertung in etwa dem relativen
Anteil an Modellfläche, der in der Szene sichtbar ist.
Eine detaillierte Beschreibung wird weiter unten gegeben.
Ohne Pose-Verfeinerung
Falls von den drei Schritten nur der erste,
Näherungsweises Matching, ausgeführt wird, kann der Bewertungstyp
nicht ausgewählt werden.
Der mögliche Wert und die Interpretation der Bewertung hängen nur von
einer möglichen Kantenunterstützung ab:
Ohne Kantenunterstützung
Die Bewertung ist die ungefähre Anzahl an Szenenpunkten der abgetasteten Szene die auf dem gefundenen Objekt liegen.
Score >= 0
Mit Kantenunterstützung
Die Bewertung ist die ungefähre Anzahl an Szenenpunkten der abgetasteten Szene die auf dem gefundenen Objekt liegen, multipliziert mit der Anzahl an Punkten der abgetasteten 3D-Kanten die mit Kanten des Modells ausgerichtet sind.
Score >= 0
Der Ausgabeparameter SurfaceMatchingResultID gibt ein
Ergebnishandle für das Oberflächenmatching zurück.
Mittels dieses Handles können weitere Details des Matchingverfahrens
unter Verwendung des Operators get_surface_matching_result
abgerufen werden.
Das Handle wird nur zurückgegeben, wenn ReturnResultHandle auf
'true' gesetzt ist.
Der Matching-Vorgang ist in drei Schritte unterteilt:
Die ungefähren Posen der Instanzen des Oberflächenmodells in der Szene werden gesucht.
Die 3D-Szene ObjectModel3D wird zunächst gleichmäßig
abgetastet.
Die Abtastdistanz wird durch den Parameter RelSamplingDistance
kontrolliert.
Aus den abgetasteten Szenepunkten werden eine Reihe von
Schlüsselpunkten ausgewählt. Die Anzahl der Schlüsselpunkte wird
mit dem Parameter KeyPointFraction gesteuert.
Für jeden Schlüsselpunkt wird die optimale Pose des Oberflächenmodells
unter der Annahme, dass der Schlüsselpunkt auf einer Objektinstanz
liegt, bestimmt.
Dazu werden Punktpaare aus dem Schlüsselpunkt und allen anderen
Szenepunkten gebildet. Für jedes dieser Punktpaare werden die Paare
auf der Oberfläche des Oberflächenmodells gesucht, die einen ähnlichen
Abstand und eine ähnliche Orientierung besitzen. Das Ähnlichkeitsmaß
wird dabei über die Parameter 'feat_step_size_rel' und
'feat_angle_resolution' im Operator
create_surface_model definiert.
Die Pose für welche die meisten Punkte aus der abgetasteten Szene auf
dem Modell liegen wird als optimale Pose für den Schlüsselpunkt
definiert. Die Anzahl abgetasteter Szenepunkten auf dem Objekt
ist die Bewertung der Pose.
Wenn das Oberflächenmodell für kantenunterstütztes
oberflächenbasiertes Matching vorbereitet wurde, werden -- ähnlich zum
Operator edges_object_model_3d -- 3D-Kanten aus der Szene
extrahiert und abgetastet.
Zusätzlich zu den Oberflächenpunkten werden anschließened Punktpaare
aus dem Schlüsselpunkt und den abgetasteten 3D-Kantenpunkten gebildet
und ähnliche Paare im Modell gesucht.
Die Posebewertung wird anschließend durch Multiplikation der Anzahl
an übereinstimmenden Kantenpunkten mit der Anzahl an übereinstimmenden
Oberflächenpunkten gebildet.
Aus den Posen aller Schlüsselpunkte werden diejenigen mit der
höchsten Bewertung ausgewählt und als näherungsweise Posen
weiterverwendet.
Die maximale Anzahl an ausgewählten Posen wird mit dem generischen
Parameter 'num_matches' gesteuert.
Ist die Pose-Verfeinerung deaktiviert, so wird die oben beschriebene
Bewertung jeder Pose in Score zurückgegeben.
Der Wert der Bewertungen hängt dabei von der Größe der sichtbaren
Oberfläche der Instanz und von der Abtastdistanz der Szene ab.
Nur Posen deren Bewertung MinScore überschreitet
werden zurückgegeben.
Um einen guten Wert für MinScore zu erhalten wird empfohlen
das Matching auf mehreren Szenen zu testen.
Es ist zu beachten, dass in diesem Schritt näherungsweise Posen ermittelt werden. Die Ungenauigkeit der Posen hängt von den Abtastabständen von Szene und Modell ab, und ist normalerweise weniger als 5% des Objektdurchmessers.
Die folgenden generischen Parameter steuern das näherungsweise
Matching, und werden mit GenParamName und
GenParamValue gesetzt:
Setzt die maximale Anzahl an gefundenen Instanzen die zurückgegeben werden.
Vorgeschlagene Werte: 1, 2, 5
Standardwert: 1
Assertion: 'num_matches' > 0
Aus Laufzeitgründen kann die maximale Überlappung zweier
Matches nicht in 3D definiert werden. Stattdessen kann mit
'max_overlap_dist_rel' der minimale Abstand zwischen den
Mittelpunkten der kleinsten achsparallelen, die Matches
umschließenden Quader angegeben werden. Der Wert wird relativ
zum Objektdurchmesser angegeben. Wenn ein Objekt mit einem
hohen Score gefunden wurde, werden alle anderen
Matches unterdrückt, für die der Mittelpunkt ihres kleinsten
umschließenden Quaders zu nahe am Mittelpunkt des kleinsten
umschließenden Quaders des ersten Matches liegt. Wenn sich
die gefundenen Matches nicht überlappen sollen, muss der Wert
für 'max_overlap_dist_rel' auf 1.0 gesetzt werden.
Nur einer der beiden Parameter 'max_overlap_dist_rel'
und 'max_overlap_dist_abs' sollte gesetzt werden.
Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert
verwendet.
Vorgeschlagene Werte: 0.1, 0.5, 1
Standardwert: 0.5
Assertion: 'max_overlap_dist_rel' >= 0
Dieser Parameter hat den gleichen Effekt wie der Parameter 'max_overlap_dist_rel'. Allerdings wird der Wert im Gegensatz zum Parameter 'max_overlap_dist_rel' bei 'max_overlap_dist_abs' als absoluter Wert angegeben. Eine Beschreibung des Effekts dieses Parameters ist weiter oben bei dem Parameter 'max_overlap_dist_rel' zu finden. Nur einer der beiden Parameter 'max_overlap_dist_rel' und 'max_overlap_dist_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Vorgeschlagene Werte: 1, 2, 3
Assertion: 'max_overlap_dist_abs' >= 0
Dieser Parameter kontrolliert die Normalenberechnung der
abgetasteten 3D-Szene.
Im Standard-Modus 'fast' werden die Normalen anhand einer
relativ kleinen Nachbarschaft berechnet. Falls die 3D-Szene bereits
Normalen enthält, werden diese benutzt.
Im Modus 'mls' wird eine größere Nachbarschaft
einbezogen und das komplexere, aber genauere
'mls'-Verfahren für die Normalenberechnung verwendet.
In diesem Modus werden die Normalen der abgetasteten Szene in jedem
Fall neu berechnet, auch wenn sie bereits Normalen enthält.
Eine genauere Beschreibung des 'mls'-Verfahrens findet sich
beim Operator surface_normals_object_model_3d.
Der 'mls'-Modus ist vor allem für Daten mit hohem Rauschen
gedacht, etwa für Bilder aus Time-of-Flight-Kameras.
Mögliche Werte: 'fast', 'mls'
Standardwert: 'fast'
Erlaubt das manuelle Setzen der 3D-Kanten der Szene für das
kantenunterstützte oberflächenbasierte Matching, wenn
das Oberflächenmodell für kantenunterstütztes oberflächenbasiertes
Matching vorbereitet wurde.
Der Wert dieses Parameters muss ein 3D-Objektmodell-Handle sein.
Die Kanten sind üblicherweise das Ergebnis des Operators
edges_object_model_3d, können aber weiter gefiltert
werden um Ausreißer zu entfernen.
Wird dieser Parameter nicht angegeben, dann extrahiert
find_surface_model die Kanten intern, analog zum
Operator edges_object_model_3d.
Setzt den Amplitudenschwellwert bei der automatischen Extraktion
von 3D-Kanten für das kantenunterstützte oberflächenbasierte
Matching, d.h. wenn
das Oberflächenmodell mit aktiviertem 'train_3d_edges'
erzeugt wurde und keine Kanten mittels '3d_edges'
manuell übergeben wurden.
Der Schwellwert wird relativ zum Durchmesser des Modells
angegeben und verhält sich analog zum Parameter
'MinAmplitude' des Operators
edges_object_model_3d.
Vorgeschlagene Werte: 0.05, 0.1, 0.5
Standardwert: 0.05
Assertion: '3d_edge_min_amplitude_rel' >= 0
Analog zu '3d_edge_min_amplitude_rel', allerdings wird der Schwellwert nicht relativ zum Modelldurchmesser sondern als absoluter Wert angegeben.
Assertion: '3d_edge_min_amplitude_abs' >= 0
Dieser Parameter gibt die 3D-Position des Blickpunktes an, von
dem aus die 3D-Punkte in ObjectModel3D gesehen werden.
Der Blickpunkt wird verwendet, um die Blickrichtung und die
Kantenrichtungen zu berechnen, sofern das Oberflächenmodell mit
aktiviertem 'train_3d_edges' erstellt wurde.
Definiert ist der Blickpunkt im gleichen Koordinatensystem wie
ObjectModel3D.
Die 3D-Koordinaten des Bilckpunktes (x, y und z) werden als Strings,
getrennt durch Leerzeichen, übergeben.
Werden Kanten manuell mit dem generischen Parameter
'3d_edges' übergeben ist zu beachten, dass
'viewpoint' in diesem Fall ignoriert wird.
Andernfalls verhält sich 'viewpoint' analog zum
entsprechenden generischen Parameter des Operators
edges_object_model_3d.
Um das Ergebnis des kantenunterstützten oberflächenbasierten Matchings zu verbessern, sollte der Blickpunkt in etwa der Sensorposition bei der Aufnahme der 3D-Szene entsprechen.
Mit der Prozedur debug_find_surface_model kann die Lage
des Blickpunktes visualisiert und überprüft werden.
Standardwert: '0 0 0'
Dieser Parameter gibt die maximale Größe einer Lücke in Pixeln in einer 3D-Szene an. Dies gilt nur sofern das Oberflächenmodell mit aktiviertem 'train_3d_edges' erstellt wurde. Für Lücken, die einen größeren Durchmesser haben als 'max_gap', werden Kanten an den Rändern der Lücke erzeugt, kleinere Lücken werden geschlossen. Dadurch können Kanten unterdrückt werden, welche an Lücken in den 3D-Daten entstehen, die der Sensor nicht rekonstruieren konnte. Für besonders hochauflösende Sensoren sollte der Wert erhöht werden.
Werden Kanten manuell mit dem generischen Parameter
'3d_edges' übergeben, so ist zu beachten, dass
'max_gap' in diesem Fall ignoriert wird.
Andernfalls verhält sich 'max_gap' analog zum
entsprechenden generischen Parameter des Operators
edges_object_model_3d.
Inwiefern sich 'max_gap' auf das Modell auswirkt kann mit
Hilfe der Prozedur debug_find_surface_model
visualisiert werden.
Standardwert: 30
Schaltet die kantenunterstützung ein oder aus. Er kann verwendet werden, um ein Matching ohne Kantenunterstützung durchzuführen, obwohl das Modell mit kantenunterstützung erstellt wurde. Wenn das Oberflächenmodell nicht mit aktiviertem 'train_3d_edges' erstellt wurde, hat dieser Parameter keinen Einfluss.
Mögliche Werte: 'true', 'false'
Standardwert: 'true'
In diesem zweiten Schritt werden die im vorherigen Schritt gefundenen näherungsweisen Posen verfeinert. Dies erhöht die Genauigkeit der Posen sowie die Aussagekraft der Bewertung.
Die grobe Pose-Verfeinerung verwendet die abgetasteten Szenepunkte des näherungsweisen Matchings. Die Pose wird derart verbessert, dass die Abstände der abgetasteten Szenepunkte zur Ebene des nächsten gefundenen Modellpunktes minimiert werden. Die Ebene jedes Modellpunkts ist dabei die auf den Normalenvektor des Punktes senkrecht stehende Ebene.
Wenn das Oberflächenmodell für kantenunterstütztes oberflächenbasiertes Matching vorbereitet wurde, und dieses nicht über den Parameter 'use_3d_edges' deaktiviert wurde (s.o), werden bei der Pose-Verfeinerung auch die abgetasteten 3D-Kanten der Szene mit dem Modellkanten ausgerichtet.
Die grobe Pose-Verfeinerung ist standardmäßig aktiviert und kann durch Setzen des generischen Parameters 'sparse_pose_refinement' auf 'false' deaktiviert werden. Die Anzahl der verfeinerten Posen ist proportional zur Anzahl der im vorherigen Schritt ausgewählten Schlüsselpunkte. Für große Szenen, die viele Stördaten (Szenenteile die auf keiner Objektinstanz liegen) enthalten, kann es sinnvoll sein, die grobe Pose-Verfeinerung zu deaktivieren.
Die Bewertung jeder Pose wird nach der Verfeinerung neu berechnet.
Die folgenden generischen Parameter steuern die grobe
Pose-Verfeinerung und werden mit GenParamName und
GenParamValue gesetzt:
Aktiviert oder deaktiviert die grobe Pose-Verfeinerung.
Mögliche Werte: 'true', 'false'
Standardwert: 'true'
Setzt die Art der zurückgegebenen Bewertung.
Verschiedene Bewertungen können nach der Pose-Verfeinerung berechnet und zurückgegeben werden. Dieser Parameter wird ignoriert, wenn sowohl die grobe als auch die exakte Pose-Verfeinerung deaktiviert ist.
Es ist zu beachten, dass für die Berechnung der Bewertung nach
der groben Pose-Verfeinerung die abgetasteten Szenepunkte
verwendet werden, während für die Berechnung nach der exakten
Pose-Verfeinerung alle Szenepunkte verwendet werden (siehe unten).
Die Bewertung nach der groben Pose-Verfeinerung hängt damit von
der Abtastdistanz RelSamplingDistance ab.
Die folgenden Bewertungsarten werden unterstützt:
Ohne Kantenunterstützung wird der Oberflächenanteil berechnet, d.h. der ungefähre Anteil der in der Szene sichtbaren Fläche des Objekts. Dies erfolgt durch Zählen der gefundenen Modellpunkte mit entsprechdem Szenenpunkt (wie bei 'num_model_points') und dividieren dieser Anzahl durch die Gesamtzahl abgetasteter Modellpunkte.
0 <= Score <= 1
Mit Kantenunterstützung ist die Bewertung das geometrische Mittel des Oberflächenanteils und des Kantenanteils. Der Kantenanteil ist die Anzahl an abgetasteten Kantenpunkten des Modells die mit Kanten der Szene ausgerichtet sind, geteilt durch die maximale Anzahl an Modellkantenpunkten, die von einem einzigen Blickpunkt aus sichtbar sein können. Wenn die 3D-Kanten aus mehreren Sichtrichtungen extrahiert wurden, kann dies zu einem Score größer 1 führen.
0 <= Score <= 1 (wenn die Szene von einem einzigen Blickpunkt aus gesehen wurde)
0 <= Score <= N (wenn die Gesamtszene aus Einzelszenen zusammengesetzt wurde, die von insgesamt N verschiedenen Blickpunkten gesehen wurde)
Die Anzahl der abgetasteten Modellpunkte, die in der Szene gefunden wurden. Ein Modellpunkt gilt als 'gefunden', wenn es einen Szenepunkt in seiner Nähe gibt. Der zurückgegebene Wert liegt zwischen Null und der Anzahl der abgetasteten Modellpunkte.
Die gewichtete Anzahl an abgetasteten Szenepunkten, die auf der
Oberfläche der gefundenen Objektinstanz liegen.
Jeder Szenenpunkt wird je nach Abstand zum gefundenen Modell
gewichtet.
Diese Bewertung ist genauer als die im näherungsweisen Matching
berechnete Bewertung.
Der Wert hängt von der Abtastdistanz
RelSamplingDistance ab und liegt zwischen Null und der
Anzahl der abgetasteten Szenepunkte.
Mögliche Werte: 'model_point_fraction', 'num_model_points', 'num_scene_points'
Standardwert: 'model_point_fraction'
Aktiviert oder deaktiviert die Verwendung von Szenennormalen für die Pose-Verfeinerung. Wenn dieser Parameter aktiviert wird und die Szene Normalenvektoren enthält, dann werden diese Normalenvektoren verwendet um die Genauigkeit der Pose-Verfeinerung zu steigern. Dazu wird der Einfluss derer Szenenpunkte verringert, deren Normalenvektor in eine andere Richtung als der entsprechende Objektnormalenvektor zeigt. Enthält die Szene keine Punktnormalen, so wird dieser Parameter ignoriert.
Mögliche Werte: 'true', 'false'
Standardwert: 'false'
Verfeinert die in den vorherigen Schritten gefundenen Posen. Dieser Schritt arbeitet ähnlich zur groben Pose-Verfeinerung und minimiert die Abstände zwischen den Szenepunkten und den Ebenen der nächstliegenden Modellpunkte. Anders als bei der groben Pose-Verfeinerung werden:
Nur die 'num_matches' besten Posen des vorherigen Schritts verfeinert.
Alle Punkte der in ObjectModel3D übergebenen Szene
für die Verfeinerung verwendet.
Alle extrahierten 3D-Kanten für die Verfeinerung verwendet und nicht nur die abgetasteten, sofern das Oberflächenmodell für kantenunterstütztes oberflächenbasiertes Matching vorbereitet und dieses nicht über den Parameter 'use_3d_edges' deaktiviert wurde (s.o),wurde.
Die Verwendung aller Szenepunkte erhöht die Genauigkeit der Verfeinerung, ist aber langsamer als eine Verfeinerung nur auf den abgetasteten Punkten. Die exakte Pose-Verfeinerung ist standardmäßig aktiviert, und kann mit dem generischen Parameter 'dense_pose_refinement' deaktiviert werden.
Nach der exakten Pose-Verfeinerung wird die Bewertung jeder Pose neu berechnet. Der maximale Abstand eines Punktes zum Modell, so dass er als 'auf dem Modell liegend' betrachtet wird, wird durch die Parameter 'pose_ref_scoring_dist_rel' oder 'pose_ref_scoring_dist_abs' gesteuert (siehe unten). Für das kantenunterstützte Matching gehen zusätzlich die Parameter 'pose_ref_scoring_dist_edges_rel' oder 'pose_ref_scoring_dist_edges_abs' ein.
Die nach der Posen-Verfeinerung erreichte Positionsgenauigkeit ist von verschiedenen Faktoren abhängig. Der interne Verfeinerungs-Algorithmus hat eine Genauigkeit von bis zu 1e-7 mal die Modellgröße (Durchmesser). Diese maximale Genauigkeit wird nur für bestmögliche Bedingungen erreicht. Die weiteren Faktoren für die finale Positionsgenauigkeit sind die Modellform, die Anzahl der Szenenpunkte, das Rauschen der Szenenpunkte, der sichtbare Bereich der Objektinstanz sowie die Position des Objekts.
Die folgenden generischen Parameter steuern die exakte
Pose-Verfeinerung und beeinflussen ihre Genauigkeit und
Geschwindigkeit. Die Werte werden über GenParamName und
GenParamValue gesetzt:
Aktiviert oder deaktiviert die exakte Pose-Verfeinerung.
Mögliche Werte: 'true', 'false'
Standardwert: 'true'
Anzahl der Iterationen der exakten Pose-Verfeinerung. Erhöht man diesen Wert, so wird die Verfeinerung genauer aber langsamer. Verringert man den Wert, so wird sie entsprechend ungenauer und schneller. Ab einer gewissen Anzahl an Iterationen konvergiert das Verfahren, so dass eine weitere Erhöhung keinen Effekt mehr auf die Genauigkeit hat.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Vorgeschlagene Werte: 1, 3, 5, 20
Standardwert: 5
Assertion: 'pose_ref_num_steps' > 0
Setzt, wieviele der Szenepunkte für die exakte Pose-Verfeinerung verwendet werden. Wird dieser Wert z.B. auf 5 gesetzt, so wird jeder fünfte Punkt der Szene verwendet. Dieser Parameter erlaubt einen einfachen Kompromiss zwischen Genauigkeit und Geschwindigkeit der Verfeinerung. Erhöht man den Wert, so werden weniger Punkte verwendet, was zu einer schnelleren aber weniger genauen Verfeinerung führt. Eine Verringerung des Wertes hat den umgekehrten Effekt.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Vorgeschlagene Werte: 1, 2, 5, 10
Standardwert: 2
Assertion: 'pose_ref_sub_sampling' > 0
Setzt den Abstandsschwellwert für die exakte Pose-Verfeinerung relativ zum Durchmesser des Modells. Nur Punkte deren Abstand zur Objektinstanz diesen Schwellwert unterschreiten gehen in die Pose-Verfeinerung ein. Punkte, die weiter von der Instanz entfernt sind, werden ignoriert. Nur einer der beiden Parameter 'pose_ref_dist_threshold_rel' und 'pose_ref_dist_threshold_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Vorgeschlagene Werte: 0.03, 0.05, 0.1, 0.2
Standardwert: 0.1
Assertion: 0 < 'pose_ref_dist_threshold_rel'
Setzt den Abstandsschwellwert für die exakte Pose-Verfeinerung als absoluten Wert. Für Details siehe den Parameter 'pose_ref_dist_threshold_rel'. Nur einer der beiden Parameter 'pose_ref_dist_threshold_rel' und 'pose_ref_dist_threshold_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Assertion: 0 < 'pose_ref_dist_threshold_abs'
Setzt den Abstandsschwellwert für die Bewertung der Pose relativ zum Durchmesser des Modells. Für Details siehe den Parameter 'pose_ref_scoring_dist_abs'. Nur einer der beiden Parameter 'pose_ref_scoring_dist_rel' und 'pose_ref_scoring_dist_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Vorgeschlagene Werte: 0.2, 0.01, 0.005, 0.0001
Standardwert: 0.005
Assertion: 0 < 'pose_ref_scoring_dist_rel'
Setzt den Abstandsschwellwert für die Bewertung der Pose als absoluten Wert. Nur Szenepunkte deren Abstand zur gefundenen Objektinstanz diesen Schwellwert unterschreiten gehen in die Berechnung der Bewertung ein und werden als 'auf dem Objekt liegend' klassifiziert. Alle anderen Szenepunkte werden ignoriert. Der Schwellwert sollte entsprechend dem zu erwartenden Rauschen und der Genauigkeit der Pose-Verfeinerung gesetzt werden. Nur einer der beiden Parameter 'pose_ref_scoring_dist_rel' und 'pose_ref_scoring_dist_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist.
Setzt die Art der zurückgegebenen Bewertung.
Verschiedene Bewertungen können nach der Pose-Verfeinerung berechnet und zurückgegeben werden. Dieser Parameter wird ignoriert, wenn sowohl die grobe als auch die exakte Pose-Verfeinerung deaktiviert ist.
Die Werte 'pose_ref_scoring_dist_rel' und 'pose_ref_scoring_dist_abs' bestimmen bei allen Bewertungen (ausser den Kantenanteil-Bewertungen bei oberflächenbasiertem Matching mit Kantenunterstützung), wie nahe ein Szenenpunkt zu einem Modellpunkt sein muss damit dieser als auf dem Modell klassifiziert wird.
Es ist zu beachten, dass für die Berechnung der Bewertung nach der groben Pose-Verfeinerung die abgetasteten Szenepunkte verwendet werden, während für die Berechnung nach der exakten Pose-Verfeinerung alle Szenepunkte verwendet werden.
Weitere Details über die verschiedenen Bewertungsarten finden sich weiter oben bei der Beschreibung der groben Pose-Verfeinerung.
Mögliche Werte: 'model_point_fraction', 'num_model_points', 'num_scene_points'
Standardwert: 'model_point_fraction'
Aktiviert oder deaktiviert die Verwendung von Szenennormalen
für die Pose-Verfeinerung.
Eine genauere Beschreibung dieses Parameters findet
sich weiter oben im Abschnitt Grope Pose-Verfeinerung.
Mögliche Werte: 'true', 'false'
Standardwert: 'false'
Setzt den Abstandsschwellwert von Kanten für die exakte Pose-Verfeinerung relativ zum Durchmesser des Modells. Nur Kanten deren Abstand zur Objektinstanz diesen Schwellwert unterschreiten gehen in die Pose-Verfeinerung ein. Kanten, die weiter von der Instanz entfernt sind, werden ignoriert. Nur einer der beiden Parameter 'pose_ref_dist_threshold_edges_rel' und 'pose_ref_dist_threshold_edges_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist oder wenn kein kantenunterstütztes Matching durchgeführt wird.
Vorgeschlagene Werte: 0.03, 0.05, 0.1, 0.2
Standardwert: 0.1
Assertion: 0 < 'pose_ref_dist_threshold_edges_rel'
Setzt den Abstandsschwellwert von Kanten für die exakte Pose-Verfeinerung als absoluten Wert. Für Details siehe den Parameter 'pose_ref_dist_threshold_edges_rel'. Nur einer der beiden Parameter 'pose_ref_dist_threshold_edges_rel' und 'pose_ref_dist_threshold_edges_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist oder wenn kein kantenunterstütztes Matching durchgeführt wird.
Assertion: 0 < 'pose_ref_dist_threshold_edges_abs'
Setzt den Abstandsschwellwert von Kanten für die Bewertung der Pose relativ zum Durchmesser des Modells. Für Details siehe den Parameter 'pose_ref_scoring_dist_edges_abs'. Nur einer der beiden Parameter 'pose_ref_scoring_dist_edges_rel' und 'pose_ref_scoring_dist_edges_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist oder wenn kein kantenunterstütztes Matching durchgeführt wird.
Vorgeschlagene Werte: 0.2, 0.01, 0.005, 0.0001
Standardwert: 0.005
Assertion: 0 < 'pose_ref_scoring_dist_edges_rel'
Setzt den Abstandsschwellwert von Kanten für die Bewertung der Pose als absoluten Wert. Nur Szenenkanten deren Abstand zu den Kanten der gefundenen Objektinstanz diesen Schwellwert unterschreiten gehen in die Berechnung der Bewertung ein und werden als 'auf dem Objekt liegend' klassifiziert. Alle anderen Szenenkanten werden ignoriert. Der Schwellwert sollte entsprechend der zu erwartenden Genauigkeit der extrahierten Kanten und der Genauigkeit der Pose-Verfeinerung gesetzt werden. Nur einer der beiden Parameter 'pose_ref_scoring_dist_edges_rel' und 'pose_ref_scoring_dist_edges_abs' sollte gesetzt werden. Werden beide gesetzt, so wird nur der zuletzt gesetzte Wert verwendet.
Dieser Parameter wird ignoriert, wenn die exakte Pose-Verfeinerung deaktiviert ist oder wenn kein kantenunterstütztes Matching durchgeführt wird.
Assertion: 0 < 'pose_ref_scoring_dist_edges_abs'
Dieser Operator liefert ein Handle zurück. Es ist zu beachten, dass der Zustand einer Instanz dieses Handletyps durch bestimmte Operatoren geändert werden kann, obwohl das Handle als Eingabeparameter in diesen Operatoren verwendet wird.
Dieser Operator unterstützt Cancel-Timeouts und Interrupts.
SurfaceModelID (input_control) surface_model → (handle)
Handle des Oberflächenmodells.
ObjectModel3D (input_control) object_model_3d → (handle)
Handle des 3D-Objektmodells, welches die Szene enthält.
RelSamplingDistance (input_control) real → (real)
Abtastdistanz der Szene relativ zum Durchmesser des Oberflächenmodells.
Defaultwert: 0.05
Wertevorschläge: 0.1, 0.07, 0.05, 0.04, 0.03
Restriktion: 0 < RelSamplingDistance < 1
KeyPointFraction (input_control) real → (real)
Anteil der abgetasteten Szenepunkte, die als Schlüsselpunkte verwendet werden.
Defaultwert: 0.2
Wertevorschläge: 0.3, 0.2, 0.1, 0.05
Restriktion: 0 < KeyPointFraction <= 1
MinScore (input_control) real(-array) → (real / integer)
Mindestbewertung der zurückgegebenen Posen.
Defaultwert: 0
Restriktion: MinScore >= 0
ReturnResultHandle (input_control) string → (string)
Aktiviert die Rückgabe eines Ergebnishandels
in SurfaceMatchingResultID.
Defaultwert: 'false'
Wertevorschläge: 'true', 'false'
GenParamName (input_control) attribute.name-array → (string)
Namen der generischen Parameter.
Defaultwert: []
Werteliste: '3d_edge_min_amplitude_abs', '3d_edge_min_amplitude_rel', '3d_edges', 'dense_pose_refinement', 'max_gap', 'max_overlap_dist_abs', 'max_overlap_dist_rel', 'num_matches', 'pose_ref_dist_threshold_abs', 'pose_ref_dist_threshold_edges_abs', 'pose_ref_dist_threshold_edges_rel', 'pose_ref_dist_threshold_rel', 'pose_ref_num_steps', 'pose_ref_scoring_dist_abs', 'pose_ref_scoring_dist_edges_abs', 'pose_ref_scoring_dist_edges_rel', 'pose_ref_scoring_dist_rel', 'pose_ref_sub_sampling', 'pose_ref_use_scene_normals', 'scene_normal_computation', 'score_type', 'sparse_pose_refinement', 'use_3d_edges', 'viewpoint'
GenParamValue (input_control) attribute.value-array → (string / real / integer)
Werte der generischen Parameter
Defaultwert: []
Wertevorschläge: 0, 1, 'true', 'false', 0.005, 0.01, 0.03, 0.05, 0.1, 'num_scene_points', 'model_point_fraction', 'num_model_points', 'fast', 'mls'
Pose (output_control) pose(-array) → (real / integer)
3D-Lage des Oberflächenmodells in der Szene.
Score (output_control) real-array → (real)
Bewertung der gefundenen Objektinstanzen.
SurfaceMatchingResultID (output_control) surface_matching_result(-array) → (handle)
Ergebnishandle, wenn
ReturnResultHandle aktiviert ist.
Wenn alle Parameter korrekt sind liefert find_surface_model den
Wert 2 (H_MSG_TRUE).
Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.
read_object_model_3d,
xyz_to_object_model_3d,
get_object_model_3d_params,
read_surface_model,
create_surface_model,
get_surface_model_param,
edges_object_model_3d
refine_surface_model_pose,
get_surface_matching_result,
clear_surface_matching_result,
clear_object_model_3d
refine_surface_model_pose,
find_surface_model_image,
refine_surface_model_pose_image
refine_surface_model_pose,
find_surface_model_image
3D Metrology