PCL用指针替换点云?

时间:2015-02-06 23:08:20

标签: c++ point-cloud-library

我将点云定义为pcl::PointCloud<pcl::PointXYZI> cloud_xyzi_;。不久之后,我从一个文件中读取数据并将其推回到这个点云;一切正常。然而,我的任务要求我过滤点云,过滤方法需要指针。

我可以简单地用上面的pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzi_p;替换上面的声明,在类的构造函数中初始化它,然后自己有一个指针,而不是创建一个指针只是为了将它传递给函数?当然,当我使用它时,请将.更改为->。我问这个是因为我在尝试实现这个时遇到了意想不到的行为。

这是我的删节课程,目前的代码似乎都是多余的,而且效果不佳。

class P400toPointcloud {
public:
    P400toPointcloud():
    callback_counter_(0),
    sensor_model_created_(false)
    {
        // Setup pointers for later use
        cloud_xyzi_p = cloud_xyzi_.makeShared();
        cloud_xyzi_fp = cloud_xyzi_f.makeShared();
    }

    ~P400toPointcloud()
    {
    }


private:
    pcl::PointCloud<pcl::PointXYZI> cloud_xyzi_;
    pcl::PointCloud<pcl::PointXYZI> cloud_xyzi_f;
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzi_p;
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzi_fp;

    std::vector<unsigned int> value_idx_;

};

1 个答案:

答案 0 :(得分:3)

构造函数中的代码与您可能期望的代码具有不同的效果:

// Setup pointers for later use
cloud_xyzi_p = cloud_xyzi_.makeShared();
cloud_xyzi_fp = cloud_xyzi_f.makeShared();

makeShared()的调用为新的点云分配内存,复制旧点内容,将指向新云的指针包装到boost::shared_ptr并返回。实际上,您可以获得一个完全独立的副本,可以在接受指针的函数中使用。对其进行的任何修改都不会影响原始云。

由于您知道需要通过指针使用点云,因此您应该只有pcl::PointCloud<pcl::PointXYZI>::Ptr。但是不要忘记在构造函数中为它分配内存:

class P400toPointcloud {
public:
    P400toPointcloud():
    callback_counter_(0),
    sensor_model_created_(false),
    cloud_xyzi_(new pcl::PointCloud<pcl::PointXYZI>),
    cloud_xyzi_f(new pcl::PointCloud<pcl::PointXYZI>)
    {
        // From now on you pass
        //   cloud_xyzi_ to functions that expect pointer to a point cloud
        //   *cloud_xyzi_ to functions that expect (raw) point cloud
    }

    ~P400toPointcloud()
    {
    }

private:
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzi_;
    pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_xyzi_f;

    std::vector<unsigned int> value_idx_;

};