Main Content

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

findNearestNeighbors

点群内の点の最近傍を検出

説明

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

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

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

メモ

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

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

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

すべて折りたたむ

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

load('xyzPoints.mat');

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

ptCloud = pointCloud(xyzPoints);

クエリ点と特定する近傍の数を指定します。

point = [0,0,0];
K = 220;

インデックスと k 最近傍点の距離を取得します。

[indices,dists] = findNearestNeighbors(ptCloud,point,K);

点群を表示します。クエリ点と最近傍をプロットします。

figure
pcshow(ptCloud)
hold on
plot3(point(1),point(2),point(3),'*r')
plot3(ptCloud.Location(indices,1),ptCloud.Location(indices,2),ptCloud.Location(indices,3),'*')
legend('Point Cloud','Query Point','Nearest 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, Nearest Neighbors.

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

オーガナイズド点群データをワークスペース内に読み込みます。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];
K = 1000;

カメラ射影行列を使用して、インデックスと k 最近傍点の距離を検出します。点群の select メソッドを使用して、最近傍の点群データを取得します。

[indices,dists] = findNearestNeighbors(ptCloud,point,K,camMatrix);
ptCloudB = select(ptCloud,indices);

点群とクエリ点の最近傍を表示します。

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

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

入力引数

すべて折りたたむ

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

メモ

この関数では、RGB-D センサーからのみ生成された、オーガナイズド点群データがサポートされます。

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

最近傍の数。正の整数として指定します。

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

名前と値の引数

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

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

例: findNearestNeighbors(ptCloud,point,k,'Sort',true)

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

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

メモ

名前と値の引数 'MaxLeafChecks' は、Kd 木ベースの探索方法でのみ有効です。

出力引数

すべて折りたたむ

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

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

参照

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