【问题标题】:Creating a PCL point cloud using a container of Eigen Vector3d使用 Eigen Vector3d 容器创建 PCL 点云
【发布时间】:2013-06-12 07:33:20
【问题描述】:

我正在尝试生成 PCL 点云。我的所有观点都在以下容器类型中:

std::vector<Eigen::Vector3d,Eigen::aligned_allocator<Eigen::Vector3d> >

我想创建一个指向 PCL 点云的指针:

pcl::PointCloud<pcl::PointXYZ>::Ptr pc 

创建此点云的最有效方法是什么?

【问题讨论】:

    标签: eigen point-cloud-library


    【解决方案1】:

    由于 PCL 似乎使用 float[4] 来存储点,因此当您指定 pcl:PointXYZ 时,您必须单独复制每个元素(未测试):

    pc->points.resize( v.size() );
    for(size_t i=0; i<v.size(); ++i)
        pc->points[i].getVector3fMap() = v[i].cast<float>();
    

    如果您改用 vector4d 并确保每个元素的最后一个系数为 0,您可以执行 memcpy 甚至交换(有点技巧)。

    【讨论】:

    • 所以你的意思是,如果我有std::vector&lt;Eigen::Vector3f,Eigen::aligned_allocator&lt;Eigen::Vector3f&gt; &gt;,我可以直接打电话给pc-&gt;points = container 吗?
    • 啊...错过了您的原始问题使用了双精度。你需要一个演员在这里(更新的答案)。不,使用 Vector3f 仍然没有正确的内存布局。 Vector4f 会,但即便如此,您也需要一些技巧来直接分配容器。
    【解决方案2】:

    点云:

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

    矢量:

    std::vector<pcl::PointCloud<pcl::PointXYZ>, Eigen::aligned_allocator<pcl::PointXYZ> > vectorOfPointCloud;
    

    推回将点云添加到向量中:

    vectorOfPointCloud.push_back(*cloud);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2022-10-20
      • 1970-01-01
      相关资源
      最近更新 更多