PCL使用共享指针时,是否会复制

pcl use of shared pointers, does it make copies?

本文关键字:是否 复制 指针 共享 PCL      更新时间:2023-10-16

所以我一直在使用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的指针,这肯定有点?

所以我说要注意的那行,如果你移动它,使modelLine2outlierCloud填写后被定义,那么它工作得很好。同样的例子,同样的东西。

这表明我,pcl正在采取这个云的深拷贝,即使它请求一个共享指针到它?这不是很糟糕吗?没有范围变化或任何有趣的事情发生在我的结束,所以为什么我必须创建modelLine2后,数据已经在云中填写?

没有深度复制,但是SampleConsusModel的构造函数内部调用它的setInputCloud方法,该方法存储(如预期的那样)指向云的指针,并且将要使用的点的索引集的大小调整为当前云的大小(在您的情况下为0)。所以指针是正确的,但模型使用0索引为它所指向的云。

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