PCL使用共享指针时,是否会复制
pcl use of shared pointers, does it make copies?
所以我一直在使用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
的指针,这肯定有点?
所以我说要注意的那行,如果你移动它,使modelLine2
在outlierCloud
填写后被定义,那么它工作得很好。同样的例子,同样的东西。
这表明我,pcl
正在采取这个云的深拷贝,即使它请求一个共享指针到它?这不是很糟糕吗?没有范围变化或任何有趣的事情发生在我的结束,所以为什么我必须创建modelLine2
后,数据已经在云中填写?
没有深度复制,但是SampleConsusModel的构造函数内部调用它的setInputCloud方法,该方法存储(如预期的那样)指向云的指针,并且将要使用的点的索引集的大小调整为当前云的大小(在您的情况下为0
)。所以指针是正确的,但模型使用0
索引为它所指向的云。
作为一种解决方法,您可以在outlierCloud
填充后自己调用setInputCloud
。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- C++矢量复制构造函数和赋值运算符是否也复制保留空间?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将不可复制的成员用作使对象不可复制的替代方法?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如果这不是类的"复制构造函数",是否可以移动对象?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 为什么复制构造函数不需要检查输入对象是否指向自身?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 如何检查文件是否复制成功?(便携式解决方案)C++
- 在此示例中,向量是否复制了两次
- 修改时是否复制C++中的字符串
- OpenMP 是否复制私有对象
- STL 集合的插入方法是否复制传递对象的值?
- 继承中的基类是否复制到派生类
- 在结构中复制构造函数:是否复制数组
- 成员初始化列表是否复制字符串C++
- 这是否复制了矢量
- Mat::p ush_back(x) 是否复制 x 元素