最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

findNearestNeighbors

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

説明

[indices,dists] = findNearestNeighbors(ptCloud,point,K) は、入力点群内のクエリ点の k 最近傍法を返します。入力点群は整理されていない点群データでも整理された点群データでもかまいません。クエリ点の 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

カメラ射影行列を使用して、整理された点群データ内のクエリ点の 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 = 20;

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

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

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

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

入力引数

すべて折りたたむ

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

メモ

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

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

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

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

名前と値のペアの引数

オプションの引数 Name,Value のコンマ区切りペアを指定します。Name は引数名で、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を、任意の順番で指定できます。

例: 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 で導入