首页 文章

从另一个标记点 Cloud 生成点 Cloud

提问于
浏览
3

我有一个标记点 Cloud 数据( Cloud ),它的点包括“x”,“y”,“z”和“标签”信息,而标签可以是1,2或3 .

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

现在,我想根据他们的标签将这个点 Cloud 划分为3个单独的点 Cloud . 例如,我想生成一个点 Cloud ,它只包含那些标签为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)" 错误 . 我想知道问题出在哪里?

3 回答

  • 1

    您正在索引 cloud1 存储向量,因为 ll 超出范围,因此它不会发生错误,这就是它出错的原因 . 您需要使用 push_back 附加一个新点 .

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

    尝试在提供数据之前设置输出 Cloud 大小:

    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

    什么acraig5075说 . 但是,如果原始 Cloud 没有任何带有一个或多个标签的点,并且可能导致程序在运行时崩溃,则可能会出现空 Cloud .

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

相关问题