Създаване на 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