reconstruct_surface_stereoT_reconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereo (Operator)

Name

reconstruct_surface_stereoT_reconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereo — Oberflächenrekonstruktion mit kalibriertem Mehrbild-Stereoaufbau.

Signatur

reconstruct_surface_stereo(Images : : StereoModelID : ObjectModel3D)

Herror T_reconstruct_surface_stereo(const Hobject Images, const Htuple StereoModelID, Htuple* ObjectModel3D)

void ReconstructSurfaceStereo(const HObject& Images, const HTuple& StereoModelID, HTuple* ObjectModel3D)

void HObjectModel3D::ReconstructSurfaceStereo(const HImage& Images, const HStereoModel& StereoModelID)

HObjectModel3D HStereoModel::ReconstructSurfaceStereo(const HImage& Images) const

static void HOperatorSet.ReconstructSurfaceStereo(HObject images, HTuple stereoModelID, out HTuple objectModel3D)

void HObjectModel3D.ReconstructSurfaceStereo(HImage images, HStereoModel stereoModelID)

HObjectModel3D HStereoModel.ReconstructSurfaceStereo(HImage images)

Beschreibung

Der Operator reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo rekonstruiert eine Oberfläche aus den Bildern ImagesImagesImagesImagesimages, welche vom am Stereomodell StereoModelIDStereoModelIDStereoModelIDStereoModelIDstereoModelID angehängten kalibrierten Kamerasetup aufgenommen worden sind. Die rekonstruierte Oberfläche wird im HALCON-3D-Objektmodell ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D zurückgegeben.

Vorbereitung und Voraussetzungen

Die Zusammenfassung der notwendigen Vorbereitungsschritte:

  1. Kalibriertes Kamerasetup erstellen oder einlesen (mit calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras kann beispielsweise ein Mehrkamerasystem kalibriert, mit create_camera_setup_modelcreate_camera_setup_modelCreateCameraSetupModelCreateCameraSetupModelCreateCameraSetupModel erstellt und konfiguriert werden).

  2. Stereomodell mit create_stereo_modelcreate_stereo_modelCreateStereoModelCreateStereoModelCreateStereoModel unter Angabe der Methode Method='surface_pairwise'"surface_pairwise""surface_pairwise""surface_pairwise""surface_pairwise" oder 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" erstellen (siehe 'Rekonstruktionsalgorithmus').

  3. Parameter für die Bildrektifizierung mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam setzen und anschließend die Bildpaare mit set_stereo_model_image_pairsset_stereo_model_image_pairsSetStereoModelImagePairsSetStereoModelImagePairsSetStereoModelImagePairs auswählen.

  4. Umschließenden Quader mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam konfigurieren (GenParamName='bounding_box'"bounding_box""bounding_box""bounding_box""bounding_box").

  5. Stereomodellparameter für paarweise Rekonstruktion mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam konfigurieren.

  6. Für Modelle mit Method='surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" die Parameter für den Fusionsalgorithmus mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam konfigurieren.

  7. Bilder mit dem kalibrierten Kamerasetup aufnehmen und ins Bildarray ImagesImagesImagesImagesimages packen.

  8. Oberflächenrekonstruktion mit reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo durchführen.

  9. Zwischenergebnisse mit get_stereo_model_objectget_stereo_model_objectGetStereoModelObjectGetStereoModelObjectGetStereoModelObject und get_stereo_model_object_model_3dget_stereo_model_object_model_3dGetStereoModelObjectModel3dGetStereoModelObjectModel3dGetStereoModelObjectModel3d abfragen und analysieren.

  10. Nachjustieren der Stereomodellparameter für Verbesserungen in Qualität und Laufzeit mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam.

Ein Kamerasetupmodell wird dem Stereomodell StereoModelIDStereoModelIDStereoModelIDStereoModelIDstereoModelID bei seinem Erstellen mit create_stereo_modelcreate_stereo_modelCreateStereoModelCreateStereoModelCreateStereoModel angehängt. Das Kamerasetup muss kalibrierte Information über die Kameras enthalten, mit denen die Bilder in dem Bildarray ImagesImagesImagesImagesimages aufgenommen worden sind: Das I. Bild des Arrays entspricht der Kamera mit Index I-1 des Kamerasetups; die Anzahl der Bilder muss mit der Anzahl von Kameras im Setup übereinstimmen. Die Bilder in ImagesImagesImagesImagesimages müssen eine statische Szene darstellen oder alle gleichzeitig aufgenommen werden, ansonsten kann sich die Oberfläenrekonstruktion als unmöglich erweisen.

