我正在使用open3d cpp来处理一些点云。然而,原始输入是一个浮点数组(比如float pts[3000]
,包含1000个点(,我没有找到将其转换为open3d::geometry::Pointcloud
的有效方法,因为Pointcloud
的唯一参数化构造函数是复制构造函数,并且只将std::vector<Eigen::Vector3d>
作为输入。
我做了一个简单的转换器,但我认为它不是很有效,第一步是将浮点数组(大小为40000*3
的arr
(转换为双数组,然后执行以下操作:
long t01 = CurrTimeMS;
Eigen::Vector3d *vv = reinterpret_cast<Eigen::Vector3d *>(arr);
vector<Eigen::Vector3d> vec(vv, vv+40000);
geometry::PointCloud pcd(vec);
long t02 = CurrTimeMS;
std::cout << "pcd init took " << t02-t01 << " ms.n";
cout << (void *) vv << " " << (void *) vec.data() << " " << (void *) pcd.points_.data() << endl;
结果我花了3-4ms,因为std::vector(T *start, T *end)
也是一个复制构造函数,所以这段代码要复制3次内存(三个地址都不同(,这不是最优的
是否有更有效的方法直接从内存创建Pointcloud?
我最终找到了一种相对有效的方法。
std::shared_ptr<open3d::geometry::PointCloud> convert2pcd(float *data, size_t N, size_t dim=3) {
assert(dim > 2);
double *dd = new double[N*3];
for (int i = 0; i < N; ++i) {
for (int j = 0; j < 3; ++j) {
dd[i*3+j] = (double) data[i*dim+j];
}
}
Eigen::Vector3d *vv = reinterpret_cast<Eigen::Vector3d *>(dd);
auto pcd = std::make_shared<open3d::geometry::PointCloud>();
pcd->points_.assign(vv, vv+N);
delete[] dd;
return pcd;
}
这仍然需要我大约2-3ms。