KlassenKlassenKlassenKlassen | | | | Operatoren

create_surface_modelcreate_surface_modelCreateSurfaceModelcreate_surface_modelCreateSurfaceModelCreateSurfaceModel (Operator)

Name

create_surface_modelcreate_surface_modelCreateSurfaceModelcreate_surface_modelCreateSurfaceModelCreateSurfaceModel — Erstellt die für oberflächenbasiertes Matching notwendigen Datenstrukturen.

Signatur

create_surface_model( : : ObjectModel3D, RelSamplingDistance, GenParamName, GenParamValue : SurfaceModelID)

Herror create_surface_model(const Hlong ObjectModel3D, double RelSamplingDistance, const char* GenParamName, const char* GenParamValue, Hlong* SurfaceModelID)

Herror T_create_surface_model(const Htuple ObjectModel3D, const Htuple RelSamplingDistance, const Htuple GenParamName, const Htuple GenParamValue, Htuple* SurfaceModelID)

Herror create_surface_model(const HTuple& ObjectModel3D, const HTuple& RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue, Hlong* SurfaceModelID)

HSurfaceModel HObjectModel3D::CreateSurfaceModel(const HTuple& RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue) const

void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, const HTuple& RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue)

void CreateSurfaceModel(const HTuple& ObjectModel3D, const HTuple& RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue, HTuple* SurfaceModelID)

HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue) const

HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue) const

HSurfaceModel HObjectModel3D::CreateSurfaceModel(double RelSamplingDistance, const char* GenParamName, const char* GenParamValue) const

void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue)

void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue)

void HSurfaceModel::HSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const char* GenParamName, const char* GenParamValue)

void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HTuple& GenParamName, const HTuple& GenParamValue)

void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const HString& GenParamName, const HString& GenParamValue)

void HSurfaceModel::CreateSurfaceModel(const HObjectModel3D& ObjectModel3D, double RelSamplingDistance, const char* GenParamName, const char* GenParamValue)

void HOperatorSetX.CreateSurfaceModel(
[in] VARIANT ObjectModel3D, [in] VARIANT RelSamplingDistance, [in] VARIANT GenParamName, [in] VARIANT GenParamValue, [out] VARIANT* SurfaceModelID)

IHSurfaceModelX* HObjectModel3DX.CreateSurfaceModel(
[in] double RelSamplingDistance, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

void HSurfaceModelX.CreateSurfaceModel(
[in] IHObjectModel3DX* ObjectModel3D, [in] double RelSamplingDistance, [in] VARIANT GenParamName, [in] VARIANT GenParamValue)

static void HOperatorSet.CreateSurfaceModel(HTuple objectModel3D, HTuple relSamplingDistance, HTuple genParamName, HTuple genParamValue, out HTuple surfaceModelID)

HSurfaceModel HObjectModel3D.CreateSurfaceModel(double relSamplingDistance, HTuple genParamName, HTuple genParamValue)

HSurfaceModel HObjectModel3D.CreateSurfaceModel(double relSamplingDistance, string genParamName, string genParamValue)

public HSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, HTuple genParamName, HTuple genParamValue)

public HSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, string genParamName, string genParamValue)

void HSurfaceModel.CreateSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, HTuple genParamName, HTuple genParamValue)

void HSurfaceModel.CreateSurfaceModel(HObjectModel3D objectModel3D, double relSamplingDistance, string genParamName, string genParamValue)

Beschreibung

