2013-06-15 2 views
5

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

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

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

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

Что бы наиболее эффективным способом для создания этого облака точек?

ответ

3

Поскольку PCL кажется использовать поплавок [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 или даже своп (с небольшим количеством обмана).

+0

Так вы имеете в виду, если бы я был 'зЬй: : vector > 'вместо этого, могу ли я просто вызвать' pc-> points = container'? –

+0

ах ... пропустил, что ваш оригинальный вопрос использовал двойной. Вам нужен актерский состав (обновленный ответ). И нет, использование Vector3f все равно не будет иметь правильную макет памяти. Vector4f, но даже тогда вам понадобились некоторые трюки для непосредственного назначения контейнера. – Jakob

-1

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

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

Vector:

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

Push-обратно, чтобы добавить облака точек в вектор:

vectorOfPointCloud.push_back(*cloud); 
Смежные вопросы