如何在open3dcpp中从数组创建点云



我正在使用open3d cpp来处理一些点云。然而,原始输入是一个浮点数组(比如float pts[3000],包含1000个点(,我没有找到将其转换为open3d::geometry::Pointcloud的有效方法,因为Pointcloud的唯一参数化构造函数是复制构造函数,并且只将std::vector<Eigen::Vector3d>作为输入。

我做了一个简单的转换器,但我认为它不是很有效,第一步是将浮点数组(大小为40000*3arr(转换为双数组,然后执行以下操作:

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。

相关内容

  • 没有找到相关文章

最新更新