create_surface_model
— Erstellt die für oberflächenbasiertes Matching notwendigen Datenstrukturen.
create_surface_model( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)
create_surface_model
erstellt aus dem 3D-Objektmodell
ObjectModel3D
ein Modell für oberflächenbasiertes Matching.
Das 3D-Oberflächenmodell kann beispielsweise mittels
read_object_model_3d
aus einer Datei gelesen worden sein oder
mittels xyz_to_object_model_3d
erstellt worden sein.
Das Handle des erstellten Oberflächenmodells wird in SurfaceModelID
zurückgegeben.
Weitere Parameter des Modells können mit set_surface_model_param
gesetzt werden, nachdem das Modell erzeugt wurde.
Für die Erstellung des Oberflächenmmodells aus dem 3D-Objektmodell werden Punkte und Normalen aus dem 3D-Objektmodell benötigt. Hier sind die folgenden Kombinationen möglich:
Punkte und Punktnormalen;
Punkte und ein Dreiecks- oder Polygongitter, z.B. aus einer CAD-Datei;
Punkte und ein 2D-Mapping, z.B. für 3D-Objektmodelle, die mittels
xyz_to_object_model_3d
erstellt wurden.
Es ist zu beachten, dass die Richtung und Ausrichtung (einwärts oder auswärts) der Normalen des Modells wichtig für das Matching sind. Für das kantenunterstützte oberflächenbasierte Matching müssen die Normalen einwärts gerichtet sein und zusätzlich muss das Modell ein Dreiecks- oder Polygongitter enthalten (siehe unten).
Für das Oberflächenmodell wird die Oberfläche des 3D-Objektmodells mit
einem bestimmten Abstand abgetastet.
Die Abtastdistanz wird im Parameter RelSamplingDistance
spezifiziert, und wird relativ zum Durchmesser des umschließenden
achsenparallelen Quaders angegeben. Wird etwa RelSamplingDistance
auf 0.05 gesetzt und ist der Durchmesser von
ObjectModel3D
gleich '10 cm' , dann haben die Punkte
der abgetasteten Oberfläche einen Abstand von etwa '5 mm' .
Die abgetasteten Punkte werden für das näherungsweise Matching
in find_surface_model
verwendet (siehe unten).
Die abgetasteten Punkte können mit dem Operator
get_surface_model_param
als 'sampled_model' abgerufen
werden.
Es ist zu beachten, dass einzelne Ausreißerpunkte den Durchmesser des
umschließenden Quaders deutlich verändern können, was aufgrund der
relativen Parametrisierung die Abtastdistanz stark stören kann.
Ausreißerpunkte im 3D-Objektmodell sind daher vor dem Aufruf des Operators
zu entfernen.
Verringert man RelSamplingDistance
, so werden mehr Punkte
abgetastet, was zu einem stabileren aber langsameren Matching führt.
Erhöht man RelSamplingDistance
, so werden weniger Punkte
abgetastet, was zu einem schnelleren aber weniger stabilen Matching führt.
(1) | (2) | (3) | (4) |
Die abgetasteten Punkte werden für das Auffinden des Objekts in einer
Szene im Operator find_surface_model
verwendet.
Dafür werden aus den abgetasteten Punkten alle möglichen Punktpaare gebildet
und für jedes Paar der Abstand und die relative Orientierung der Oberflächen
berechnet.
Beide Werte werden diskretisiert und für das Matching gespeichert.
Die generischen Parameter 'feat_step_size_rel' und
'feat_angle_resolution' können verwendet werden um die
Diskretisierung von Distanz und Orientierung zu steuern (siehe unten).
Das 3D-Objektmodell wird ein zweites Mal für die Pose-Verfeinerung abgetastet. Diese zweite Abtastung wird mit einer kleineren Abtastdistanz durchgeführt, was zu mehr Punkten führt. Der generische Parameter 'pose_ref_rel_sampling_distance' setzt die Abtastdistanz relativ zum Durchmesser des umschliessenden Quaders des 3D-Objektmodells fest. Verringert man den Wert so wird die Pose-Verfeinerung genauer, jedoch wird auch das Modell größer und die Modellgenerierung und das Matching langsamer. Erhöht man den Wert so wird die Pose-Verfeinerung ungenauer, das Modell kleiner und die Modellgenerierung und das Matching schneller.
Das oberflächenbasierte Matching kann zusätzlich zu den 3D-Oberflächenpunkten auch 3D-Kanten verwenden, um die Ausrichtung zu verbessern. Dies ist besonders für Objekte mit größeren planaren Seiten hilfreich, die andernfalls in einer Hintergrundebene oder falsch rotiert gefunden werden können. Um das kantenunterstützte oberflächenbasierte Matching zu verwenden, muss das Modell durch setzen des generischen Parameters 'train_3d_edges' auf 'true' entsprechend vorbereitet werden. Dabei muss das Modell ein Dreiecks- oder Polygongitter enthalten, bei dem die Reihenfolge der Punkte bei der Normalenberechnung zu einwärts gerichteten Normalen führt. Weiterhin benötigt das Training in diesem Fall OpenGL 2.1, GLSL 1.2 und die OpenGL Extensions GL_EXT_framebuffer_object und GL_EXT_framebuffer_blit. Es ist zu beachten, dass das Training deutlich länger dauern kann als das Training ohne Kantenunterstützung.
Zusätzlich kann das Modell für oberflächenbasiertes Matching zur Berechnung der ansichtsbasierten Bewertung vorbereitet werden. Dies ist besonders für Szenen hilfreich, in denen Objekte nur zu einem kleinen Teil sichtbar sind, da diese mit der herkömmlichen Bewertung nur einen kleinen Wert erhalten würden. Um in diesen Fällen einen höheren und aussagekräftigeren Wert zu bekommen, entspricht der Wert bei der ansichtsbasierten Bewertung dem Verhältnis zwischen der Anzahl der Punkte, die dem Modell zugeordneten werden konnten und der Anzahl an Modellpunkten die von einer bestimmten Ansicht aus sichtbar sind. Um das ansichtsbasierte oberflächenbasierte Matching zu verwenden, muss das Modell durch Setzen des generischen Parameters 'train_view_based' auf 'true' entsprechend vorbereitet werden. Wie bei 'train_3d_edges' , muss das 3D-Objektmodell eine Vermaschung aufweisen, d.h. Dreiecke oder Polygone enthalten. Auch für 'train_view_based' ist es wichtig, dass die Normalenvektoren einwärts gerichtet sind.
Es ist zu beachten, dass verrauschte Daten bei der Erzeugung eines
3D-Objektmodells zur Berechnung unzureichender Normalen führt. Insbesondere
wenn das Modell für die Verwendung von 3D-Kanten oder zur Berechnung der
ansichtsbasierten Bewertung vorbereitet wurde kann dies zu unzuverlässigen
Bewertungen führen. Um die Anzahl verrauschter Punkte zu reduzieren können
beispielsweise die Operatoren smooth_object_model_3d
oder
simplify_object_model_3d
genutzt werden.
In den Parametern GenParamName
und GenParamValue
können
generische Parameter und deren Werte übergeben werden. GenParamName
enthält ein Tupel von Parameternamen die gesetzt werden sollen, und
GenParamValue
die dazugehörigen Werte.
Die folgenden Werte sind für GenParamName
möglich:
Invertieren der Normalenausrichtung des 3D-Objektmodells.
Die Normalenausrichtungen (einwärts oder auswärts)
müssen für die Erstellung des Oberflächenmodells bekannt sein und
mit der Ausrichtung in der Szene übereinstimmen.
Wenn sowohl das Modell als auch die Szene mit demselben Aufbau
aufgenommen werden, so zeigen die Normalen bereits in die gleiche
Richtung.
Wenn das Modell aus einer CAD-Datei geladen wurde dann könnten die
Normalen in unterschiedliche Richtungen zeigen. Wenn beim Matching
der Effekt auftritt, dass das Modell auf der 'Außenseite' der
Szene gefunden wird und das Modell aus einer CAD-Datei stammt,
so sollte versucht werden diesen Parameter auf 'true'
zu setzen.
Es ist auch darauf zu achten, dass die Normalen in der CAD-Datei
alle entweder nach innen oder nach außen zeigen, d.h. konsistent
orientiert sind.
Für die Pose-Verfeinerung ist die Normalenausrichtung irrelevant.
Wird das Oberflächenmodell nur mit refine_surface_model_pose
verwendet, so hat die Wahl von 'model_invert_normals' keinen
Einfluss auf das Ergebnis.
Mögliche Werte: 'false' , 'true'
Standardwert: 'false'
Setzen der Abtastdistanz für die Pose-Verfeinerung relativ zum Durchmesser des 3D-Objektmodells. Verringert man den Wert, so wird die Pose-Verfeinerung genauer, jedoch wird auch das Modell größer und die Modellgenerierung und das Matching langsamer. Erhöht man den Wert, so wird die Pose-Verfeinerung ungenauer, das Modell kleiner und die Modellgenerierung und das Matching schneller.
Vorgeschlagene Werte: 0.05, 0.02, 0.01, 0.005
Standardwert: 0.01
Assertion: 0 < 'pose_ref_rel_sampling_distance' < 1
Setzen der Diskretisierung des Abstandes von Punktpaaren relativ zum
Durchmesser des 3D-Objektmodells.
Standardmäßig wird dies auf den Wert von RelSamplingDistance
gesetzt.
Es wird nicht empfohlen diesen Wert zu ändern.
Für stark verrauschte Szenen kann der Wert erhöht werden um die
Stabilität des Matchings gegen verrauschte Punkte zu erhöhen.
Vorgeschlagene Werte: 0.1, 0.05, 0.03
Standardwert: Wert von RelSamplingDistance
Assertion: 0 < 'feat_step_size_rel' < 1
Setzen der Diskretisierung der Orientierung von Punktepaaren, als
Anzahl der Unterteilungen eines Winkels.
Es wird nicht empfohlen diesen Wert zu ändern.
Erhöht man diesen Wert, so erhöht sich die Genauigkeit des
näherungsweisen Matchings in find_surface_model
, jedoch
reduziert sich die Stabilität gegen verrauschte Normalenrichtungen.
Verringert man diesen Wert, so verringert sich auch die Genauigkeit des
näherungsweisen Matchings, jedoch erhöht sich die Stabilität gegen
verrauschte Normalenrichtungen.
Für stark verrauschte Szenen in denen die Normalenrichtungen nicht
genau bestimmt werden können kann dieser Wert auf 25 oder
20 gesetzt werden.
Vorgeschlagene Werte: 20, 25, 30
Standardwert: 30
Assertion: 'feat_angle_resolution' > 1
Trainiert das Oberflächenmodell für die kantenunterstützte Objekterkennung und Posenverfeinerung. Das Modell muss in diesem Fall eine Vermaschung aufweisen, d.h. Dreiecke oder Polygone enthalten. Zusätzlich ist es wichtig, dass die Normalenvektoren einwärts gerichtet sind. Weiterhin benötigt das Training in diesem Fall OpenGL.
Mögliche Werte: 'false' , 'true'
Standardwert: 'false'
Trainiert das Oberflächenmodell zur Berechnung einer ansichtsbasierten Bewertung für die Objekterkennung und Posenverfeinerung. Das Modell muss in diesem Fall eine Vermaschung aufweisen, d.h. Dreiecke oder Polygone enthalten. Zusätzlich ist es wichtig, dass die Normalenvektoren einwärts gerichtet sind. Weiterhin benötigt das Training in diesem Fall OpenGL.
Mögliche Werte: 'false' , 'true'
Standardwert: 'false'
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.
ObjectModel3D
(input_control) object_model_3d →
(handle)
Handle des 3D-Objektmodells.
RelSamplingDistance
(input_control) real →
(real)
Abtastdistanz relativ zum Durchmesser des Objekts.
Defaultwert: 0.03
Wertevorschläge: 0.1, 0.05, 0.03, 0.02, 0.01
Restriktion: 0 < RelSamplingDistance < 1
GenParamName
(input_control) attribute.name(-array) →
(string)
Namen der generischen Parameter.
Defaultwert: []
Wertevorschläge: 'model_invert_normals' , 'pose_ref_rel_sampling_distance' , 'feat_step_size_rel' , 'feat_angle_resolution' , 'train_3d_edges' , 'train_view_based'
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.02, 0.05, 0.1
SurfaceModelID
(output_control) surface_model →
(handle)
Handle des Oberflächenmodells.
Wenn alle Parameter korrekt sind liefert create_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
,
surface_normals_object_model_3d
find_surface_model
,
refine_surface_model_pose
,
get_surface_model_param
,
write_surface_model
,
clear_surface_model
,
set_surface_model_param
find_surface_model
,
refine_surface_model_pose
,
read_surface_model
,
write_surface_model
,
clear_surface_model
,
set_surface_model_param
Bertram Drost, Markus Ulrich, Nassir Navab, Slobodan Ilic: „Model Globally, Match Locally: Efficient and Robust 3D Object Recognition.“ Computer Vision and Pattern Recognition, pp. 998-1005, 2010.
3D Metrology