#shared-ptr #memcpy #point-cloud-library #point-clouds
#общий ptr #memcpy #облако точек-библиотека #облака точек
Вопрос:
Я пытаюсь оптимизировать свой код, который уже работает, но включает в себя несколько глубоких копий моих данных. Что я пытаюсь сделать, так это скопировать pointcloud с устройства, структура которого определена в struct MyPointType {…}, в pcl::Pointcloud<>::ptr, чтобы я мог использовать функции pcl.
Поэтому я выделяю память и записываю данные в массив, называемый «точки». Создание нового 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. Я думаю, было бы неплохо, если бы вы зарезервировали свои баллы перед отправкой push_back..
cloudPCLptr->points.resize(zividCloud.size())
2. Вы имеете в виду, что это было бы полезно для среды выполнения? Я знаю, что это правда и работает (см. Ответ ниже). Мой вопрос был направлен на то, как найти обходной путь для цикла for. memcpy выполнил свою работу
Ответ №1:
На всякий случай, если кому-то интересно, решение оказалось довольно простым:
- просто создайте новый 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(amp;(cloudPCLptr2->points[0]), zividCloud.dataPtr(), nbrOfBytes);