2017-08-21 2 views
2

J'ai un nuage de points étiqueté (nuage) dont les points comprennent les informations "x", "y", "z" et "label" alors que l'étiquette peut être 1,2 ou 3.Génération d'un nuage de points à partir d'un autre nuage de points

pcl::PointCloud<pcl::PointXYZL>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZL>); 

Maintenant, je veux diviser ce nuage de points en 3 points distincts selon leur étiquette. par exemple Je veux générer un nuage de points qui inclut uniquement les informations x, y, z des points dont l'étiquette est 1 (cloud1). Je l'ai fait:

int ll=0; 

pcl::PointCloud<pcl::PointXYZL>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZL>); 

for (int ii = 0; ii < cloud->points.size(); ++ii){ 
if(cloud->points[ii].label==1) 
{ 

    cloud1->points[ll].x=cloud->points[ii].x; 
    cloud1->points[ll].y=cloud->points[ii].y; 
    cloud1->points[ll].z=cloud->points[ii].z; 
    ll++; 

} 
} 

for (int ii = 0; ii < cloud->points.size(); ++ii){ 
{ 

cloud1->points[ll].x=cloud->points[ii].x; 
cloud1->points[ll].y=cloud->points[ii].y; 
    cloud1->points[ll].z=cloud->points[ii].z; 
ll++; 
} 
} 

Mais j'ai reçu "Segmentation fault (core dumped)" erreur. Je me demandais où est le problème?

Répondre

1

Vous l'indexation dans le vecteur de stockage cloud1 qui n'a pas encore de taille. Vous ne pouvez pas faire cela parce que ll est hors limites, ce qui explique pourquoi les défauts de segmentation. Vous devez ajouter un nouveau point en utilisant push_back.

if (cloud->points[ii].label == 1) 
{ 
    cloud1->push_back(cloud->points[ii]); 
} 
1

Définissez la taille du nuage de sortie avant de lui donner des données:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZ>); 
    // Fill in the cloud data 
    cloud1 ->width = cloud->width; 
    cloud1 ->height = cloud->height; 
    cloud1 ->is_dense = false; 
    cloud1 ->points.resize(cloud->width * cloud->height); 

    for (size_t i = 0; i < cloud->points.size(); ++i) 
    { 
     cloud1 ->points[i].x = cloud->at(i).x; 
     cloud1 ->points[i].y = cloud->at(i).y; 
     cloud1 ->points[i].z = cloud->at(i).z; 
    } 
1

Ce que dit acraig5075. Cependant, vous pouvez avoir des nuages ​​vides si votre nuage d'origine n'a pas de points avec une ou plusieurs étiquettes, ce qui peut entraîner le blocage du programme pendant l'exécution.

pcl::PointCloud<pcl::PointXYZL>::Ptr cloud1 (new pcl::PointCloud<pcl::PointXYZL>); 
pcl::PointCloud<pcl::PointXYZL>::Ptr cloud2 (new pcl::PointCloud<pcl::PointXYZL>); 
pcl::PointCloud<pcl::PointXYZL>::Ptr cloud3 (new pcl::PointCloud<pcl::PointXYZL>); 

for(int ii = 0; ii < cloud->size(); ii++){ 
    if(cloud->points[ii].label==1){ 
     cloud1->push_back(cloud->points[ii]); 
    } 
    if(cloud->points[ii].label==2){ 
     cloud2->push_back(cloud->points[ii]); 
    } 
    if(cloud->points[ii].label==3){ 
     cloud3->push_back(cloud->points[ii]); 
    } 
} 
if(cloud1->size() > 0) ...