create_surface_modelcreate_surface_modelCreateSurfaceModelcreate_surface_modelCreateSurfaceModelCreateSurfaceModel erstellt aus dem 3D-Objektmodell ObjectModel3DObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D ein Modell für oberflächenbasiertes Matching. Das 3D-Oberflächenmodell kann beispielsweise mittels read_object_model_3dread_object_model_3dReadObjectModel3dread_object_model_3dReadObjectModel3dReadObjectModel3d aus einer Datei gelesen worden sein oder mittels xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3d erstellt worden sein. Das Handle des erstellten Oberflächenmodells wird in SurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDsurfaceModelID zurückgegeben.

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:

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 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance spezifiziert, und wird relativ zum Durchmesser des umschließenden achsenparallelen Quaders angegeben. Wird etwa RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance auf 0.05 gesetzt und ist der Durchmesser von ObjectModel3DObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D gleich '10 cm'"10 cm""10 cm""10 cm""10 cm""10 cm", dann haben die Punkte der abgetasteten Oberfläche einen Abstand von etwa '5 mm'"5 mm""5 mm""5 mm""5 mm""5 mm". Die abgetasteten Punkte werden für das näherungsweise Matching in find_surface_modelfind_surface_modelFindSurfaceModelfind_surface_modelFindSurfaceModelFindSurfaceModel verwendet (siehe unten). Die abgetasteten Punkte können mit dem Operator get_surface_model_paramget_surface_model_paramGetSurfaceModelParamget_surface_model_paramGetSurfaceModelParamGetSurfaceModelParam als 'sampled_model'"sampled_model""sampled_model""sampled_model""sampled_model""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 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance, so werden mehr Punkte abgetastet, was zu einem stabileren aber langsameren Matching führt. Erhöht man RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance, so werden weniger Punkte abgetastet, was zu einem schnelleren aber weniger stabilen Matching führt.

(1) (2) (3) (4)
(1) Ursprüngliches 3D-Modell. (2) 3D-Modell abgetastet mit RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance = 0.02. (3) RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance = 0.03. (4) RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance = 0.05.

Die abgetasteten Punkte werden für das Auffinden des Objekts in einer Szene im Operator find_surface_modelfind_surface_modelFindSurfaceModelfind_surface_modelFindSurfaceModelFindSurfaceModel 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'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel" und 'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""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'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""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'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges" auf 'true'"true""true""true""true""true" entsprechend vorbereitet werden. Dabei müssen die Normalen einwärts gerichtet sein und zusätzlich muss das Modell ein Dreiecks- oder Polygongitter enthalten. 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.

In den Parametern GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName und GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue können generische Parameter und deren Werte übergeben werden. GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName enthält ein Tupel von Parameternamen die gesetzt werden sollen, und GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue die dazugehörigen Werte. Die folgenden Werte sind für GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName möglich:

'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals":

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 dem selben 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'"true""true""true""true""true" zu setzen. Es ist auch darauf zu achten, dass die Normalen in der CAD-Datei alle entweder nach innen oder nach aussen zeigen, d.h. konsistent orientiert sind. Für die Pose-Verfeinerung ist die Normalenausrichtung irrelevant. Wird das Oberflächenmodell nur mit refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPose verwendet, so hat die Wahl von 'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals" keinen Einfluss auf das Ergebnis.

Mögliche Werte: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"

Standardwert: 'false'"false""false""false""false""false"

'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance":

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'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance" < 1

'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel":

Setzen der Diskretisierung des Abstandes von Punktpaaren relativ zum Durchmesser des 3D-Objektmodells. Standardmäßig wird dies auf den Wert von RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance 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 RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance

Assertion: 0 < 'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel" < 1

'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution":

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_modelfind_surface_modelFindSurfaceModelfind_surface_modelFindSurfaceModelFindSurfaceModel, 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'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution" > 1

'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges":

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'"false""false""false""false""false", 'true'"true""true""true""true""true"

Standardwert: 'false'"false""false""false""false""false"

Parallelisierung

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.

Parameter

ObjectModel3DObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D (input_control)  object_model_3d HObjectModel3D, HTupleHTupleHObjectModel3D, HTupleHObjectModel3DX, VARIANTHtuple (integer) (IntPtr) (Hlong) (Hlong) (Hlong) (Hlong)

Handle des 3D-Objektmodells.

RelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistanceRelSamplingDistancerelSamplingDistance (input_control)  real HTupleHTupleHTupleVARIANTHtuple (real) (double) (double) (double) (double) (double)

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

