メインコンテンツ

findNearestNeighbors

点群内のクエリ点の最近傍を検出する

説明

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

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

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

メモ

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

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

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

すべて折りたたむ

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

load("xyzPoints.mat");

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

ptCloud = pointCloud(xyzPoints);

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

points = [0 0 0; 0 0 3];
K = 70;

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

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

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

figure
pcshow(ptCloud)
hold on
plot3(points(:,1),points(:,1),points(:,3),"*r")
plot3(ptCloud.Location(indices,1), ...
    ptCloud.Location(indices,2), ...
    ptCloud.Location(indices,3),"*m")
legend("Point Cloud","Query Points", ...
    "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 Points, 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 センサーからのみ生成された、オーガナイズド点群データがサポートされます。

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

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

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

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

カメラ射影行列。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 列のベクトル、または KN 列の行列として返されます。K は最近傍の数です。

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

  • 複数のクエリ点の場合、この関数は KN 列の行列を返します。K は最近傍の数、N はクエリ点の数です。行列の各列には、入力引数 points の対応する行で指定されたクエリ点に対する K 個の最近傍の線形インデックスが含まれています。 (R2025a 以降)

クエリ点とその最近傍の間の距離。K 行 1 列のベクトル、または KN 列の行列として返されます。K は最近傍の数です。

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

  • 複数のクエリ点の場合、この関数は KN 列の行列を返します。K は最近傍の数、N はクエリ点の数です。行列の各列には、クエリ点の K 個の最近傍のユークリッド距離が含まれています。このクエリ点は、入力引数 points 内の対応する行によって指定されます。 (R2025a 以降)

参照

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

すべて展開する