如何使用 OpenVDB 进行最近点查询?

how to do closest point query using OpenVDB?

首先,如何使用openvdb找到最近点?

其次,如果 ClosestSurfacePoint 是正确的方法,如何使用它?

我阅读了有关使用 OpenVDB 实现更快 NNS 的 ICP 的论文。

(http://www.pmavridis.com/research/efficient_sparse_icp/)

作者说他用openvdb做NNS速度有提升

还有一些人以类似的方式取得了同样的成就。

所以,我想自己尝试一下。

经过多次尝试,终于编译成功了。

但是,我有点困惑。

在我看来(在阅读了包括在线食谱在内的大量文档之后)采样器似乎做到了这一点

所以,我尝试了这些例子。

GridType::ConstAccessor accessor = grid.getConstAccessor();
GridType::ValueType v0 = openvdb::tools::PointSampler::sample(accessor, ijk);
GridType::ValueType v1 = openvdb::tools::BoxSampler::sample(accessor, ijk);
GridType::ValueType v2 = openvdb::tools::QuadraticSampler::sample(accessor, ijk);

我做了下面描述的事情

object: 在网格中找到离查询点最近的点(ijk)

  1. 创建点(或加载点)并转换成vec3d格式
  2. 制作点索引网格。
  3. 设置查询点(ijk)
  4. 设置索引网格的访问器
  5. 点采样器函数调用()

但是,这些示例显示 0 或 1。

如果它找到完全相同的位置,它 return 1。 如果不是,0.

可能这个点采样器不是我要找的。

换个方式试试。

其他候选人是

 ClosestSurfacePoint, ClosestPointProjector.

我尝试了下面写的代码 它类似于 betajippity 的作品 https://github.com/betajippity/Ariel/blob/master/src/grid/levelset.cpp

但由于向量

而出错
std::vector<openvdb::Vec3s> positions = {
        { 1, 1, 1 },
        { 1, 2, 1 },
        { 2, 1, 1 },
        { 2, 2, 1 },
        { 100, 100, 100 },
        { 100, 101, 100 }
    };

myPointList pointlist(positions);

const float voxelSize(1.0);
openvdb::math::Transform::Ptr transform(openvdb::math::Transform::createLinearTransform(voxelSize));

openvdb::tools::PointIndexGrid::Ptr vdbgrid =
    openvdb::tools::createPointIndexGrid<openvdb::tools::PointIndexGrid>(pointlist, *transform);

openvdb::FloatGrid vdbgrid;


openvdb::util::NullInterrupter n;
std::vector<float> distances;


openvdb::tools::ClosestSurfacePoint<openvdb::tools::PointIndexGrid> csp;

csp.initialize(*vdbgrid, 0.0f, &n);

最后一行

csp.initialize(*vdbgrid, 0.0f, &n);

导致调试断言失败。

File: C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\vector
Line: 72

Expression: vector iterator not dereferencable

我不知道如何处理这些事情。

因为我不能修改openvdb的里面。我刚刚调用了函数,它出错了:(

如果您对此有任何想法,请提供帮助。

同样,问题是..

如何使用 openvdb 找到最近点?

如果 ClosestSurfacePoint 是正确的方法,如何使用它?

非常感谢您。

OpenVDB 点开发者的回答。


这是个好问题, 我会尝试回答这个问题。

简而言之,是和不是。 OpenVDB Points 是进行最近邻搜索的理想基础数据结构,因为它已经在空间上进行了组织,

但是我们还没有提供任何高级 API 来为您做这件事,所以您必须自己编写大部分算法。

由于网格的空间性质, 进行最近邻搜索相对简单且速度非常快,其中您有一个 "maximum radius" 用于搜索的搜索不是太大,因为您可以调整体素的大小以匹配此半径并最大化性能。

执行任意距离的最近邻搜索更具挑战性,我建议你会发现如果不编写支持框架(例如 kd-树)。

尽管我们尝试过最近邻算法, 因此,如果我的总结没有打扰您,我们很乐意在这里为您指明有关实施的正确方向。 :)

谢谢, 旦