Ein gut kalibriertes Kamerasetup ist die wichtigste Voraussetzung für eine präse Oberflächenrekonstruktion. Die Kamerakalibrierung für ein Mehrkamerasetup muss daher besonders sorgfältig durchgeführt werden. HALCON bietet Kalibrierung von Mehrkamerasystemen mit dem Operator calibrate_camerascalibrate_camerasCalibrateCamerasCalibrateCamerasCalibrateCameras an. Das resultierende kalibrierte Kamerasetup kann mit einem nachfolgenden Aufruf von get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibData gelesen werden. Sollten Kameraparameter und -posen über einen anderen Weg gewonnen worden sein, so kann alternativ ein Kamerasetup mit dem Operator create_camera_setup_modelcreate_camera_setup_modelCreateCameraSetupModelCreateCameraSetupModelCreateCameraSetupModel erstellt werden.

Ein gut ausgewählter Satz von Bildpaaren (siehe set_stereo_model_image_pairsset_stereo_model_image_pairsSetStereoModelImagePairsSetStereoModelImagePairsSetStereoModelImagePairs) spielt eine wichtige Rolle für die allgemeine Qualität der Rekonstruktion. Einerseits werden Kamerapaare mit kleinerem Abstand untereinander bevorzugt, weil sie sich besser für binokulare Disparitätsalgorithmen eignen. Andererseits sollen die Paare möglichst unterschiedliche Blickwinkel der Szene liefern, sodass, wenn ein Paar einen bestimmten Bereich der Oberfläche nicht sieht, dieser von einem anderen Paar abgedeckt wird. Es ist außerdem zu beachten, dass die Laufzeit der paarweisen Rekonstruktion linear abhängig von der Anzahl der Bildpaare ist. Man soll deswegen so viele Bildpaare wie nötig und so wenig wie möglich auswählen, um einen Kompromiss zwischen Vollständigkeit der Oberfläche und Laufzeit des Operators finden zu können.

Dem Stereomodell wird ein umschließender Quader zugeordnet; ein gültiger Quader ist eine wichtige Voraussetzung für die Oberflächenrekonstruktion (siehe set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam für weitere Informationen). Der Rekonstruktionsalgorithmus braucht den umschließenden Quader aus drei Gründen:

Der Algorithmus wird versuchen, eine geschlossene Oberfläche zu rekonstruieren. Falls das Objekt nur von einer Seite aus betrachtet und rekonstruiert wird, legt normalerweise das entgegengesetzte Ende des umschließenden Quaders fest, wo das rekonstruierte Objekt abgeschnitten wird.

Die Stereomodellparameter der paarweisen Rekonstruktion vor den Fusionsparametern gut zu setzen ist essentiell, da die paarweise Rekonstruktion des Objekts als Input für den Fusionsalgorithmus dient. Die Parameter werden bei set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam genau beschrieben. Großen Einfluss hat die Wahl der 'disparity_method'"disparity_method""disparity_method""disparity_method""disparity_method". Die Objekte in der beobachteten Szene sollen auch bestimmte Oberflächeneigenschaften aufweisen, um die Rekonstruktion zu ermöglichen. Erstens soll die Oberfläche Lambertsche Eigenschaften aufweisen, d.h. die Beleuchtung der Oberfläche erscheint konstant unabhängig vom Blickwinkel. Zweitens sollte die Oberfläche ein ausreichendes Muster aufweisen, das möglichst keine wiederholenden Fragmente hat.

get_stereo_model_objectget_stereo_model_objectGetStereoModelObjectGetStereoModelObjectGetStereoModelObject liefert Zwischenergebnisse der Rekonstruktion, wie rektifizierte, Disparitäts- und Scorebilder. get_stereo_model_object_model_3dget_stereo_model_object_model_3dGetStereoModelObjectModel3dGetStereoModelObjectModel3dGetStereoModelObjectModel3d kann für Modelle mit Method='surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" benutzt werden, um das Ergebnis der paarweisen Rekonstruktion anzuzeigen. Der Absatz "Problembehandlung bei der Konfiguration des Stereomodells" erklärt, wie die Zwischenergebnisse benutzt werden können.

Rekonstruktionsalgorithmus

Der Operator reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo führt mehrere paarweise Stereorekonstruktionen durch und fügt die Ergebnisse anschließend zusammen. Die Bildpaare dieser paarweisen Rekonstruktion sind in StereoModelIDStereoModelIDStereoModelIDStereoModelIDstereoModelID als Kamerapaare des zugehörigen kalibrierten Kamerasetups gesetzt.

