C++ pcl使用共享指针,是否复制?

C++ pcl使用共享指针,是否复制?,c++,shared-ptr,point-cloud-library,C++,Shared Ptr,Point Cloud Library,因此,我一直在使用pclSampleConsensus模块进行一些线拟合,我发现pcl点云的使用非常奇怪。我目前正在搜索最突出的线条,然后我只从云中检索异常值,并再次搜索 因此,要在云上执行ransac,请假设我有一些设置: pcl::PointCloud<pcl::PointXYZ>::Ptr dataCloud(shared_ptr_cloud_from_elsewhere); pcl::PointCloud<pcl::PointXYZ>::Ptr outlierCl

因此,我一直在使用
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);
所以
ransac.compute()
失败了,但为什么呢
modelLine2
已定义,并且有一个指向云
outlierCloud
的指针,该云肯定有点

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


这向我表明,
pcl
正在获取此云的深度副本,即使它请求一个指向它的共享指针?这不是很糟糕吗?在我这方面没有范围变化或任何有趣的事情发生,那么为什么我必须在数据填充到云中后创建
modelLine2

没有进行深度复制,但是SampleConsusModel的内部调用其存储的方法(如预期的那样)指向云和的指针将要使用的点的索引集调整为云的当前大小(在您的情况下调整为
0
)。因此,指针是正确的,但模型对它所指向的云使用
0
索引

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

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