2013-06-15 43 views
5

Tôi đang cố gắng tạo một đám mây điểm PCL. Tất cả các điểm của tôi là trong các loại container sau đây:Tạo một đám mây điểm PCL bằng cách sử dụng một hộp chứa Eigen Vector3d

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

Tôi muốn tạo ra một con trỏ đến một đám mây điểm PCL:

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

Điều gì sẽ là cách hiệu quả nhất để tạo ra đám mây điểm này?

Trả lời

3

Kể từ PCL dường như sử dụng một float [4] để lưu trữ các điểm, khi bạn chỉ định PCL: PointXYZ, bạn sẽ phải sao chép từng yếu tố riêng lẻ (không kiểm tra):

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

nếu bạn sử dụng một vector4d thay vào đó và đảm bảo rằng hệ số cuối cùng của mỗi phần tử là 0, bạn có thể làm một memcpy hoặc thậm chí là một trao đổi (với một chút thủ đoạn).

+0

Vì vậy, bạn có nghĩa là, nếu tôi đã có 'std: : vector > 'thay vào đó, tôi có thể chỉ đơn giản gọi là 'pc-> points = container'? –

+0

ah ... bỏ lỡ câu hỏi ban đầu của bạn đã sử dụng gấp đôi. Bạn cần một diễn viên ở đây (câu trả lời cập nhật). Và không, bằng cách sử dụng Vector3f vẫn sẽ không có bố cục bộ nhớ phù hợp. Vector4f sẽ, nhưng ngay cả sau đó bạn cần một số thủ thuật để chỉ định các container trực tiếp. – Jakob

-1

Point Cloud:

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

Vector:

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

Đẩy lùi thêm những đám mây điểm vào một vector:

vectorOfPointCloud.push_back(*cloud); 
Các vấn đề liên quan