Für jedes Bildpaar werden die Bilder zunächst rektifiziert, bevor intern einer der Operatoren binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity, binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg oder binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs aufgerufen wird. Die Disparitätsinformation wird weiter durch einen internen Aufruf von disparity_image_to_xyzdisparity_image_to_xyzDisparityImageToXyzDisparityImageToXyzDisparityImageToXyz in Punkte im Koordinatensystem der from-Kamera umgewandelt. Im nächsten Schritt werden die Punkte in das allgemeine Koordinatensystem des an StereoModelIDStereoModelIDStereoModelIDStereoModelIDstereoModelID angehängten Kamerasetups transformiert und in einer Punktwolke zusammen mit den rekonstruierten Punkten aus den anderen Bildpaaren gespeichert.

'surface_pairwise'

Falls für das Stereomodell der Typ 'surface_pairwise'"surface_pairwise""surface_pairwise""surface_pairwise""surface_pairwise" gewählt wurde (siehe create_stereo_modelcreate_stereo_modelCreateStereoModelCreateStereoModelCreateStereoModel), wird die so erhaltene Punktwolke direkt in ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D zurückgegeben. Für jeden Punkt wird der Normalenvektor durch das Legen einer ausgleichenden Ebene durch die benachbarten 3D-Punkte berechnet. Im Gegensatz zu surface_normals_object_model_3dsurface_normals_object_model_3dSurfaceNormalsObjectModel3dSurfaceNormalsObjectModel3dSurfaceNormalsObjectModel3d werden die benachbarten Punkte aber nicht in 3D, sondern einfach in 2D bestimmt, indem die in den X-, Y- und Z-Koordinatenbildern benachbarten Punkte verwendet werden. Der Normalenvektor jedes 3D-Punktes wird nun auf den Normalenvektor der entsprechenden Ebene gesetzt. Für jeden rekonstruierten 3D-Punkt wird das Qualitätsmaß seiner Disparität als erweitertes Attribut mit abgespeichert. Zusätzlich dazu ist ein Subsampling der transformierten Koordinatenbilder möglich. Wenn nur ein Bildpaar bearbeitet wird und keine Punktvermaschung stattfindet, speichert reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo das Attribut 'xyz_mapping' im ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D. Dieses Attribut liefert die Zuordnung einzelner rekonstruierter 3D-Punkte zu den Bildkoordinaten des ersten Bildes aus dem Paar und ist eine Voraussetzung, um Operatoren wie segment_object_model_3dsegment_object_model_3dSegmentObjectModel3dSegmentObjectModel3dSegmentObjectModel3d oder object_model_3d_to_xyzobject_model_3d_to_xyzObjectModel3dToXyzObjectModel3dToXyzObjectModel3dToXyz (mit Type='from_xyz_map'"from_xyz_map""from_xyz_map""from_xyz_map""from_xyz_map") aufzurufen. Es ist zu beachten, dass, wenn mehrere Bildpaare bearbeitet werden, das Attribut nicht mehr mitgeliefert wird. Dies liegt daran, dass einzelne 3D-Punkte aus unterschiedlichen Bildpaaren stammen. Damit ist die Zuordnung zu allgemeinen Bildkoordinaten nicht mehr möglich. Ob das Attribut im Objekt gespeichert wurde, kann mit get_object_model_3d_paramsget_object_model_3d_paramsGetObjectModel3dParamsGetObjectModel3dParamsGetObjectModel3dParams mit GenParamName='has_xyz_mapping'"has_xyz_mapping""has_xyz_mapping""has_xyz_mapping""has_xyz_mapping" abgefragt werden.

Die rekonstruierte Punktwolke ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D kann in einem Nachverarbeitungsschritt vermascht werden. Für Stereomodelle vom Typ 'surface_pairwise'"surface_pairwise""surface_pairwise""surface_pairwise""surface_pairwise" wird nur der Poisson-basierte Vermaschungsalgorithmus unterstützt, der sich durch ein Setzen des Parameters 'point_meshing'"point_meshing""point_meshing""point_meshing""point_meshing" auf den Wert 'poisson'"poisson""poisson""poisson""poisson" einschalten lässt. Dieser Algorithmus generiert eine sogenannte wasserdichte Vermaschung, d.h. auch Regionen, welche keine Punktinformation enthalten, werden von der Vermaschung bedeckt.

'surface_fusion'

Falls für das Stereomodell der Typ 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" gewählt wurde, wird die resultierende Punktwolke der paarweisen Rekonstruktion noch weiter verarbeitet. Ziel ist es, eine möglichst glatte und trotzdem formtreue Oberfläche zu erhalten. Dazu wird der umschließende Quader gesampelt und jedem Sample-Punkt ein Distanzwert zu einer sogenannten Isosurface (bestehend aus Punkten mit Distanzwert 0) zugewiesen. Die endgültigen Distanzwerte (und somit die Isosurface) erhält man durch Minimierung einer Fehlerfunktion basierend auf den paarweise rekonstruierten Punkten. Dadurch erreicht man eine Fusion der paarweisen Einzel-Rekonstruktionen (siehe das an zweiter Stelle der Referenzen erwähnte Paper).

