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

时间:2016-11-17 08:56:57

标签: c++ vector openvdb

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

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

我使用OpenVDB阅读有关ICP的论文以获得更快的NNS。

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

作者说他通过在NNS上使用openvdb来提高速度。

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

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

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

然而,我有点困惑。

在我的观点中(在阅读了很多文档,包括在线食谱之后),采样器似乎这样做了

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

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);

我做了如下所述的事情

对象:找到最靠近查询点(ijk)的网格中的点

  1. 创建点(或加载点)并转换为vec3d格式
  2. 制作点索引网格。
  3. 设置查询点(ijk)
  4. 设置索引网格的访问者
  5. 点采样器()的函数调用
  6. 但是,这些例子显示0或1。

    如果找到完全相同的位置,则返回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);
    

    导致Debug Assertion失败。

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

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

    因为我无法修改openvdb的内部。我刚刚调用函数,它会出错:(

    如果您对此有任何疑问,请提供帮助。

    同样,问题是......

    如何使用openvdb找到最近的点?

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

    我提前感谢你。

1 个答案:

答案 0 :(得分:1)

来自OpenVDB的回答是开发人员。

这是一个很好的问题,  我试着回答这个问题。

简而言之,是的,不是。 OpenVDB Points是一个理想的基本数据结构,用于进行最近邻搜索,因为它已经是空间组织的,

但是我们还没有为您提供任何高级API,因此您必须自己编写大部分算法。

由于网格的空间特性, 它是一个相对简单和快速的最近邻搜索,你有一个&#34;最大半径&#34;在其中搜索不会太大,因为您可以调整体素的大小以匹配此半径并最大化性能。

执行任意距离最近邻搜索更具挑战性,我建议你在没有编写支持框架(例如kd-)的情况下发现难以从数据结构中获得不错的性能树)。

我们尝试过最近邻算法, 因此,如果我没有将您的摘要告诉您,我们很乐意在此向您指出有关实施的正确方向。 :)

谢谢, 丹