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

时间:2014-06-12 04:39:38

标签: c++ shared-ptr point-cloud-library

所以我一直在使用pcl SampleConsensus模块做一些线条拟合,我发现pcl点云用法非常奇怪。我目前正在寻找最突出的线路,然后我再次检索云中的异常值和ransac。

所以在云上执行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,它肯定有点?

所以我说要注意这一行,如果你移动它以便在modelLine2填写后定义outlierCloud那么它就可以了。同样的例子。

这告诉我pcl正在对此云进行深层复制,即使它请求共享指针?难道这不是很疯狂吗?在我的结尾没有范围更改或任何有趣的事情发生,为什么我必须在云中填充数据后创建modelLine2

1 个答案:

答案 0 :(得分:1)

没有进行深层复制,但SampleConsusModel的constructor在内部调用其setInputCloud方法,该方法存储(如预期)指向云的指针,调整索引集的大小用于云的当前大小的点数(在您的情况下为0)。所以指针是正确的,但模型使用0索引指向它所指向的云。

作为一种解决方法,您可以在setInputCloud填写后自行致电outlierCloud