Okay, also ich habe eine OBJ-Datei, die ich in PCLpointcloud2 eingelesen habe. Jetzt möchte ich es in einen K-dTree füttern. Das nimmt PCLPointCloud2 nicht als Eingabe. Ich möchte jeden allgemeinen Punkt abfragen, wenn er auf der Oberfläche meiner OBJ-Datei liegt. Ich finde es schwierig, ihre Dokumentation zu verstehen. Wie kann es gemacht werden? Plus, bitte zeigen Sie mir eine gute Referenz leicht interpretierbar. Und was ist "PointT" BTW? Ist es benutzerdefinierte Build-Typ von uns definiert? bitte ausführlicher.Wie implementiert man KdTree mit PCLPointCloud2 in loadOBJfile in der Punktwolkenbibliothek?
Antwort
Schauen Sie sich den Code im mitgelieferten Tool pcl_mesh_sampling
an (im PCL-Code-Verzeichnis unter tools/mesh_sampling.cpp
). Es ist relativ einfach. Er lädt ein Modell von PLY oder OBJ und tastet für jedes Dreieck zufällige Punkte aus dem Dreieck ab. Die letzte Punktwolke wird dann einer Voxel-Gitterprobe unterzogen, um die Punkte relativ einheitlich zu machen. Alternativ können Sie einfach das Programm pcl_mesh_sampling
in Ihrer obj-Datei ausführen, um eine PCD-Ausgabe zu erhalten, die Sie dann mit pcl_viewer
visualisieren können, bevor Sie die PCD-Datei in Ihren eigenen Code laden.
Sobald Sie die letzte Punktwolke haben, können Sie bauen und verwenden Sie einen KD-Baum als pro http://pointclouds.org/documentation/tutorials/kdtree_search.php
PointT
ist das Template-Argument. Die Punktwolkenbibliothek kann eine Vielzahl von Punkttypen verarbeiten, von einfachen PointXYZ (mit nur x, y, z) bis zu komplizierteren Punkten wie PointXYZRGBNormal (mit x, y, z, normal_x, normal_y, normal_z, Krümmung, r, g, und b Kanäle). Jeder Algorithmus basiert auf dem Punkttyp, den Sie verwenden möchten. Es wäre wahrscheinlich einfacher, wenn Sie PointXYZ mit Ihrer OBJ-Datei verwenden würden, also verwenden Sie pcl :: PointXYZ für alle Ihre Template-Argumente. Weitere Informationen zu Vorlagen finden Sie unter http://www.tutorialspoint.com/cplusplus/cpp_templates.htm und http://pointclouds.org/documentation/tutorials/adding_custom_ptype.php.
Update (Antwort auf neuesten Kommentar)
hier hinzugefügt, da diese Antwort für einen Kommentar ist zu lang.
Ich denke, ich sehe, was Sie bekommen. Wenn Sie also Punkte aus der Punktwolke & erzeugen, erstellen Sie einen KD-Baum der Objektoberfläche, und für jeden Punkt behalten Sie die Spur bei, welche Flächen sich in der Nähe dieses Punktes befinden (wahrscheinlich alle Flächen neben der Fläche, von der der Punkt gesampelt wurde) ausreichend? Nur ein Gesicht ist definitiv nicht ausreichend). Wenn dann der Abfragepunkt angegeben wird, finden Sie den nächsten Punkt in der KD-Struktur und prüfen, ob der Abfragepunkt auf der "Außenseite" oder innerhalb der vollständigen Liste der in der Nähe befindlichen Flächen liegt, die diesem Punkt in der KD-Struktur zugeordnet sind. Wenn es auf dem "Inneren" von allen von ihnen ist, ist es vielleicht ein innerer Punkt. Aber ich kann nicht garantieren, dass dies wahr ist. Das ist meine Meinung zu dieser Frage im Moment. Aber ich frage mich, ob Sie wirklich einen Mesh-basierten Ansatz wollen. Übrigens, wenn Sie Ihr Mesh in konvexe Teile aufteilen, dann können Sie bei der Verarbeitung jedes konvexen Teils schöne Garantien haben.
Noch eine Sache, wenn ich einen kd-Baum abfrage und eine Menge von Punkten abrufe, müssen wir jetzt für einen Testpunkt prüfen, ob er innerhalb oder außerhalb unseres Objekts liegt, indem wir einfach diese abgerufenen Punkte betrachten. –
Nur um klar zu sein, haben Sie eine zusätzliche Anforderung, die Sie überprüfen möchten, ob ein bestimmter Abfragepunkt innerhalb oder außerhalb des Objekts ist? Dies ist zusätzlich zu den nahe gelegenen Punkten auf der Oberfläche, richtig? Ich habe eine andere Frage: Warum konvertierst du dein Objekt in eine Punktwolke und vergleichst nicht irgendeinen Abfragepunkt mit jeder Facette? –
Ja, das sind genau meine Anforderungen. Aber mein Abfragepunkt würde sich ständig durch Benutzereingaben über die Tastatur ändern, und die Anzahl der Facetten, die ich für jede neue Position des Abfragepunkts prüfen müsste, wäre riesig.Deshalb muss ich immer eine Teilmenge von Vertices abrufen. –
Enthält die OBJ-Datei, die Sie laden, alle Punkte, die Sie auf der Oberfläche Ihres Objekts haben oder nur Knoten, zwischen denen Sie hoffen, dass die Punktwolkenbibliothek interpoliert? –
Also ich hoffe, PCL sollte die Punkte interpolieren, wenn möglich. Kann es gemacht werden? –