2017-04-06 1 views
1

La fonction ci-dessous ne donne aucun résultat. En d'autres termes, le nombre de points dans le nuage de points est exactement le même qu'avant le sous-échantillonnage. J'ai essayé différents nombres pour la taille de feuille de 0.01 tout le chemin à ceux que vous voyez ci-dessous mais chacun d'eux produit le même résultat. J'ai dû cocher avec les conversions (comme vous le voyez ci-dessous) allant de pcl::PointCloud<T> à pcl::PCLPointCloud2 donc je soupçonne qu'ils pourraient le problème ici.Sous-échantillon PCL avec pcl :: VoxelGrid

S'il vous plaît laissez-moi savoir si vous aviez un problème similaire et résolu. Merci.

typedef pcl::PointCloud<pcl::PointXYZ>::Ptr PointCloudPtr; 

void PlantVis::downsample(PointCloudPtr cloud) { 
    pcl::PCLPointCloud2::Ptr cloud2(new pcl::PCLPointCloud2()); 
    pcl::toPCLPointCloud2(*cloud, *cloud2); 

    pcl::PCLPointCloud2::Ptr cloud_filtered(new pcl::PCLPointCloud2()); 

    pcl::VoxelGrid<pcl::PCLPointCloud2> sor; 
    sor.setInputCloud(cloud2); 
    sor.setLeafSize(500000000.01f, 500000000.01f, 500000000.01f); 
    sor.filter(*cloud_filtered); 

    pcl::PointCloud<pcl::PointXYZ>::Ptr m_cloud(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::fromPCLPointCloud2(*cloud_filtered, *m_cloud); 
    cloud = m_cloud; 
} 

Répondre

1

Pourquoi avez-vous besoin de toute la conversion? Essayez ceci:

void PlantVis::downsample(PointCloudPtr cloud) { 
    PointCloudPtr output(new pcl::PointCloud<pcl::PointXYZ>); 
    pcl::VoxelGrid<pcl::PointXYZ> sor; 
    sor.setInputCloud(input_cloud); 
    sor.setLeafSize(0.001f, 0.001f, 0.001f); 
    sor.filter(*output); 

    //display or do something else with output 
} 
+0

Merci. Votre code a montré quelque chose que j'ai oublié précédemment. – Illia

1

L'argument de votre fonction est un pointeur, même si vous avez modifié la valeur du pointeur, le nuage d'origine n'est pas affectée. Essayez d'utiliser la référence dans la définition de la fonction comme ceci

void PlantVis::downsample(PointCloudPtr &cloud)