メインコンテンツ

findNeighborsInRadius

点群内のクエリ点に対して特定の半径内にある近傍を検出する

説明

[indices,dists,numNeighbors] = findNeighborsInRadius(ptCloud,points,radius) は、入力点群内の 1 つ以上のクエリ点に対して特定の半径内にある近傍の indices を返します。ptCloud はアンオーガナイズド点群でもオーガナイズド点群でもかまいません。クエリ点に対して特定の半径内にある近傍は、Kd 木ベースの探索アルゴリズムを使用して計算されます。

[indices,dists,numNeighbors] = findNeighborsInRadius(ptCloud,points,radius,camMatrix) は、入力点群内の 1 つ以上のクエリ点に対して特定の半径内にある近傍を返します。入力点群は、深度カメラによって生成された、オーガナイズド点群です。クエリ点に対して特定の半径内にある近傍は、高速な近似近傍探索アルゴリズムを使用して決定されます。

関数はカメラ射影行列 camMatrix を使用して隣接する点の間の関係を把握するため、探索が高速化されます。ただし、結果の精度は Kd 木ベースのアプローチと比べて劣ります。

メモ

  • この構文では、RGB-D センサーによって生成された、オーガナイズド点群データのみがサポートされます。

  • estimateCameraMatrix を使用して、指定された点群データのカメラ射影行列を推定できます。

[indices,dists,numNeighbors] = findNeighborsInRadius(___,Name,Value) は、前の構文の入力引数に加えて、名前と値のペアの引数を 1 つ以上使用してオプションを指定します。

すべて折りたたむ

一連の 3 次元座標点をワークスペースに読み込みます。

load("xyzPoints.mat")

点群オブジェクトを作成します。

ptCloud = pointCloud(xyzPoints);

2 つのクエリ点と探索半径を指定します。

points = [0 0 0; 0 0 3];
radius = 0.5;

各クエリ点に対して、指定された半径内にある近傍を検出します。

[indices,dists,numNeighbors] = findNeighborsInRadius(ptCloud,points,radius);

インデックスの cell 配列を通常の配列に変換します。次に、これらのインデックスを使用して、入力点群から半径近傍を選択します。

indices = cell2mat(indices);
ptCloudB = select(ptCloud,indices);

点群を表示して、クエリ点と半径近傍を重ね合わせます。

figure
pcshow(ptCloud)
hold on
plot3(points(:,1),points(:,2),points(:,3),"*")
pcshow(ptCloudB.Location,"m")
legend("Point Cloud", ...
    "Query Point", ...
    "Radial Neighbors", ...
    Location="southoutside", ...
    Color=[1 1 1])
hold off

カメラ射影行列を使用して、オーガナイズド点群データ内のクエリ点の半径近傍を検出します。サンプリングされた点群データの点と対応するイメージ ポイント座標からカメラ射影行列を計算します。

オーガナイズド点群データをワークスペース内に読み込みます。Kinect 深度センサーを使用して点群が生成されます。

ld = load('object3d.mat');
ptCloud = ld.ptCloud;

点群データをサンプリングするためのステップ サイズを指定します。

stepSize = 100;

入力点群をサンプリングして、サンプリングされた 3 次元ポイント座標を点群オブジェクトとして格納します。

indices = 1:stepSize:ptCloud.Count;
tempPtCloud = select(ptCloud,indices);

サンプリングされた点群から無効な点を削除します。

[tempPtCloud,validIndices] = removeInvalidPoints(tempPtCloud);

入力点群の 3 次元ワールド ポイントの座標を定義します。

worldPoints = tempPtCloud.Location;

入力点群の 3 次元の点の座標に対応する 2 次元イメージ座標を検出します。

[Y,X] = ind2sub([size(ptCloud.Location,1),size(ptCloud.Location,2)],indices);
imagePoints = [X(validIndices)' Y(validIndices)'];

このイメージ ポイント座標とワールド ポイント座標からカメラ射影行列を推定します。

camMatrix = estimateCameraMatrix(imagePoints,worldPoints);

近傍を識別するクエリ点と半径を指定します。

