Main Content

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

findPointsInROI

点群の関心領域内の点を検出

説明

indices = findPointsInROI(ptCloud,roi) は、入力点群の関心領域 (ROI) 内の点を返します。指定された ROI 内の点は、Kd 木ベースの探索アルゴリズムを使用して取得されます。

indices = findPointsInROI(ptCloud,roi,camMatrix) は、入力点群の ROI エリア内の点を返します。入力点群は、深度カメラによって生成された、オーガナイズド点群です。指定された ROI 内の点は、高速な近似近傍探索アルゴリズムを使用して取得されます。

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

メモ

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

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

すべて折りたたむ

点群データをワークスペースに読み取ります。

ptCloud = pcread('teapot.ply');

入力点群の xy および z 座標の範囲内で直方体 ROI を定義します。

roi = [-2 2 -2 2 2.4 3.5];

直方体 ROI 内にある点のインデックスを検出します。

indices = findPointsInROI(ptCloud,roi);

直方体 ROI 内にある点を選択して、点群オブジェクトとして格納します。

ptCloudB = select(ptCloud,indices);

入力点群と指定された ROI 内の点群を表示します。

figure
pcshow(ptCloud.Location,[0.5 0.5 0.5])
hold on
pcshow(ptCloudB.Location,'r');
legend('Point Cloud','Points within ROI','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, Points within ROI.

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

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

入力点群の xy および z 座標の範囲内で直方体 ROI を指定します。

roi = [0.3 0.7 0 0.4 0.1 0.3];

直方体 ROI 内にある点群データのインデックスを検出します。

indices = findPointsInROI(ptCloud,roi,camMatrix);

点群の select メソッドを使用して、ROI 内の点の点群データを取得します。

ptCloudB = select(ptCloud,indices);

入力点群と直方体 ROI 内の点を表示します。

figure
pcshow(ptCloud)
hold on
pcshow(ptCloudB.Location,'r');
legend('Point Cloud','Points within the ROI','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, Points within the ROI.

入力引数

すべて折りたたむ

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

関心領域。[xmin, xmax, ymin, ymax, zmin, zmax] 形式の 6 要素ベクトルとして指定します。ここでは、次のとおりです。

  • xmin と xmax はそれぞれ x 軸に沿った下限と上限です。

  • ymin と ymax はそれぞれ y 軸に沿った下限と上限です。

  • zmin と zmax はそれぞれ z 軸に沿った下限と上限です。

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

出力引数

すべて折りたたむ

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

参照

[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.

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

バージョン履歴

R2015a で導入

参考

関数

オブジェクト