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(___) は、点群入力のインライア点と外れ値点の線形インデックスを追加で返します。

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

[___] = pcfitcylinder(___,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、MaxNumTrials=1000 は、ランダム試行の最大回数を 1000 に設定します。

すべて折りたたむ

点群を読み込みます。

load("object3d.mat");

点群を表示します。

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

円柱近似用に点から円柱までの最大距離 (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")

点群を含む MAT ファイルをワークスペースに読み込みます。

load("object3d.mat");

点群を表示します。

figure
pcshow(ptCloud)
title("Detect a Cylinder in a Point Cloud")

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

maxDistance = 0.005;

関心領域 (ROI) を指定して、近似関数を制限します。

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

近似関数の方向の制約を設定します。

referenceVector = [0 0 1];

点群内の指定された ROI で円柱を検出し、抽出します。

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

検出された円柱のモデルをプロットします。

hold on
plot(model)

入力引数

すべて折りたたむ

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

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

データ型: single | double

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

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

名前と値の引数

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

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

例: 'SampleIndices',[].

入力点群でサンプリングする点の線形インデックス。'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 で導入