point = [0.4 0.3 0.2];
radius = 0.05;

半径近傍のインデックスと距離を取得します。点群の select メソッドを使用して、近傍点の点群データを取得します。

[indices,dists] = findNeighborsInRadius(ptCloud,point,radius,camMatrix);
ptCloudB = select(ptCloud,indices);

点群とクエリ点の周囲で見つかった半径近傍を表示します。

figure
pcshow(ptCloud);
hold on;
pcshow(ptCloudB.Location, 'b');
legend('Point Cloud','Radial Neighbors','Location','southoutside','Color',[1 1 1] )
hold off;

Figure contains an axes object. The axes object contains 2 objects of type scatter. These objects represent Point Cloud, Radial Neighbors.

入力引数

すべて折りたたむ

点群。pointCloud オブジェクトとして指定します。

クエリ点。1 行 3 列のベクトル、または N 行 3 列の行列として指定します。

  • 単一のクエリ点に対して特定の半径内にある近傍を検出するには、そのクエリ点の座標を [x y z] 形式の 1 行 3 列のベクトルとして指定します。

  • 複数のクエリ点に対して特定の半径内にある近傍を検出するには、それらのクエリ点を N 行 3 列の行列として指定します。N はクエリ点の数です。行列の各行は [x y z] 形式であり、クエリ点の座標を表します。 (R2025a 以降)

探索半径。スカラーとして指定します。この関数は、入力点群内のクエリ点の周囲で、指定された radius 内にある近傍を検索します。

カメラ射影行列。3 次元ワールド ポイントを 2 次元イメージの点にマッピングする 4 行 3 列の行列として指定します。関数 estimateCameraMatrix を使用することで、camMatrix を検出できます。

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: findNeighborsInRadius(ptCloud,point,radius,'Sort',true)

インデックスの並べ替え。'Sort' と logical スカラーのコンマ区切りのペアとして指定します。Sorttrue に設定すると、返されるインデックスはクエリ点からの距離に基づいて昇順に並べ替えられます。並べ替えを無効にするには、Sortfalse に設定します。

葉ノードの数。'MaxLeafChecks' と整数で構成されるコンマ区切りのペアとして指定します。この値を Inf に設定すると、ツリー全体が検索されます。ツリー全体が検索される場合、厳密な検索結果が得られます。チェックする葉ノードの数を増やすと精度が向上しますが、効率性は低下します。

出力引数

すべて折りたたむ

保存された点のインデックス。M 行 1 列のベクトル、または N 行 1 列の cell 配列として返されます。

  • 単一のクエリ点の場合、この関数は M 個の半径近傍の線形インデックスを M 行 1 列のベクトルとして返します。

  • 複数のクエリ点の場合、この関数は N 行 1 列の cell 配列を返します。N はクエリ点の数です。各セルには、クエリ点の半径近傍の線形インデックスを表す M 行 1 列の列ベクトルが含まれています。M はそのクエリ点の半径近傍の数です。 (R2025a 以降)

クエリ点とその半径近傍の間の距離。M 行 1 列のベクトル、または N 行 1 列の cell 配列として返されます。

  • 単一のクエリ点の場合、この関数は M 行 1 列のベクトルを返します。ベクトルには、クエリ点とその M 個の半径近傍の間のユークリッド距離が含まれています。

  • 複数のクエリ点の場合、この関数は N 行 1 列の cell 配列を返します。N はクエリ点の数です。各セルには、クエリ点とその M 個の半径近傍の間のユークリッド距離を表す M 行 1 列のベクトルが含まれています。 (R2025a 以降)

R2025a 以降

特定された半径近傍の数。単一のクエリ点の場合は非負の整数として返され、N 個のクエリ点の場合は N 行 1 列の非負の整数のベクトルとして返されます。

参照

[1] Muja, M. and David G. Lowe. "Fast Approximate Nearest Neighbors with Automatic Algorithm Configuration". In VISAPP International Conference on Computer Vision Theory and Applications. 2009. pp. 331–340.

拡張機能

すべて展開する

バージョン履歴

R2015a で導入

すべて展開する