GenParamNameGenParamNameGenParamNameGenParamNameGenParamNamegenParamName (input_control)  attribute.name(-array) HTupleHTupleHTupleVARIANTHtuple (string) (string) (HString) (char*) (BSTR) (char*)

Namen der generischen Parameter.

Defaultwert: []

Wertevorschläge: 'model_invert_normals'"model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals""model_invert_normals", 'pose_ref_rel_sampling_distance'"pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance""pose_ref_rel_sampling_distance", 'feat_step_size_rel'"feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel""feat_step_size_rel", 'feat_angle_resolution'"feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution""feat_angle_resolution", 'train_3d_edges'"train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges""train_3d_edges"

GenParamValueGenParamValueGenParamValueGenParamValueGenParamValuegenParamValue (input_control)  attribute.value(-array) HTupleHTupleHTupleVARIANTHtuple (string / real / integer) (string / double / int / long) (HString / double / Hlong) (char* / double / Hlong) (BSTR / double / Hlong) (char* / double / Hlong)

Werte der generischen Parameter.

Defaultwert: []

Wertevorschläge: 0, 1, 'true'"true""true""true""true""true", 'false'"false""false""false""false""false", 0.005, 0.01, 0.02, 0.05, 0.1

SurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDSurfaceModelIDsurfaceModelID (output_control)  surface_model HSurfaceModel, HTupleHTupleHSurfaceModel, HTupleHSurfaceModelX, VARIANTHtuple (integer) (IntPtr) (Hlong) (Hlong) (Hlong) (Hlong)

Handle des Oberflächenmodells.

Ergebnis

Wenn alle Parameter korrekt sind liefert create_surface_modelcreate_surface_modelCreateSurfaceModelcreate_surface_modelCreateSurfaceModelCreateSurfaceModel den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

read_object_model_3dread_object_model_3dReadObjectModel3dread_object_model_3dReadObjectModel3dReadObjectModel3d, xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3d, get_object_model_3d_paramsget_object_model_3d_paramsGetObjectModel3dParamsget_object_model_3d_paramsGetObjectModel3dParamsGetObjectModel3dParams

Nachfolger

find_surface_modelfind_surface_modelFindSurfaceModelfind_surface_modelFindSurfaceModelFindSurfaceModel, refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPose, get_surface_model_paramget_surface_model_paramGetSurfaceModelParamget_surface_model_paramGetSurfaceModelParamGetSurfaceModelParam, write_surface_modelwrite_surface_modelWriteSurfaceModelwrite_surface_modelWriteSurfaceModelWriteSurfaceModel, clear_surface_modelclear_surface_modelClearSurfaceModelclear_surface_modelClearSurfaceModelClearSurfaceModel, set_surface_model_paramset_surface_model_paramSetSurfaceModelParamset_surface_model_paramSetSurfaceModelParamSetSurfaceModelParam

Alternativen

read_surface_modelread_surface_modelReadSurfaceModelread_surface_modelReadSurfaceModelReadSurfaceModel

Siehe auch

find_surface_modelfind_surface_modelFindSurfaceModelfind_surface_modelFindSurfaceModelFindSurfaceModel, refine_surface_model_poserefine_surface_model_poseRefineSurfaceModelPoserefine_surface_model_poseRefineSurfaceModelPoseRefineSurfaceModelPose, read_surface_modelread_surface_modelReadSurfaceModelread_surface_modelReadSurfaceModelReadSurfaceModel, write_surface_modelwrite_surface_modelWriteSurfaceModelwrite_surface_modelWriteSurfaceModelWriteSurfaceModel, clear_surface_modelclear_surface_modelClearSurfaceModelclear_surface_modelClearSurfaceModelClearSurfaceModel, set_surface_model_paramset_surface_model_paramSetSurfaceModelParamset_surface_model_paramSetSurfaceModelParamSetSurfaceModelParam

Literatur

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.

Modul

3D Metrology


KlassenKlassenKlassenKlassen | | | | Operatoren