1

まず、openvdb を使用して最も近いポイントを見つける方法は?

第二に、それClosestSurfacePointを行う正しい方法がある場合、それをどのように使用するのですか?

NNS を高速化するために OpenVDB を使用した ICP に関する論文を読みました。

( http://www.pmavridis.com/research/effective_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. point sampler() の関数呼び出し

ただし、これらの例は 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それを行う正しい方法である場合、それをどのように使用しますか?

よろしくお願いします。

4

1 に答える 1

1

OpenVDB ポイント開発者からの回答。


それは良い質問です、私はこれに答えようとします。

要するに、イエスとノーです。OpenVDB Points は、既に空間的に編成されているため、最近傍検索を行うための理想的な基本データ構造です。

ただし、これを行うための高レベル API はまだ提供されていないため、アルゴリズムの多くを自分で作成する必要があります。

グリッドの空間的性質により、ボクセルのサイズを調整して一致させることができるため、検索する「最大半径」が大きすぎない最近傍検索を行うのは比較的簡単で非常に高速です。この半径でパフォーマンスを最大化します。

任意の距離の最近傍検索を実行するのははるかに困難です。サポートするフレームワーク (kd ツリーなど) を作成しないと、データ構造から適切なパフォーマンスを引き出すのは難しいと思われることをお勧めします。

ただし、最近傍アルゴリズムを試みたので、その要約であなたを先延ばしにしていない場合は、実装に関してここで正しい方向に向けていただければ幸いです. :)

ありがとう、ダン


于 2016-11-26T03:52:43.573 に答える