| Operatoren |
reconstruct_surface_stereo — Oberflächenrekonstruktion mit kalibriertem Mehrbild-Stereoaufbau.
reconstruct_surface_stereo(Images : : StereoModelID : ObjectModel3D)
Der Operator reconstruct_surface_stereo rekonstruiert eine Oberfläche aus den Bildern Images, welche vom am Stereomodell StereoModelID angehängten kalibrierten Kamerasetup aufgenommen worden sind. Die rekonstruierte Oberfläche wird im HALCON-3D-Objektmodell ObjectModel3D zurückgegeben.
Der zugrunde liegende Oberflächenrekonstruktionsalgorithmus basiert auf dem Fusionieren von Tiefeninformation aus mehreren binokularen Tiefenbildern. Der Algorithmus ruft zuerst intern einen HALCON-Disparitätsoperator (zur Zeit binocular_disparity) für jedes Paar einer vordefinierten Liste auf. Die Disparitätsinformation wird dann in X-, Y- und Z-Koordinatenbilder relativ zum Koordinatensystem der from-Kamera umgewandelt. Dazu wird intern der Operator disparity_image_to_xyz aufgerufen. Danach wird der Normalenvektor für jeden 3D-Punkt berechnet. Hierzu wird eine ausgleichende Ebene durch die benachbarten Punkte bestimmt. Im Gegensatz zu surface_normals_object_model_3d 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. Im nächsten Schritt werden die Koordinatenbilder und die Normalenvektoren in das allgemeine Koordinatensystem des am Stereomodell StereoModelID angehängten Kamerasetups umgewandelt. Zum Schluss werden die umgewandelten Koordinatenbilder abgetastet und die abgetasteten Koordinaten werden mit ihren Normalenvektoren in eine allgemeine Punktwolke zusammen mit den Punkten und Normalenvektoren aus den anderen Bildpaaren gespeichert. Das 3D-Objektmodell im Parameter ObjectModel3D enthält somit die Koordinaten und die Normale für jeden rekonstruierten Punkt.
Die so entstandene Punktwolke kann zusätzlich in einem Nachbearbeitungsschritt vermascht werden. Der Modellparameter 'point_meshing' schaltet diesen Schritt ein oder aus. Wenn der Vermaschungsschritt eingeschaltet ist, wird im ObjectModel3D die Vermaschung der ursprünglichen Punktwolke zurückgegeben. Zur Zeit wird ein Poisson-basierter Vermaschungsalgorithmus unterstützt (siehe die Beschreibung unten). Dieser Algorithmus generiert eine so genannte wasserdichte Vermaschung, d.h. auch Regionen, welche keine Punktinformation enthalten, werden von der Vermaschung bedeckt.
Wenn nur ein Bildpaar bearbeitet wird und keine Punktvermaschung stattfindet speichert reconstruct_surface_stereo das Attribut 'xyz_mapping' im ObjectModel3D. 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_3d oder object_model_3d_to_xyz (mit Type='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_params mit ParamName='has_xyz_mapping' abgefragt werden.
Ein Kamerasetupmodell wird dem Stereomodell StereoModelID bei seinem Erstellen mit create_stereo_model angehängt. Der Kamerasetup muss kalibrierte Information über die Kameras enthalten, mit denen die Bilder in der Liste Images aufgenommen worden sind: Das I. Bild von der Liste entspricht der Kamera mit Index I-1 von dem Kamerasetup; die Anzahl der Bilder muss mit der Anzahl von Kameras im Setup übereinstimmen.
Ein gut kalibriertes Kamerasetup ist die wichtigste Voraussetzung für eine präzise Obererflächenrekonstruktion. Die Kamerakalibrierung für den Mehrkamerasetup muss daher besonders sorgfältig gewonnen werden. HALCON bietet Kalibrierung von Mehrkamerasystemen mit dem Operator calibrate_cameras. Das resultierende kalibrierte Kamerasetup kann mit einem nachfolgenden Aufruf von get_calib_data gelesen werden. Für sonst irgendwie bekannte Kameraparameter und -posen kann alternativ einen Kamerasetup mit dem Operator create_camera_setup_model erstellt werden.
Dem Stereomodell wird ein kleinster umschließender Quader zugeordnet; ein gültiger Quader ist eine wichtige Voraussetzung für die Oberflächenrekonstruktion (siehe set_stereo_model_param für weitere Information). Der Rekonstruktionsalgorithmus braucht den kleinsten umschließenden Quader aus zwei Gründen: Erstens wird die Projektion des Quaders in jedes Bild eines Bildpaares berechnet, um die Werte für die Parameter MinDisparity und MaxDisparity des internen Aufrufs von binocular_disparity zu schätzen. Zweitens werden Oberflächenfragmente, welche außerhalb des Quaders liegen, am Ende des Algorithmus von der Rekonstruktion herausgeschnitten. Ein viel zu großer Quader kann dazu führen, dass MinDisparity und MaxDisparity zu weit voneinander geschätzt werden, und damit den internen Aufruf von binocular_disparity und demzufolge von reconstruct_surface_stereo verlangsamen. Ein viel zu kleiner Quader kann dazu führen, dass auch erwünschte Punkte aus der Rekonstruktion herausgeschnitten werden.
Die Objekte in der beobachteten Szene sollen auch bestimmte Oberflächeneigenschaften aufweisen, um die Rekonstruktion zu ermöglichen. Erstens soll die Oberfläche Lambertische 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.
Ein gut ausgewählter Satz von Bildpaaren (siehe set_stereo_model_image_pairs) 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 die binokuläre Disparitätsalgorithmen eignen. Andererseits sollen die Paare möglichst unterschiedliche Blickwinkel der Szene liefern, so dass, 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 des Operators 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.
Abschließend müssen Images eine stille Szene darstellen oder sie müssen sie alle gleichzeitig aufgenommen werden, ansonsten kann sich die Oberflächenrekonstruktion als unmöglich erweisen.
Die Zusammenfassung der notwendigen Vorbereitungsschritte:
Kalibrierten Kamerasetup holen (z.B. mit calibrate_cameras Mehrkamerasystem kalibrieren oder mit create_camera_setup_model einen erstellen und danach konfigurieren)
Stereomodell mit create_stereo_model und mit dem Parameter Method='surface_pairwise' erstellen
Kleinsten umschließenden Quader mit set_stereo_model_param konfigurieren (Parameter ParamName='bounding_box')
(optional) Weitere Stereomodellparameter mit set_stereo_model_param konfigurieren
Bildpaare mit set_stereo_model_image_pairs auswählen
Bilder mit dem kalibrierten Kamerasetup holen und ins Bildarray Images packen
Oberflächenrekonstruktion mit reconstruct_surface_stereo durchführen
(optional) Die Schritte 6. and 7. können mehrfach wiederholt werden
Eine richtige Vorbereitung eines Stereomodells ist nicht immer einfach. Wenn die Rekonstruktionsergebnisse nicht befriedigend sind, können die folgenden Verbesserungsmaßnahmen versucht werden:
Wenn der 'persistence'-Modus des Stereomodells eingeschaltet ist (Aufruf von set_stereo_model_param mit ParamName='persistence'), speichert der nachfolgende Aufruf von reconstruct_surface_stereo ikonische Zwischenergebnisse, welche zusätzliche Information zur Verfügung stellen (siehe unten).
Wenn der Kamerasetup mit calibrate_cameras kalibriert worden ist, speichert dieser Operator auch Qualitätsinformation, z.B. in Form von Standardabweichungen im Kamerasetupmodell mit. Das dem Stereomodell angehängte Kamerasetupmodell kann mit dem Operator get_stereo_model_param und ParamName='camera_setup_model' abgefragt werden, die Kameraparameter-Standardabweichungen danach mit dem Operator get_camera_setup_param. Ungewöhnlich höhe Werte der Standardabweichungen können auf eine schlechte Kamerakalibrierung hindeuten.
Mit eingeschaltetem 'persistence'-Modus (siehe oben) lassen sich die rektifizierten Bilder jedes Bildpaares anschauen. Sie werden vom Operator get_stereo_model_object mit dem entsprechenden Kameraindexpaar [From, To] im Parameter PairIndex und 'from_image_rect' bzw. 'to_image_rect' im ObjectName zurückgegeben. Die Bilder deuten auf eine gute Rektifizierung hin, wenn alle markanten Objektmerkmale in derselben Zeile beider Bilder erscheinen. Eine Diskrepanz sogar in der Größenordnung von nur einigen Zeilen ist ein klarer Hinweis dafür, dass die Kalibrierung nicht optimal ist.
Mit eingeschaltetem 'persistence'-Modus (siehe oben) lassen sich das Disparitäts- und das Maßbild jedes Bildpaares anschauen. Sie werden vom Operator get_stereo_model_object mit dem entsprechenden Kameraindexpaar [From, To] im Parameter PairIndex und 'disparity_image' bzw. '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_disparity steuern (d.h. alle Stereomodellparameter, die mit dem Prefix 'binocular_' beginnen; siehe set_stereo_model_param), angepasst werden bis eine Verbesserung erreicht wird. Unter Umständen kann es sogar einfacher sein, die passenden Parameter zuerst mit dem betroffenen Bildpaar und einem direkten Aufruf von binocular_disparity zu finden.
Mit eingeschaltetem 'persistence'-Modus (siehe oben) lassen sich die Werte der MinDisparity und MaxDisparity anschauen. Sie werden vom Operator get_stereo_model_param mit Parameter ParamName='min_disparity' bzw. ParamName='max_disparity' zurückgegeben. Die sich daraus ergebenden Tupel beinhalten die minimalen bzw. maximalen Disparitätswerte für alle Bildpaare in der Reihenfolge, die mit get_stereo_model_image_pairs festgelegt wurde. Sollten die beiden Werte eines Bildpaares einen ungewöhnlich hohen Abstand aufweisen, könnte das ein Anzeichen für schlechte Disparitätsbilder sein. Sollten bessere Disparitätsbilder mit einem direkten Aufruf der binocular_disparity mit anderen Min- und Maxwerte erreicht werden, muss der kleinste umschließende Quader des Stereomodells angepasst werden, so dass die interne Berechnung dieser Werte die gewünschte Werte nähert (siehe set_stereo_model_param).
Wie es bereits oben erwähnt wurde, gibt es einen Kompromiss zwischen der Vollständigkeit der Oberflächenrekonstruktion und Laufzeit. Um einen besseren Kompromiss zu finden, können die folgenden Verbesserungsmaßnahmen ausprobiert werden:
Der Stereomodellparameter 'rectif_sub_sampling' (siehe set_stereo_model_param) 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 von binocular_disparity wesentlich beschleunigt zum Preis einer kleineren Bild- bzw. Rekonstruktionsauflösung. Der Parameter 'rectif_interpolation' kann auch eine Rolle bezüglich der Geschwindigkeit im Rekonstruktionstschritt spielen, ist dabei aber eher weniger wichtig.
Die folgenden Disparitätsparameter, die den internen Aufruf von binocular_disparity steuern, sollten besonders aufmerksam eingestellt werden:
Ein viel zu großer Abstand zwischen MinDisparity und MaxDisparity hat einen großen Einfluss auf die Laufzeit von binocular_disparity. Die intern berechneten Werte dieser Parameter können mit get_stereo_model_param getestet werden und, wenn notwendig, durch Anpassen des kleinsten umschließenden Quaders des Modells verbessert werden.
Jeder dieser Parameter von binocular_disparity hat einen entsprechenden Stereomodellparameter dessen Name mit dem Präfix 'binocular_' beginnt. Diese Parameter haben auch Einfluss auf die Laufzeit. Daher kann ein richtiges Anpassen dieser Parameter die Laufzeit des Operators verbessern.
Der Abtastschritt der X-,Y-,Z-Daten wird im letzten Rekonstruktionsschritt verwendet, um rekonstruierte Punktwolken jedes Bildpaares zu verdünnen, bevor sie in die allgemeine Oberflächenpunktwolke hineinfließen. Beim Erhöhen des Parameters ParamName='sub_sampling_step' mit set_stereo_model_param kann sich eine (eher mittelmäßige) Laufzeitbeschleunigung ergeben. Damit werden aber auch die rekonstruierten Oberflächendaten deutlich dünner.
Es ist zu beachten, dass wenn ein 3D-Objektmodell nicht mehr benötigt wird oder überschrieben werden soll, zuerst der Operator clear_object_model_3d aufgerufen werden muss, um den entsprechenden Speicher freizugeben.
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.
Bildarray, das von dem dem Stereomodell angehängten kalibrierten Kamerasetup aufgenommen wurden.
Handle des Stereomodells.
Handle der rekonstruierten Oberfläche.
create_stereo_model, get_calib_data, set_stereo_model_image_pairs
M. Kazhdan, M. Bolitho, and H. Hoppe: „Poisson Surface Reconstruction.“ Symposium on Geometry Processing (June 2006).
3D Metrology
| Operatoren |