2013-06-15 24 views
5

Próbuję wygenerować chmurę punktów PCL. Wszystkie moje punkty są w poniższej typu pojemnika:Tworzenie chmury punktów PCL przy użyciu kontenera Eigen Vector3d

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

Chciałbym utworzyć wskaźnik do PCL chmury punktów:

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

Jaki byłby najbardziej skuteczny sposób, aby stworzyć tę chmurę punktów?

Odpowiedz

3

Od PCL wydaje się używać pacy [4], aby zapisać punkty, gdy podasz PCL: PointXYZ, trzeba będzie skopiować każdy element osobno (nie testowane):

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

jeśli stosuje się vector4d zamiast tego i zapewnił, że ostatni współczynnik każdego elementu wynosi 0, można zrobić memcpy lub nawet zamienić (z odrobiną oszustwa).

+0

Więc to znaczy, gdybym miał 'std: : wektor > 'zamiast, czy mogę po prostu wywołać' pc-> points = container'? –

+0

ah ... przegapiłem, że twoje pierwotne pytanie użyło podwójnego. Potrzebujesz tutaj obsady (zaktualizowana odpowiedź). I nie, używanie Vector3f nadal nie miałoby odpowiedniego układu pamięci. Vector4f byłby, ale nawet wtedy potrzebowałeś kilku sztuczek, aby przypisać kontener bezpośrednio. – Jakob

-1

chmur punktów:

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-back, aby dodać chmury punktów do wektora:

vectorOfPointCloud.push_back(*cloud);