使用memcpy将点存储到pcl :: PointCloud <pointt> :: ptr

时间:2019-03-12 14:02:45

标签: shared-ptr memcpy point-cloud-library point-clouds

我正在尝试优化我的代码,该代码已经可以工作了,但是包含我的数据的多个深层副本。我要做的是将具有结构MyPointType {...}中定义的结构的设备中的点云复制到pcl :: Pointcloud <> :: ptr中,以便使用pcl函数。

因此,我分配了内存并将数据memcpy存入称为“点”的数组中。为每个元素创建一个新的pcl:Pointcloud和push_back可以正常工作,但也有很多开销。所以我想知道是否有一种方法可以为pcl :: PointCloud分配足够的内存,然后直接将我的原始数据从设备中复制到pcl :: PointCloud

当前我的代码如下:

// define my own point type
struct MyPointType
{
    float x;
    float y;
    float z;
    float contrast;
    uint32_t rgba;
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW   // make sure our new allocators are aligned
}   EIGEN_ALIGN16;                    // enforce SSE padding for correct memory alignment

// register it for usage in pcl functions
POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,
(float, x, x)
(float, y, y)
(float, z, z)
(float, contrast, contrast)
(uint32_t, rgba, rgba)
)


// memcpy of data
size_t maxSize = sizeof(MyPointType)* zividCloud.size();
MyPointType * points = (MyPointType*)malloc(maxSize);
memcpy(points, zividCloud.dataPtr(), maxSize);

// push the data piecewise into my pcl::PointCloud
pcl::PointCloud<MyPointType>::Ptr cloudPCLptr(new pcl::PointCloud<MyPointType>);
for (size_t i = 0; i < zividCloud.size(); i++)
{
    cloudPCLptr->push_back(points[i]);
}       

我希望这是有道理的,如果有人可以给我一些建议,那将是很好的。谢谢:)

1 个答案:

答案 0 :(得分:0)

只要有人感兴趣,解决方案就非常简单:

  • 只需创建一个新的pcl :: PointCloud
  • 由于这是boost :: shared_ptr类型,因此您可以通过取消引用来访问元素,就像常规指针对象一样
  • 我误解了pcl :: PointCloud不是std :: vector,但是相反,它是一个类,其中std :: vector作为其存储点的成员变量,因此resize()操作需要被称为点而不是元素本身
  • 仅将memcpy指向第一个元素的指针,并定义要复制的字节大小

    pcl::PointCloud<MyPointType>::Ptr cloudPCLptr2(new pcl::PointCloud<MyPointType>);
    cloudPCLptr2->points.resize(nbrOfElements);
    
    memcpy(&(cloudPCLptr2->points[0]), zividCloud.dataPtr(), nbrOfBytes);