use*_*135 1 c++ stl point-cloud-library
我将给出一些关于我为什么要这样做的背景,但最终可以忽略上下文,因为它主要是经典的计算机科学和C++问题(之前肯定已经问过,但是几个粗略的搜索什么都没发现......)
我正在使用(大型)实时流点云,并且我需要从多个传感器中获取2/3/4点云并将它们粘在一起以创建一个大点云.我实际上需要在一个结构中需要所有数据,而通常当人们只是可视化点云时,他们可以将它们分别送入查看器.
我正在使用Point Cloud Library 1.6,仔细观察它的PointCloud类(<pcl/point_cloud.h>如果你感兴趣的话)将所有数据点存储在STL向量中.
现在我们又回到了香草CS的土地......
PointCloud有一个+ =运算符,用于将一个点云的内容添加到另一个点云.到现在为止还挺好.但是这种方法效率很低 - 如果我理解正确的话,它1)调整目标矢量的大小,然后2)运行另一个矢量中的所有点,然后复制它们.
这看起来就像O(n)时间复杂度的情况,通常可能不会太糟糕,但是当实时处理每个云至少300K点时是个坏消息.
向量不需要进行排序或分析,它们只需要在内存级别"粘在一起",因此程序知道一旦它到达第一个向量的末尾,它就必须跳转到起始位置第二个.换句话说,我正在寻找O(1)向量合并方法.在STL中有没有办法做到这一点?或者更像是std :: list#splice这样的领域?
注意:这个课程是PCL非常重要的一部分,所以"非侵入性手术"更可取.如果需要对类本身进行更改(例如,从向量更改为列表,或保留内存),则必须根据对PCL其余部分的影响进行考虑,这可能是影响深远的.
更新:我已经在PCL的GitHub回购中提出了一个问题,以便与图书馆作者就下面的建议进行讨论.一旦有某种解决办法,我会接受相关的建议作为答案.
这个问题在使用String Rope类之前已经解决了很多次.
基本方法是创建一个存储指向点云的指针的新容器类型.这就像std :: deque,除了你的将拥有可变大小的块.除非你的云块变成标准尺寸?
使用这个新容器,迭代器从第一个块开始,一直到最后然后移动到下一个块.在具有可变大小的块的这种容器中进行随机访问需要二进制搜索.实际上,这样的数据结构可以写成B +树的扭曲形式.
没有矢量等价的拼接 - 没有,特别是因为内存布局要求,这可能是它首先被选中的原因.
也没有连接向量的恒定时间方法.
我可以想到一种(脆弱的)方法在常量时间内连接原始数组,但它依赖于它们在开始和结束时在页面边界上对齐,然后将它们重新映射为相邻.这很难概括.
还有另一种方法可以创建一个看起来像连接向量的东西,这是一个包装器容器,它像一个deque一样工作,并提供一个统一的迭代器和operator[]它们.我不知道点云库是否足够灵活,可以使用它.(Jamin的建议主要是使用类似这样的东西而不是矢量,Zan的大致是我的想法).