2017-10-16 5 views
0

Ich bin neu bei PCL (Point Cloud-Bibliothek), und ich habe versucht, Supervoxel_Clustering (this link) auf meinem benutzerdefinierten Datensatz zu implementieren. Mein Punktwolken-Dataset hat diese Felder: X Y Z R G B L1 L2 wobei R, G, B integer Werte zwischen 0-255 und L1 und L2 sind integer Etiketten.Halten Sie benutzerdefinierte Felder während des Supervoxel-Clustering-Prozesses in Point Cloud Bibliothek (PCL)

Nach supervoxel Anwendung, speichere ich die Punktwolken mit den Aufschriften:

/// save the labeled cloud 
PointLCloudT::Ptr labeled_cloud = super.getLabeledCloud(); 
pcl::io::savePCDFileASCII("/path/labeled_cloud.pcd", *labeled_cloud); 

Meine Frage ist: Wie meine Etiketten und Farben während des Prozesses von den ursprünglichen Punkt Wolken zu übertragen. Ich versuche, meinen eigenen Punkttyp zu definieren, etwas wie: X Y Z R G B L1 L2 L3, aber mit dem Tutorial zu Punkttypen ist es nicht trivial das zu tun. Eine Dummy-Lösung, die ich denke, verwendet KD-Baum und Transfer Etiketten von Supervoxel Ergebnis zu den ursprünglichen Punkten, aber immer noch muss ich meine ursprünglichen Punkte mit allen benutzerdefinierten Felder in pcl lesen.

Jeder kann mir dabei helfen?

Danke, Bruce

Antwort

1

Ich verstehe Sie haben bereits einen Punkttyp mit L1 und L2 Felder definiert.

Die Punkte kommen aus supervoxel_clustering in der Reihenfolge, in der sie eingefügt wurden, und die Methode getLabeledCloud() gibt alle ursprünglichen Punkte zurück. Die einfachste Lösung besteht darin, die Punktwolke mit L1-, L2- und L3-Feldern zu definieren und Ihre ursprüngliche Punktwolke auf diesen Typ zu kopieren und dann über die Wolke zu iterieren und die Beschriftung von etikettierte_cloud zu kopieren.

so etwas wie

pcl::PointCloud<your_custom_point_type_with_L1_L2_L3> combined_cloud; 
pcl::copyPointCloud(original_cloud, combined_cloud); 

for (int i = 0; i < labeled_cloud->point.size(); i++){ 
    combined_cloud[i].label3 = labeled_cloud[i].label; 
} 
+0

Vielen Dank für Ihre Antwort. Ich dachte an diese Lösung, es ist einfach, aber nicht sicher. Denn wenn während des Supervoxle-Prozesses einer der ursprünglichen Punkte entfernt wird oder NaN-Werte vorhanden sind oder aus irgendeinem anderen Grund die Reihenfolge geändert wird, macht das Kopieren von Etiketten ein Durcheinander. – Bruce

+0

Aber filtert es Nan Werte aus? Ich denke es nicht. Wenn Sie in Ihrem Beispiel die Punktwolke milk_cartoon_all_small_clorox.pcd betrachten, scheint diese die Punkte nan (xyz nan, color value exists) zu haben, und dennoch liefert die getLabeledCloud() -Methode genau die gleiche Menge an Punkten und diejenigen, die xyz-Daten haben sind die Spiele. – Rooscannon

+0

Hinzufügen Std :: Cout << cloud-> Punkte [0] << "\ n" << cloud-> Punkte [1] << "\ n"; im Beispielcode und es wird (nan, nan, nan - 18,23,9,0) auszudrucken (nan, nan, nan - 18,21,11,0) nicht entfernt Ihre Implementierung Punkte? – Rooscannon

Verwandte Themen