从另一个标记点​​云生成点云

Generating a point cloud from another labeld point cloud

我有一个带标签的点云数据(cloud),它的点包括"x"、"y"、"z"和"label"信息,而label可以是1,2或 3.

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

现在,我想根据标签将这个点云分成 3 个独立的点云。 例如,我想生成一个点云,它只包含标签为 1 (cloud1) 的那些点的 x、y、z 信息。 我这样做了:

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

但是我收到 "Segmentation fault (core dumped)" 错误。请问是哪里出了问题?

尝试在给它数据之前设置输出云的大小:

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

您正在索引 cloud1 尚无大小的存储向量。你不能这样做,因为 ll 超出范围,这就是它分段错误的原因。您需要使用 push_back 添加一个新点。

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

acraig5075 说的。但是,如果您的原始云没有任何带有一个或多个标签的点,您可能会有空云,这可能会导致程序在 运行 时间内崩溃。

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