Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

pcfitcylinder

3 次元点群への円柱の近似

説明

model = pcfitcylinder(ptCloudIn,maxDistance) は、インライア点から円柱までの最大許容距離が指定されている点群に円柱を近似します。この関数は、M-estimator SAmple Consensus (MSAC) アルゴリズムを使用して円柱を検出します。

model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector) は、1 行 3 列の基準方向入力ベクトルによって追加の方向の制約が指定されている点群に円柱を近似します。

model = pcfitcylinder(ptCloudIn,maxDistance,referenceVector,maxAngularDistance) は、最大許容絶対角距離を追加で指定します。

[model,inlierIndices,outlierIndices] = pcfitcylinder(ptCloudIn,maxDistance) は、点群入力のインライア点と外れ値点の線形インデックスを追加で返します。

[___,meanError] = pcfitcylinder(ptCloudIn,maxDistance) は、インライア点からモデルまでの距離の平均誤差を追加で返します。

[___] = pcfitcylinder(___,Name,Value) は、Name,Value ペアの引数を 1 つ以上指定したオプションを追加で使用します。

すべて折りたたむ

点群を読み込みます。

load('object3d.mat');

点群を表示します。

figure
pcshow(ptCloud)
xlabel('X(m)')
ylabel('Y(m)')
zlabel('Z(m)')
title('Original Point Cloud')

Figure contains an axes object. The axes object with title Original Point Cloud contains an object of type scatter.

円柱近似用に点から円柱までの最大距離 (5 mm) を設定します。

maxDistance = 0.005;

関心領域を設定して探索範囲を制限します。

roi = [0.4,0.6,-inf,0.2,0.1,inf];
sampleIndices = findPointsInROI(ptCloud,roi);

方向の制約を設定します。

referenceVector = [0,0,1];

インライア点を指定して、円柱を検出し、点群から抽出します。

[model,inlierIndices] = pcfitcylinder(ptCloud,maxDistance,...
        referenceVector,'SampleIndices',sampleIndices);
pc = select(ptCloud,inlierIndices);

抽出した円柱をプロットします。

figure
pcshow(pc)
title('Cylinder Point Cloud')

Figure contains an axes object. The axes object with title Cylinder Point Cloud contains an object of type scatter.

点群を読み込みます。

load('object3d.mat');

点群を表示します。

figure
pcshow(ptCloud)
xlabel('X(m)')
ylabel('Y(m)')
zlabel('Z(m)')
title('Detect a Cylinder in a Point Cloud')

Figure contains an axes object. The axes object with title Detect a Cylinder in a Point Cloud contains an object of type scatter.

円柱近似用に点から円柱までの最大距離 (5 mm) を設定します。

maxDistance = 0.005;

関心領域を設定して探索範囲を制限します。

roi = [0.4,0.6;-inf,0.2;0.1,inf];
sampleIndices = findPointsInROI(ptCloud,roi);

方向の制約を設定します。

referenceVector = [0,0,1];

点群で円柱を検出して抽出します。

model = pcfitcylinder(ptCloud,maxDistance,referenceVector,...
        'SampleIndices',sampleIndices);

円柱をプロットします。

hold on
plot(model)

Figure contains an axes object. The axes object with title Detect a Cylinder in a Point Cloud contains 2 objects of type scatter, surface.

入力引数

すべて折りたたむ

点群。pointCloud オブジェクトとして指定します。入力 ptCloudNormal プロパティが空の場合、プロパティには関数によって近似アルゴリズムの要件を満たす値が設定されます。

インライア点から円柱までの最大距離。スカラー値として指定します。点群に使用している単位と一致する単位で距離を指定します。

データ型: single | double

基準となる方向。1 行 3 列のベクトルで指定します。

最大絶対角距離。スカラー値として指定します。最大角距離は、近似される円柱の方向と基準方向の間で度単位で測定されます。

名前と値の引数

例: 'SampleIndices',[].

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

入力点群でサンプリングする点の線形インデックス。'SampleIndices' と列ベクトルで構成されるコンマ区切りのペアとして指定します。空ベクトルの場合は、円柱を近似する RANSAC 反復ですべての点がサンプリングの候補になります。点のサブセットを指定すると、関数はそれらのサブセット内の点のみをサンプリングしてモデルを近似します。点のサブセットを指定すると、試行回数を減らして、プロセスを大幅に高速化できます。pointCloud オブジェクトの findPointsInROI メソッドを使用してインデックス ベクトルを生成できます。

インライアを検出するためのランダム試行の最大回数。'MaxNumTrials' と正の整数で構成されるコンマ区切りのペアとして指定します。出力のロバスト性を向上するには、この値を増やします。しかし、このようにすると計算量が増加します。

最大数のインライアの検出の割合。'Confidence' と (0 100) の範囲の数値スカラーで構成されるコンマ区切りのペアとして指定します。出力のロバスト性を向上するには、この値を増やします。しかし、このようにすると計算量が増加します。

出力引数

すべて折りたたむ

円柱の幾何学的モデル。cylinderModel オブジェクトとして返されます。

出力モデルの係数は、以下の場合にゼロに設定します。

  • 入力点群に十分な有効な点が含まれていない。

  • アルゴリズムが十分なインライア点を検出できない。

入力点群内のインライア点の線形インデックス。列ベクトルとして返されます。

入力点群内の外れ値点の線形インデックス。列ベクトルとして返されます。

インライア点からモデルまでの距離の平均誤差。スカラー値として返されます。

アルゴリズム

この関数は、円柱を表す幾何学的モデルを返します。この関数は、M-estimator SAmple Consensus (MSAC) アルゴリズムを使用して円柱を検出します。MSAC アルゴリズムは、RANdom SAmple Consensus (RANSAC) アルゴリズムのバリアントです。

関数 pcfitcylinder の近似アルゴリズムには、点群の法線が必要です。そのため、入力点群の Normal プロパティが空の場合、関数がそれを指定します。関数が Normal プロパティを指定するとき、6 個の点を使用して局所円柱への近似を行います。6 個の点が機能せず、近似が失敗する場合は、使用する点の数を選択できる関数 pcnormals を呼び出すことを検討します。

参照

[1] Torr, P. H. S., and A. Zisserman. “MLESAC: A New Robust Estimator with Application to Estimating Image Geometry.” Computer Vision and Image Understanding. Volume 78, Issue 1, April 2000, pp. 138-156.

拡張機能

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

バージョン履歴

R2015b で導入