如何使用 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)
- 创建点(或加载点)并转换成vec3d格式
- 制作点索引网格。
- 设置查询点(ijk)
- 设置索引网格的访问器
- 点采样器函数调用()
但是,这些示例显示 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-树)。
尽管我们尝试过最近邻算法,
因此,如果我的总结没有打扰您,我们很乐意在这里为您指明有关实施的正确方向。 :)
谢谢,
旦
首先,如何使用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)
- 创建点(或加载点)并转换成vec3d格式
- 制作点索引网格。
- 设置查询点(ijk)
- 设置索引网格的访问器
- 点采样器函数调用()
但是,这些示例显示 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-树)。
尽管我们尝试过最近邻算法, 因此,如果我的总结没有打扰您,我们很乐意在这里为您指明有关实施的正确方向。 :)
谢谢, 旦