gpt4 book ai didi

c++ - pcl 使用共享指针,它会复制吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:20 27 4
gpt4 key购买 nike

所以我一直在使用 pcl SampleConsensus 模块来做一些线拟合,我发现 pcl 点云的使用非常奇怪.我目前正在搜索以找到最突出的线,然后我只从云中检索异常值并再次搜索它。

所以要在云上执行 ransac 说我有一些设置:

pcl::PointCloud<pcl::PointXYZ>::Ptr dataCloud(shared_ptr_cloud_from_elsewhere);
pcl::PointCloud<pcl::PointXYZ>::Ptr outlierCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr modelLine(
new pcl::SampleConsensusModelLine<pcl::PointXYZ>(dataCloud));

//Pay careful attention to line below because its position determines
//if the code is going to work or not
pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr modelLine2(
new pcl::SampleConsensusModelLine<pcl::PointXYZ>(outlierCloud));

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(modelLine);
ransac.compute();
ransac.inliers(inliers);

使用 ExtractIndices,我从异常值列表的负值中检索异常值,并将它们放在 outlierCloud 中。 outlierCloud 已经过检查,其中肯定有分数。然后,我所要做的就是更改 ransac 正在使用的模型,然后重新开始:

ransac.setSampleConsensusModel(modelLine2)
ransac.compute(); //This will fail, due to having no points.

所以 ransac.compute() 失败了,但为什么呢? modelLine2 被定义并且有一个指向云的指针 outlierCloud 肯定有点?

所以我说要注意的那一行,如果你移动它以便在填写 outlierCloud 之后定义 modelLine2 那么它就可以正常工作。同样的例子,一切都一样。

这向我暗示 pcl 正在获取此云的深层拷贝,即使它请求指向它的共享指针?这不是太糟糕了吗?我这边没有范围变化或任何有趣的事情发生,那么为什么我必须在数据填充到云端后创建 modelLine2

最佳答案

除了constructor 没有进行深拷贝SampleConsusModel 内部调用其 setInputCloud存储(如预期)指向云的指针并调整索引集要使用的点的当前大小的方法(到0 在你的情况下)。所以指针是正确的,但模型使用 0 索引表示它指向的云。

作为解决方法,您可以在填充 outlierCloud 后自行调用 setInputCloud

关于c++ - pcl 使用共享指针,它会复制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24176522/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com