使用 memcpy 将点存储到 pcl::PointCloud<PointT>::ptr
Use memcpy to store points into pcl::PointCloud<PointT>::ptr
我正在尝试优化我的代码,该代码已经在运行但包含我的数据的多个深层副本。我想做的是从具有在 struct MyPointType {...} 中定义的结构的设备复制点云到 pcl::Pointcloud<>::ptr 这样我就可以使用 pcl 函数.
因此我分配内存并将数据 memcpy 到一个名为 "points" 的数组中。为每个元素创建一个新的 pcl:Pointcloud 和 push_back 效果很好,但也有很多开销。所以我想知道是否有一种方法可以为 pcl::PointCloud 分配足够的内存,然后直接将我的原始数据从设备 memcopy 到 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]);
}
我希望这是有道理的,如果有人能给我一些建议就太好了。谢谢:)
以防万一有人感兴趣,结果证明解决方案非常简单:
- 只需创建一个新的 pcl::PointCloud
- 因为这是 boost::shared_ptr 类型,您可以通过取消引用来像访问常规指针对象一样访问元素
- 我误以为 pcl::PointCloud 不是 std::vector,相反它是 class,它有一个 std::vector 作为它存储的点的成员变量,因此需要对点而不是元素本身调用 resize() 操作
只需 memcpy 到第一个元素的指针并定义要复制的字节大小
pcl::PointCloud<MyPointType>::Ptr cloudPCLptr2(new pcl::PointCloud<MyPointType>);
cloudPCLptr2->points.resize(nbrOfElements);
memcpy(&(cloudPCLptr2->points[0]), zividCloud.dataPtr(), nbrOfBytes);
我正在尝试优化我的代码,该代码已经在运行但包含我的数据的多个深层副本。我想做的是从具有在 struct MyPointType {...} 中定义的结构的设备复制点云到 pcl::Pointcloud<>::ptr 这样我就可以使用 pcl 函数.
因此我分配内存并将数据 memcpy 到一个名为 "points" 的数组中。为每个元素创建一个新的 pcl:Pointcloud 和 push_back 效果很好,但也有很多开销。所以我想知道是否有一种方法可以为 pcl::PointCloud 分配足够的内存,然后直接将我的原始数据从设备 memcopy 到 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]);
}
我希望这是有道理的,如果有人能给我一些建议就太好了。谢谢:)
以防万一有人感兴趣,结果证明解决方案非常简单:
- 只需创建一个新的 pcl::PointCloud
- 因为这是 boost::shared_ptr 类型,您可以通过取消引用来像访问常规指针对象一样访问元素
- 我误以为 pcl::PointCloud 不是 std::vector,相反它是 class,它有一个 std::vector 作为它存储的点的成员变量,因此需要对点而不是元素本身调用 resize() 操作
只需 memcpy 到第一个元素的指针并定义要复制的字节大小
pcl::PointCloud<MyPointType>::Ptr cloudPCLptr2(new pcl::PointCloud<MyPointType>); cloudPCLptr2->points.resize(nbrOfElements); memcpy(&(cloudPCLptr2->points[0]), zividCloud.dataPtr(), nbrOfBytes);