2017-10-16 6 views
0

Je suis nouveau sur PCL (Point Cloud Library) et j'essayais d'implémenter supervoxel_clustering (this link) sur mon ensemble de données personnalisé. Mon jeu de nuages ​​de points a ces champs: X Y Z R G B L1 L2 où R, G, B sont integer valeurs entre 0-255 et L1 et L2 sont integer étiquettes.Conserver les champs personnalisés pendant le processus de clustering supervoxel dans la bibliothèque Point Cloud Library (PCL)

Après avoir appliqué supervoxel, je sauve les nuages ​​de points avec leurs étiquettes:

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

Ma question est: comment transférer mes étiquettes et couleurs à partir du point d'origine nuages ​​au cours du processus. J'essaie de définir mon propre type de point, quelque chose comme: X Y Z R G B L1 L2 L3, mais avec le tutoriel sur les types de points, il n'est pas trivial de le faire. Une solution fictive, je pense, utilise KD-tree et transférer des étiquettes de supervoxel résultat aux points d'origine, mais j'ai encore besoin de lire mes points d'origine avec tous les champs personnalisés dans pcl.

Quelqu'un peut-il m'aider?

Merci, Bruce

Répondre

1

Je comprends que vous avez déjà défini un type de point avec des champs L1 et L2.

Les points sortent du supervoxel_clustering dans le même ordre que celui dans lequel ils ont été placés et la méthode getLabeledCloud() renvoie tous les points d'origine. La solution la plus simple consiste à définir le nuage de points avec les champs L1, L2 et L3 et à copier votre nuage de points d'origine dans ce type, puis à parcourir le nuage et à copier l'étiquette à partir de label_cloud.

quelque chose comme

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

Merci pour votre réponse. Je pensais à cette solution, c'est facile mais pas sûr. Parce que si pendant le processus de supervoxle l'un des points d'origine sera supprimé, ou qu'il y aura des valeurs NaN, ou pour toute autre raison que l'ordre change, il suffit de copier les étiquettes pour créer un désordre. – Bruce

+0

Mais filtre-t-il les valeurs nan? Je pense que non. Si vous regardez le nuage de points milk_cartoon_all_small_clorox.pcd dans votre exemple, il semble avoir des points nan (xyz are nan, valeur de couleur existe) et pourtant la méthode getLabeledCloud() renvoie exactement le même nombre de points et ceux qui ont des données xyz sont les allumettes. – Rooscannon

+0

Ajouter std :: cout << cloud-> points [0] << "\ n" << cloud-> points [1] << "\ n"; dans le code exemple et il va imprimer (nan, nan, nan - 18,23,9,0) (nan, nan, nan - 18,21,11,0) Est-ce que votre remove de mise en œuvre points? – Rooscannon