2017-08-21 3 views
2

Ich habe eine beschriftete Punktwolkendaten (Wolke), deren Punkte "x", "y", "z" und "label" Information enthalten, während die Beschriftung 1,2 oder sein kann 3.Generieren einer Punktwolke aus einer anderen beschrifteten Punktwolke

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

Jetzt möchte ich diese Punktwolke auf 3 separate Punktwolke entsprechend ihrer Bezeichnung teilen. zum Beispiel möchte ich eine Punktwolke generieren, die nur die x, y, z Informationen der Punkte enthält, deren Label 1 (cloud1) ist. Ich habe diese:

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++; 
} 
} 

Aber ich erhielt "Segmentation fault (core dumped)" Fehler. Ich habe mich gefragt, wo ist das Problem?

Antwort

1

Sie die Indizierung in cloud1 Speichervektor, der nicht mit einer Größe noch hat. Sie können das nicht tun, weil ll außerhalb der Grenzen liegt, weshalb es Segmentierungsfehler gibt. Sie müssen einen neuen Punkt mit push_back anhängen.

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

Versuchen Sie, die Ausgabe Wolkengröße einstellen, bevor es Daten geben:

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

Was acraig5075 sagte. Sie haben jedoch möglicherweise leere Wolken, wenn Ihre ursprüngliche Cloud keine Punkte mit einem oder mehreren Labels aufweist und das Programm während der Laufzeit möglicherweise abstürzt.

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) ... 
Verwandte Themen