【问题标题】:PCL replace point clouds with pointers?PCL用指针替换点云?
【发布时间】:2015-02-09 02:41:01
【问题描述】:

我有一个定义为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_;

};

【问题讨论】:

    标签: c++ point-cloud-library


    【解决方案1】:

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

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

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

    既然你知道你需要通过它的指针来处理点云,你应该有一个pcl::PointCloud&lt;pcl::PointXYZI&gt;::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_;
    
    };
    

    【讨论】:

    • 感谢您的精彩解释 - 当我试图理解文档时,它说它在某处制作了深层副本。希望我能不止一次地投票。
    • 您指的是哪个特定文档?我们可能会对其进行改进以避免将来出现混淆。
    • ".. 请注意,执行的是深拷贝.." docs.pointclouds.org/1.7.1/classpcl_1_1_point_cloud.html.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 2017-10-30
    • 2015-11-16
    相关资源
    最近更新 更多