Die Berechnung der Isosurface kann in set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam mit den Parametern 'resolution'"resolution""resolution""resolution""resolution", 'surface_tolerance'"surface_tolerance""surface_tolerance""surface_tolerance""surface_tolerance", 'min_thickness'"min_thickness""min_thickness""min_thickness""min_thickness" und 'smoothing'"smoothing""smoothing""smoothing""smoothing" beeinflusst werden. Der Abstand zwischen Abtastpunkten im umschließenden Quader (in jeder Koordinatenrichtung) wird mit dem Parameter 'resolution'"resolution""resolution""resolution""resolution" eingestellt. Der Parameter 'smoothing'"smoothing""smoothing""smoothing""smoothing" reguliert die 'Unruhe' der Distanzfunktion, indem er die zwei Terme der Fehlerfunktion zueinander gewichtet: Datentreue gegenüber der ursprünglichen Punktwolke aus der paarweisen Rekonstruktion einerseits und Totalvariation der Distanzfunktion andererseits. Der gewünschte Wert des Parameters für einen bestimmten Datensatz muss durch Ausprobieren gefunden werden. Zu kleine Werte für diesen Parameter führen dazu, dass die Oberfläche viele Ausreißer enthält. Dies ist sogar dann der Fall, wenn die Oberfläche deswegen große Sprünge aufweist. Zu große Werte hingegen führen dazu, dass der Algorithmus sich nicht mehr auf die Eingangspunktwolke, welche durch die paarweise Rekonstruktion erstellt wurde, stützt. Datentreue gegenüber der ursprünglichen Oberfläche aus der paarweisen Rekonstruktion wird nicht im gesamten umschließenden Quader betrachtet, sondern nur in Sichtkegeln von den Kameras zur paarweise rekonstruierten Oberfläche. Ein Abtastpunkt in einem solchen Kegel wird als sicher außerhalb des Objekts (vor der Oberfläche) oder sicher innerhalb des Objekts (hinter der Oberfläche) angesehen bezüglich dieser Kamera, wenn sein Abstand zur ursprünglichen Oberfläche einen bestimmten Wert übersteigt, der durch den Parameter 'surface_tolerance'"surface_tolerance""surface_tolerance""surface_tolerance""surface_tolerance" gesetzt werden kann. Die Länge des zu berücksichtigenden Sichtkegels einer Kamera hinter der mit der paarweisen Rekonstruktion erstellten Oberfläche kann durch den Parameter 'min_thickness'"min_thickness""min_thickness""min_thickness""min_thickness" gesetzt werden (siehe auch set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam). 'min_thickness'"min_thickness""min_thickness""min_thickness""min_thickness" darf nicht kleiner als 'surface_tolerance'"surface_tolerance""surface_tolerance""surface_tolerance""surface_tolerance" werden.

image/svg+xml surface_tolerance min_thickness image/svg+xml
(1) (2)
Die Parameter 'surface_tolerance'"surface_tolerance""surface_tolerance""surface_tolerance""surface_tolerance" und 'min_thickness'"min_thickness""min_thickness""min_thickness""min_thickness" regulieren die Datentreue gegenüber der ursprünglichen Punktwolke aus der paarweisen Rekonstruktion. Punkte im Sichtkegel einer Kamera werden als sicher außerhalb des Objekts (vor der Oberfläche) oder sicher innerhalb des Objekts (hinter der Oberfläche) angesehen bezüglich dieser Kamera, wenn ihr Abstand zur ursprünglichen Oberfläche 'surface_tolerance'"surface_tolerance""surface_tolerance""surface_tolerance""surface_tolerance" übersteigt. Punkte hinter der Oberfläche (von der gegebenen Kamera aus gesehen) werden nur als sicher innerhalb des Objekts angesehen, wenn ihr Abstand zur ursprünglichen Oberfläche 'min_thickness'"min_thickness""min_thickness""min_thickness""min_thickness" nicht übersteigt.

