首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从另一个点云生成点云

从另一个点云生成点云
EN

Stack Overflow用户
提问于 2017-08-21 11:06:29
回答 3查看 2.6K关注 0票数 3

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

代码语言:javascript
复制
pcl::PointCloud<pcl::PointXYZL>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZL>);

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

代码语言:javascript
复制
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)"错误。我在想问题出在哪里?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-21 12:49:50

您正在索引到还没有大小的cloud1存储向量。您不能这样做,因为ll是超出界限的,这就是它分割错误的原因。您需要使用push_back追加一个新的点。

代码语言:javascript
复制
if (cloud->points[ii].label == 1)
{
  cloud1->push_back(cloud->points[ii]);
}
票数 1
EN

Stack Overflow用户

发布于 2017-08-21 12:41:32

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

代码语言:javascript
复制
    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
EN

Stack Overflow用户

发布于 2017-10-18 10:07:46

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

代码语言:javascript
复制
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) ...
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45795526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档