Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

findNeighborsInRadius

点群内の点の半径内にある近傍の検索

説明

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

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

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

メモ

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

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

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

すべて折りたたむ

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

load('xyzPoints.mat');

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

ptCloud = pointCloud(xyzPoints);

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

point = [0,0,3];
radius = 0.5;

指定された半径内にある点のインデックスと距離を取得します。

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

半径近傍の点群データを取得します。

ptCloudB = select(ptCloud,indices);

点群を表示します。クエリ点と対応する半径近傍をプロットします。

figure
pcshow(ptCloud)
hold on
plot3(point(1),point(2),point(3),'*')
pcshow(ptCloudB.Location,'r')
legend('Point Cloud','Query Point','Radial Neighbors','Location','southoutside','Color',[1 1 1])
hold off

Figure contains an axes object. The axes object contains 3 objects of type scatter, line. One or more of the lines displays its values using only markers These objects represent Point Cloud, Query Point, Radial Neighbors.

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

オーガナイズド点群データをワークスペース内に読み込みます。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 オブジェクトとして指定します。

クエリ点。[x,y,z] 形式の 3 要素ベクトルとして指定します。

探索半径。スカラーとして指定します。この関数は、入力点群内のクエリ点の周囲で、指定された 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 に設定すると、ツリー全体が検索されます。ツリー全体が検索される場合、厳密な検索結果が得られます。チェックする葉ノードの数を増やすと精度が向上しますが、効率性は低下します。

出力引数

すべて折りたたむ

並べ替えられた点のインデックス。列ベクトルとして返されます。このベクトルには、点群に格納された半径近傍の線形インデックスが含まれています。

クエリ点までの距離。列ベクトルとして返されます。ベクトルにはクエリ点とその半径近傍の間のユークリッド距離が含まれています。

参照

[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 で導入