Die Punkte des in ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D zurückgegebenen Objektmodells werden auf der Isofläche extrahiert, auf der die Distanzfunktion Null ist. Die Normalen werden aus dem Gradienten der Distanzfunktion berechnet. Für die Methode 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" müssen zwar mehr Parameter eingestellt werden als für rein paarweise Rekonstruktion, die Nachbearbeitung der erzeugten Punktwolke wird aber meist stark vereinfacht. Besonders Ausreißerunterdrückung, Glättung, gleichmäßiges Subsampling und Füllen von Löchern kann mit dieser Methode in hoher Qualität erreicht werden. Dasselbe gilt für die mögliche Vermaschung der rekonstruierten Punktwolke, siehe den nächsten Absatz. Zu beachten ist auch, dass der Algorithmus versuchen wird, eine geschlossene Oberfläche zu rekonstruieren. Falls das Objekt nur von einer Seite aus betrachtet und rekonstruiert wird, legt normalerweise das entgegengesetzte Ende des umschließenden Quaders fest, wo das rekonstruierte Objekt abgeschnitten wird. Die Methode 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" kann deutlich langsamer als einfache paarweise Rekonstruktion sein, was vor allem vom Parameter 'resolution'"resolution""resolution""resolution""resolution" beeinflusst wird.

Die rekonstruierte Punktwolke ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D kann in einem Nachverarbeitungsschritt vermascht werden. Für Stereomodelle vom Typ 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" wird der Algorithmus 'marching tetrahedra' verwendet, welcher durch ein Setzen des erwähnten Parameters auf den Wert 'isosurface'"isosurface""isosurface""isosurface""isosurface" aktiviert wird. Dabei ist zu beachten, dass das Objektmodell in ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D bei eingeschalteter Vermaschung mehr Punkte aufweist also ohne diese Option. Dies ist auch bei gleichbleibender Auflösung der Fall.

Texturierung der Punktwolke

Es ist möglich, das mit reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo rekonstruierte 3D-Objektmodell mit Farbinformationen aus den Eingabebildern zu versehen. Die Berechnung der Farbinformation erfolgt mit der in set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam gewählten Methode (siehe dortige Auflistung). Jeder 3D-Punkt erhält einen Farbwert bestehend aus einem Rot-, Grün-, und Blaukanal, die im ausgegebenen 3D-Objektmodell ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D als Attribute mit den Namen 'red'"red""red""red""red", 'green'"green""green""green""green" und 'blue'"blue""blue""blue""blue" gespeichert werden. Diese Attribute können zum Beispiel in der Prozedur visualize_object_model_3d mit GenParamName = 'red_channel_attrib', 'green_channel_attrib' und 'blue_channel_attrib' benützt werden. Die Attribute können auch mittels get_object_model_3d_paramsget_object_model_3d_paramsGetObjectModel3dParamsGetObjectModel3dParamsGetObjectModel3dParams abgerufen werden oder mittels select_points_object_model_3dselect_points_object_model_3dSelectPointsObjectModel3dSelectPointsObjectModel3dSelectPointsObjectModel3d oder anderen Operatoren, die erweiterte Attribute verwenden, weiterverarbeitet werden. Für den Fall, dass zur Rekonstruktion Grauwertbilder verwendet werden, so wird der Farbwert in den drei Kanälen auf denselben Wert gesetzt. Falls Mehrkanalbilder verwendet werden, so wird für die Rekonstruktion des 3D-Objektmodells lediglich der erste Kanal verwendet. Die verbleibenden Kanäle werden ausschließlich zur Bestimmung der Farbinformation verwendet.

Falls bei der Rekonstruktion ein Stereomodell vom Typ 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" verwendet wurde, so werden Punkte rekonstruiert, die keine direkte Korrespondenz zu Punkten im Bild haben. Diese Punkte sind somit unsichtbar, da sie von keiner Kamera aus gesehen werden. Diese 3D-Punkte erhalten ebenfalls Farbinformationen, indem ihnen der Farbwert ihres nächsten sichtbaren Nachbarns zugewiesen wird. Im Normalfall ist diese Berechnung nicht sehr zeitaufwändig und kann aktiviert bleiben. Es kann jedoch passieren, dass der Wert für den Parameter 'resolution'"resolution""resolution""resolution""resolution" viel zu fein für die vorliegende Bildauflösung eingestellt wurde. Dadurch werden sehr viele unsichtbare 3D-Punkte rekonstruiert. Dies führt dann zu einer sehr zeitaufwändigen Nachbarschaftssuche und damit zu einer stark erhöhten Laufzeit. In diesen Fällen sollte entweder der Parameters 'resolution'"resolution""resolution""resolution""resolution" angepasst werden oder die Bestimmung der Farbwerte für unsichtbare Punkte deaktiviert werden. Dies lässt sich realisieren, indem man den Wert des Parameters 'color_invisible'"color_invisible""color_invisible""color_invisible""color_invisible" über einen Aufruf von set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam auf 'false'"false""false""false""false" setzt. In diesem Fall werden die Farbwerte von unsichtbaren Punkten auf 255 gesetzt.

Problembehandlung bei der Konfiguration des Stereomodells

