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. Die Szene sollte 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.
Für eine genaue Pose
ist es wichtig, dass die
Normalen der Szene und des Modells in die gleiche Richtung zeigen (siehe
'scene_invert_normals' ).
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).
Für Modelle die zur Berechnung einer ansichtsbasierten Bewertung trainiert
wurden (siehe create_surface_model
), wird eine weitere, fünfte
Einzelbewertungen ermittelt.
Entsprechend können die Resultate mit jeder dieser Bewertungen gefiltert
werden, indem MinScore
ein Tupel mit bis zu fünf 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 fünf 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 ansichtsbasierte Anteil der Ergebnisbewertung, d.h. wie viele
Punkte der Szene einem Modellpunkt zugeordnet werden konnten im
Verhältnis zu den Modellpunkten, die in dieser Ansicht sichtbar
sind, zurückgegeben durch
'score_view_based' 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
sind, wie im folgenden Abschnitt erläutert, für verschiedene Fälle
unterschiedlich.
Mit Pose-Verfeinerung
Bei einem Matching mit Pose-Verfeinerung hängt die Bewertung davon ab, ob das Matching mit Kantenunterstützung durchgeführt wurde:
Ohne Kantenunterstützung wird für die Bewertung 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 entsprechendem Szenepunkt (wie bei 'num_model_points' ) und dividieren dieser Anzahl entweder durch:
die Gesamtzahl abgetasteter Modellpunkte, falls das Modell nicht für eine ansichtsbasierte Bewertung trainiert worden ist.
oder durch
die Anzahl aller Modellpunkte die von einem einzigen Blickpunkt aus maximal sichtbar sein können, falls das Modell für eine ansichtsbasierte Bewertung trainiert worden ist
0 <= Score <= 1
Mit Kantenunterstützung ist die Bewertung das geometrische Mittel des Oberflächenanteils und des Kantenanteils. Der Kantenanteil wird davon beeinflusst, ob das Modell für eine ansichtsbasierte Bewertung trainiert worden ist oder nicht. Ermittelt wird dieser aus der 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)
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. Die Bewertung nach der exakten Pose-Verfeinerung ist daher unabhängig von der Abtastdistanz der Szene.
Ohne Pose-Verfeinerung
Falls von den drei Schritten des Matching-Vorgangs nur der erste,
Näherungsweises Matching
, ausgeführt wird, hängen der mögliche
Wert und die Interpretation der Bewertung 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'
Dieser Parameter invertiert die Normalenausrichtung der 3D-Szene. Die Normalenausrichtungen (einwärts oder auswärts) der Szene müssen mit den Ausrichtungen des 3D-Objektmodells übereinstimmen. Wenn sowohl das Modell als auch die Szene mit demselben Aufbau aufgenommen werden, so zeigen die Normalen bereits in die gleiche Richtung. Wenn beim Matching der Effekt auftritt, dass das Modell auf der 'Außenseite' der Szene gefunden wird, so sollte versucht werden, diesen Parameter auf 'true' zu setzen. Es ist auch darauf zu achten, dass die Normalen in der Szene alle entweder nach innen oder nach außen zeigen, d.h. konsistent orientiert sind. Für kantenunterstütztes oberflächenbasiertes Matching müssen die Normalen einwärts ausgerichtet sein.
Für die Pose-Verfeinerung ist die Normalenausrichtung irrelevant.
Mögliche Werte: 'false' , 'true'
Standardwert: 'false'
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.
Der Blickpunkt wird auch bei Modellen mit ansichtsbasierter
Bewertung benutzt (d.h. mit aktiviertem 'train_view_based' ),
um die Anzahl der Punkte des Modells abzufragen die von diesem
Blickpunkt aus sichtbar sind.
Definiert ist der Blickpunkt im gleichen Koordinatensystem wie
ObjectModel3D
.
Die 3D-Koordinaten des Blickpunktes (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, wird ein Fehler zurückgegeben.
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'
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'
Schaltet die ansichtsbasierte Bewertung beim oberflächenbasierten
Matching ein oder aus.
Dies ist vor allem dann sinnvoll, wenn ein Matching ohne Verwendung der
ansichtsbasierten Bewertung durchgeführt wird, obwohl das Modell speziell
dafür trainiert wurde. Der Einfluss von 'use_view_based' auf
die Bewertung ist in der Beschreibung zu Score
weiter
oben erklärt.
Wenn das Oberflächenmodell nicht mit aktiviertem
'train_view_based' erstellt wurde, wird bei aktiviertem
'use_view_based' ein Fehler zurückgegeben.
Mögliche Werte: 'true' , 'false'
Standardwert: 'false' , falls 'train_view_based' bei Modellerstellung deaktiviert, andernfalls 'true' .
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.
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'
Schaltet die ansichtsbasierte Bewertung beim oberflächenbasierten Matching ein oder aus. Für weitere Informationen siehe die entsprechende Berschreibung im Abschnitt zur groben Pose-Verfeinerung.
Wenn das Oberflächenmodell nicht mit aktiviertem 'train_view_based' erstellt wurde, wird bei aktiviertem 'use_view_based' ein Fehler zurückgegeben.
Mögliche Werte: 'true' , 'false'
Standardwert: 'false' , falls 'train_view_based' bei Modellerstellung deaktiviert, andernfalls 'true' .
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_invert_normals' , 'scene_normal_computation' , 'sparse_pose_refinement' , 'use_3d_edges' , 'use_view_based' , '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