Создание облака точек PCL с использованием контейнера Eigen Vector3d

Я пытаюсь создать облако точек PCL. Все мои точки находятся в следующем типе контейнера:

std::vector<Eigen::Vector3d,Eigen::aligned_allocator<Eigen::Vector3d> >

Я хотел бы создать указатель на облако точек PCL:

pcl::PointCloud<pcl::PointXYZ>::Ptr pc 

Какой самый эффективный способ создать это облако точек?


person Ammar Husain    schedule 15.06.2013    source источник


Ответы (2)


Поскольку PCL использует float[4] для хранения точек, когда вы указываете pcl:PointXYZ, вам придется копировать каждый элемент отдельно (не тестировалось):

pc->points.resize( v.size() );
for(size_t i=0; i<v.size(); ++i)
    pc->points[i].getVector3fMap() = v[i].cast<float>();

если вместо этого вы использовали vector4d и убедились, что последний коэффициент каждого элемента равен 0, вы могли бы сделать memcpy или даже своп (с небольшой хитростью).

person Jakob    schedule 17.06.2013
comment
Итак, вы имеете в виду, что если бы вместо этого у меня было std::vector<Eigen::Vector3f,Eigen::aligned_allocator<Eigen::Vector3f> >, мог бы я просто позвонить pc->points = container ? - person Ammar Husain; 18.06.2013
comment
ах ... пропустил, что в вашем исходном вопросе использовался двойной. Здесь вам нужен актерский состав (обновленный ответ). И нет, использование Vector3f по-прежнему не будет иметь правильной схемы памяти. Vector4f подойдет, но даже тогда вам понадобятся некоторые хитрости, чтобы назначить контейнер напрямую. - person Jakob; 21.06.2013

Облако точек:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

Вектор:

std::vector<pcl::PointCloud<pcl::PointXYZ>, Eigen::aligned_allocator<pcl::PointXYZ> > vectorOfPointCloud;

Нажмите назад, чтобы добавить облака точек в вектор:

vectorOfPointCloud.push_back(*cloud);
person user1031204    schedule 19.02.2015