Eine richtige Vorbereitung eines Stereomodells ist nicht immer einfach. Bitte halten Sie sich an obenstehenden Ablauf. Wenn die Rekonstruktionsergebnisse nicht befriedigend sind, können die folgenden Verbesserungsmaßnahmen versucht werden:

persistence-Modus einschalten

Wenn der 'persistence'"persistence""persistence""persistence""persistence"-Modus des Stereomodells eingeschaltet ist (Aufruf von set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam mit GenParamName='persistence'"persistence""persistence""persistence""persistence"), speichert der nachfolgende Aufruf von reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo ikonische Zwischenergebnisse, welche zusätzliche Informationen zur Verfügung stellen. Diese Zwischenergebnisse können mit get_stereo_model_objectget_stereo_model_objectGetStereoModelObjectGetStereoModelObjectGetStereoModelObject und get_stereo_model_object_model_3dget_stereo_model_object_model_3dGetStereoModelObjectModel3dGetStereoModelObjectModel3dGetStereoModelObjectModel3d abgefragt werden.

Die Qualität der Kamerakalibrierung testen

Den umschließenden Quader überprüfen

Der umschließende Quader sollte sehr eng um das zu rekonstruierende Objekt bzw. das relevante Volumen gesetzt sein. Der Algorithmus benutzt die Projektion des Quaders in jedes Bild jedes Bildpaares, um die Werte für die Parameter MinDisparity und MaxDisparity des internen Aufrufs von binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity bzw. binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs zu schätzen. Diese Werte können mit get_stereo_model_paramget_stereo_model_paramGetStereoModelParamGetStereoModelParamGetStereoModelParam abgefragt werden. Für den Fall, dass als Methode binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg ausgewählt wurde, wird aus den berechneten Werten eine geeignete Schätzung für die Parameter InitialGuess und InitialLevel abgeleitet. Diese können mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam aber auch überschrieben werden.

Die Qualität der Disparitätsbilder verbessern

Mit eingeschaltetem 'persistence'"persistence""persistence""persistence""persistence"-Modus lassen sich das Disparitäts- und das Maßbild jedes Bildpaares inspizieren. Sie werden vom Operator get_stereo_model_objectget_stereo_model_objectGetStereoModelObjectGetStereoModelObjectGetStereoModelObject mit dem entsprechenden Kameraindexpaar [From, To] im Parameter PairIndex und 'disparity_image'"disparity_image""disparity_image""disparity_image""disparity_image" bzw. 'score_image'"score_image""score_image""score_image""score_image" im ObjectName zurückgegeben. Wenn beide Bilder erhebliche Mängel aufweisen (z.B. die tatsächliche Form der aufgenommenen Oberfläche lässt sich im Disparitätsbild gar nicht erkennen), müssen die Parameter, die den internen Aufruf des binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity steuern (d.h. alle Stereomodellparameter, die mit dem Präfix 'binocular_'"binocular_""binocular_""binocular_""binocular_" beginnen; siehe set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam), angepasst werden, bis eine Verbesserung erreicht wird.

Eine Alternative dazu stellt die Wahl einer alternativen Methode zur Berechnung der Disparitäten dar. HALCON stellt dabei neben dem bereits erwähnten internen Aufruf von binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity auch die die beiden anderen Methoden binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg und binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs zur Verfügung. Diese Verfahren zeichnen sich beispielsweise durch eine Berechnung von Disparitäten in texturlosen Bereichen aus, sind aber in den meisten Fällen etwas langsamer als die auf Kreuzkorrelation basierende Methode. Allerdings kann es auch für diese beiden Verfahren nötig sein, eine an die Anwendung spezifische Anpassung der Parameter vorzunehmen. Je nach gewähltem Verfahren kann der Nutzer die Parameter mit dem Präfix 'binocular_mg_'"binocular_mg_""binocular_mg_""binocular_mg_""binocular_mg_" bzw. 'binocular_ms_'"binocular_ms_""binocular_ms_""binocular_ms_""binocular_ms_" setzen, bis eine Verbesserung erzielt wurde. Eine ausführliche Beschreibung der Methoden und ihrer Parameter findet sich in binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity bzw. binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg oder binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs.

Fusionsparameter

Wenn das mit get_stereo_model_object_model_3dget_stereo_model_object_model_3dGetStereoModelObjectModel3dGetStereoModelObjectModel3dGetStereoModelObjectModel3d inspizierte Ergebnis der paarweisen Rekonstruktion nicht weiter verbessert werden kann, kann begonnen werden, die Fusionsparameter anzupassen. Für ihre Beschreibung siehe auch set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam. In manchen Fällen ist die paarweise Rekonstruktion des Objekts kaum erkennbar, kann aber vom Fusionsalgorithmus noch zu einem vernünftigen Ergebnis verarbeitet werden. In jedem Fall sollte die paarweise Rekonstruktion genug Punkte als Input für die Fusion erzeugen.

Laufzeit

Um die Laufzeit zu verbessern, können die folgenden Verbesserungsmaßnahmen ausprobiert werden:

Größe des umschließenden Quaders

Der umschließende Quader sollte sehr eng um das zu rekonstruierende Objekt bzw. das relevante Volumen gesetzt sein. Andernfalls wird die Laufzeit unnötig und - für die Methode 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" - drastisch erhöht.

Abtastfaktor im Rektifikationsschritt

Der Stereomodellparameter 'rectif_sub_sampling'"rectif_sub_sampling""rectif_sub_sampling""rectif_sub_sampling""rectif_sub_sampling" (siehe set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam) steuert den Abtastfaktor im Rektifikationsschritt. Ein Faktor > 1.0 mindert die Auflösung der rektifizierten Bilder im Vergleich zu den originalen Bildern. Damit wird der nachfolgende interne Aufruf der ausgewählten Disparitätsmethode wesentlich beschleunigt; allerdings sinkt die Bild- bzw. Rekonstruktionsauflösung. Der Parameter 'rectif_interpolation'"rectif_interpolation""rectif_interpolation""rectif_interpolation""rectif_interpolation" kann auch eine Rolle bezüglich der Geschwindigkeit im Rekonstruktionsschritt spielen, ist dabei aber eher weniger wichtig.

Disparitätsparameter

Das Ziel ist ein Kompromiss zwischen der Vollständigkeit der Oberflächenrekonstruktion und der Laufzeit. Im Stereomodell können drei verschiedene Methoden zur Berechnung der Disparitätsbilder gesetzt werden. Je nachdem, welche dieser Methoden ausgewählt wurde, steht dem Stereomodell ein spezieller Parametersatz zur Verfügung, der ein präzises Anpassen der Methode an den verwendeten Datensatz ermöglicht. Ist die Methode binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity gewählt, so können nur die Parameter, deren Name mit dem Präfix 'binocular_'"binocular_""binocular_""binocular_""binocular_" beginnen, gesetzt werden. Für die Methode binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg müssen die Parameter mit dem Präfix 'binocular_mg_'"binocular_mg_""binocular_mg_""binocular_mg_""binocular_mg_" und für die Methode binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs die Parameter mit dem Präfix 'binocular_ms_'"binocular_ms_""binocular_ms_""binocular_ms_""binocular_ms_" verwendet werden.

Parameter bei Verwendung von binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity

NumLevels, MaskWidth, MaskHeight, Filter, SubDisparity

Jeder dieser Parameter von binocular_disparitybinocular_disparityBinocularDisparityBinocularDisparityBinocularDisparity hat einen entsprechenden Stereomodellparameter, dessen Name mit dem Präfix 'binocular_'"binocular_""binocular_""binocular_""binocular_" beginnt. Diese Parameter haben auch Einfluss auf die Laufzeit. Daher kann ein richtiges Anpassen dieser Parameter die Laufzeit des Operators verbessern.

Parameter bei Verwendung von binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg

GrayConstancy, GradientConstancy, Smoothness, InitialGuess, MGSolver, MGCycleType, MGPreRelax, MGPostRelax, InitialLevel, Iterations, PyramidFactor

Jeder dieser Parameter von binocular_disparity_mgbinocular_disparity_mgBinocularDisparityMgBinocularDisparityMgBinocularDisparityMg hat einen entsprechenden Stereomodellparameter, dessen Name mit dem Präfix 'binocular_mg_'"binocular_mg_""binocular_mg_""binocular_mg_""binocular_mg_" beginnt. Diese Parameter haben neben einer Auswirkung auf das Ergebnis auch Einfluss auf die Laufzeit. Daher kann eine richtige Anpassung dieser Parameter die Laufzeit des Operators beeinflussen.

Parameter bei Verwendung von binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs

SurfaceSmoothing, EdgeSmoothing, ConsistencyCheck, SimilarityMeasure, SubDisparity

Jeder dieser Parameter von binocular_disparity_msbinocular_disparity_msBinocularDisparityMsBinocularDisparityMsBinocularDisparityMs hat einen entsprechenden Stereomodellparameter, dessen Name mit dem Präfix 'binocular_ms_'"binocular_ms_""binocular_ms_""binocular_ms_""binocular_ms_" beginnt. Diese Parameter haben neben einer Auswirkung auf das Ergebnis auch Einfluss auf die Laufzeit. Daher kann eine richtige Anpassung dieser Parameter die Laufzeit des Operators beeinflussen.

Rekonstruktion von Punkten mit gutem Qualitätsmaß

Neben der Anpassung des Abtastschrittes ist es auch möglich, Punkte aufgrund ihres berechneten Qualitätsmaßes von der 3D-Rekonstruktion auszuschließen. Dazu sollten zuerst mit Hilfe eines Aufrufs von get_stereo_model_objectget_stereo_model_objectGetStereoModelObjectGetStereoModelObjectGetStereoModelObject unter Verwendung von GenParamName = 'score_image' die Maßbilder für die Disparitätswerte abgefragt werden. Der Nutzer kann anhand der Verteilung dieser Werte nun entscheiden, ob Disparitäten unterhalb einer bestimmten Schwelle von der Rekonstruktion ausgeschlossen werden sollen. Dies lässt sich über das Setzen des Parameters GenParamName = 'binocular_score_thresh' im Operator set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam bewerkstelligen. Wenn Punkte aufgrund ihres Qualitätsmaßes von der Rekonstruktion ausgeschlossen werden, kann die Laufzeit leicht verbessert werden, da nicht mehr der komplette Datensatz weiterverarbeitet werden muss. Da, wie eingangs erwähnt, für jeden 3D-Punkt das berechnete Qualitätsmaß als zugehöriges Punktattribut mit abgespeichert wird, können auch nach dem Aufruf von reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo noch Punkte aufgrund ihres Qualitätsmaßes von der Punktwolke entfernt werden. Dies hat den Vorteil, dass ein erneutes Aufrufen von reconstruct_surface_stereoreconstruct_surface_stereoReconstructSurfaceStereoReconstructSurfaceStereoReconstructSurfaceStereo nicht nötig ist. Allerdings muss die Punktwolke während der Rekonstruktion im Gesamten berechnet werden, was eine höhere Laufzeit zur Folge hat.

Abtastschritt der X-,Y-,Z-Daten

Für die Methode 'surface_pairwise'"surface_pairwise""surface_pairwise""surface_pairwise""surface_pairwise" kann ein größerer Abtastschritt der X-,Y-,Z-Daten im letzten Rekonstruktionsschritt verwendet werden, indem GenParamName='sub_sampling_step'"sub_sampling_step""sub_sampling_step""sub_sampling_step""sub_sampling_step" mit set_stereo_model_paramset_stereo_model_paramSetStereoModelParamSetStereoModelParamSetStereoModelParam gesetzt wird. Damit werden die rekonstruierten Punktwolken deutlich dünner, was ihre Nachbearbeitung beschleunigt.

Fusionsparameter

Die Methode 'surface_fusion'"surface_fusion""surface_fusion""surface_fusion""surface_fusion" kann durch Erhöhen des Parameters 'resolution'"resolution""resolution""resolution""resolution" deutlich beschleunigt werden.

Ausführungsinformationen

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

ImagesImagesImagesImagesimages (input_object)  singlechannelimage-array objectHImageHImageHobject (byte)

Bildarray, das von dem dem Stereomodell angehängten kalibrierten Kamerasetup aufgenommen wurden.

StereoModelIDStereoModelIDStereoModelIDStereoModelIDstereoModelID (input_control)  stereo_model HStereoModel, HTupleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle des Stereomodells.

ObjectModel3DObjectModel3DObjectModel3DObjectModel3DobjectModel3D (output_control)  object_model_3d HObjectModel3D, HTupleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle der rekonstruierten Oberfläche.

Vorgänger

create_stereo_modelcreate_stereo_modelCreateStereoModelCreateStereoModelCreateStereoModel, get_calib_dataget_calib_dataGetCalibDataGetCalibDataGetCalibData, set_stereo_model_image_pairsset_stereo_model_image_pairsSetStereoModelImagePairsSetStereoModelImagePairsSetStereoModelImagePairs

Nachfolger

get_stereo_model_object_model_3dget_stereo_model_object_model_3dGetStereoModelObjectModel3dGetStereoModelObjectModel3dGetStereoModelObjectModel3d

Alternativen

reconstruct_points_stereoreconstruct_points_stereoReconstructPointsStereoReconstructPointsStereoReconstructPointsStereo

Literatur

M. Kazhdan, M. Bolitho, and H. Hoppe: „Poisson Surface Reconstruction.“ Symposium on Geometry Processing (June 2006).,
C. Zach, T. Pock, and H. Bischof: „A globally optimal algorithm for robust TV-L1 range image integration.“ Proceedings of IEEE International Conference on Computer Vision (ICCV 2007).

Modul

3D Metrology