Main Content

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

estimateFundamentalMatrix

ステレオ イメージ内の対応する点から基礎行列を推定

説明

estimateFundamentalMatrix は、ステレオ イメージ内の対応する点から基礎行列を推定します。この関数は、対応するすべての点を使用するか、または外れ値を排除するように構成できます。Random-sample consensus (RANSAC) などのロバストな推定手法を使用して、外れ値を排除できます。ロバストな推定を使用すると、アルゴリズムのランダム性のために、すべての実行で結果が同一にならない場合があります。

F = estimateFundamentalMatrix(matchedPoints1,matchedPoints2) は、ステレオ イメージ内のマッチした特徴点から、最小二乗中央値 (LMedS) 法を使用して、3 行 3 列の基礎行列 F を返します。

[F,inliersIndex] = estimateFundamentalMatrix(matchedPoints1,matchedPoints2) はさらに、基礎行列の計算に使用されるインライアに対して、論理インデックス inliersIndex を返します。inliersIndex 出力は、M 行 1 列のベクトルです。対応する点が基礎行列の計算に使用されている場合、関数がベクトルの要素を true に設定します。使用されていない場合、要素は false に設定されます。

[F,inliersIndex,status] = estimateFundamentalMatrix(matchedPoints1,matchedPoints2) はさらに、ステータス コードを返します。

[F,inliersIndex,status] = estimateFundamentalMatrix(matchedPoints1,matchedPoints2,Name=Value) は、前の構文にある引数の任意の組み合わせに加えて、名前と値の引数を 1 つ以上使用してオプションを指定します。たとえば、estimateFundamentalMatrix(matchedPoints1,matchedPoints2,Method="MSAC") は、基礎行列を計算する手法として MSAC を指定します。

すべて折りたたむ

random sample consensus (RANSAC) 法を使用して、基礎行列を計算します。RANSAC 法では、入力点が推定的にマッチされている必要があります。関数 matchFeatures を使用して、これらのマッチされた点を返すことができます。推定的にマッチされた点の中にまだ外れ値点が含まれている可能性がある場合には、RANSAC アルゴリズムを使用するとさらに排除できます。

ステレオ点をワークスペースに読み込みます。

load stereoPointPairs

基礎行列を推定します。

fRANSAC = estimateFundamentalMatrix(matchedPoints1, ...
    matchedPoints2,Method="RANSAC", ...
    NumTrials=2000,DistanceThreshold=1e-4)
fRANSAC = 3×3

    0.0000   -0.0004    0.0348
    0.0004    0.0000   -0.0937
   -0.0426    0.0993    0.9892

推定的にマッチされた点をワークスペースに読み込みます。

load stereoPointPairs
[fLMedS,inliers] = estimateFundamentalMatrix(matchedPoints1,matchedPoints2,NumTrials=2000)
fLMedS = 3×3

    0.0000   -0.0004    0.0349
    0.0004    0.0000   -0.0938
   -0.0426    0.0994    0.9892

inliers = 18x1 logical array

   1
   1
   1
   1
   1
   1
   0
   1
   0
   0
      ⋮

ステレオ イメージを読み込みます。

I1 = imread("viprectification_deskLeft.png");
I2 = imread("viprectification_deskRight.png");

推定的にマッチされた点を表示します。

figure;
showMatchedFeatures(I1,I2,matchedPoints1,matchedPoints2,"montage",PlotOptions=["ro","go","y--"]);
title("Putative Point Matches");

Figure contains an axes object. The axes object with title Putative Point Matches contains 4 objects of type image, line. One or more of the lines displays its values using only markers

インライア点を表示します。

figure;
showMatchedFeatures(I1,I2,matchedPoints1(inliers,:),matchedPoints2(inliers,:),"montage",PlotOptions=["ro","go","y--"]);
title("Point Matches After Outliers Are Removed");

Figure contains an axes object. The axes object with title Point Matches After Outliers Are Removed contains 4 objects of type image, line. One or more of the lines displays its values using only markers

ステレオ点のペアをワークスペースに読み込みます。

load stereoPointPairs

外れ値が含まれない入力点の基礎行列を計算します。

inlierPts1 = matchedPoints1(knownInliers,:);
inlierPts2 = matchedPoints2(knownInliers,:);
fNorm8Point = estimateFundamentalMatrix(inlierPts1,inlierPts2,Method="Norm8Point")
fNorm8Point = 3×3

    0.0000   -0.0004    0.0348
    0.0004    0.0000   -0.0937
   -0.0426    0.0993    0.9892

入力引数

すべて折りたたむ

イメージ 1 の対応する点の座標。M 個の [x y] 座標からなる M 行 2 列の行列、または特徴点のタイプで説明されている特徴点オブジェクトの 1 つとして指定します。matchedPoints1 入力には、単一の平面上 (壁、テーブル、本など) に存在せず、matchFeatures などの関数を使用して推定的にマッチされる点が含まれていなければなりません。

イメージ 1 の対応する点の座標。M 個の [x y] 座標からなる M 行 2 列の行列、または特徴点のタイプで説明されている特徴点オブジェクトの 1 つとして指定します。matchedPoints1 入力には、単一の平面上 (壁、テーブル、本など) に存在せず、matchFeatures などの関数を使用して推定的にマッチされる点が含まれていなければなりません。

名前と値の引数

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

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

例: estimateFundamentalMatrix(matchedPoints1,matchedPoints2,Method="MSAC") は、基礎行列を計算する手法として MSAC を指定します。

基礎行列の計算に使用する手法。次のいずれかとして指定します。

"LMedS"最小二乗中央値。この手法は、matchedPoints1matchedPoints2 の点の少なくとも 50% がインライアである場合に使用します。この関数は、インライアの 50% が検出されると、インライアの検索と基礎行列の推定を停止します。
"MSAC"M-estimator SAmple Consensus。インライアに距離のしきい値を設定する場合には、M-estimator SAmple Consensus 法を選択します。通常、MSAC 法は RANSAC 法より迅速に収束します。
"Norm8Point"正規化 8 点アルゴリズム[1]。信頼性の高い結果を生成するには、入力 matchedPoints1matchedPoints2 が正確にマッチしなければなりません。

Norm8Point アルゴリズムを使用して信頼性の高い結果を生成するには、matchedPoints1matchedPoints2 の入力が正確にマッチしなければなりません。他の手法では外れ値を許容できるため、推定的にマッチされた入力点のみが必要です。関数 matchFeatures を使用して推定的にマッチされた点を取得できます。

基礎行列クラス。"double" または "single" として指定します。このプロパティを使用して、基礎行列のクラスと関数の内部計算のクラスを指定します。

外れ値を検出するためのランダム試行の回数。整数として指定します。この引数は、MethodLMedS または MSAC に設定した場合に適用されます。

  • LMedS — 関数は試行の実際の回数をパラメーター値として使用する。

  • MSAC — 関数は試行の最大回数をパラメーター値として使用する。

試行の実際の回数は、matchedPoints1matchedPoints2 および Confidence パラメーターの値によって異なります。速度と精度が最適になるようにランダム試行の回数を選択します。

外れ値を検出するための距離しきい値。正のスカラーとして指定します。このパラメーターは、MethodMSAC に設定した場合に適用されます。

最大数のインライアの検出に関する目的の信頼度。範囲 (0 100) のパーセント比スカラーとして指定します。この引数は、MethodMSAC に設定した場合に適用されます。

ランタイム エラーのレポート。logical 値として指定します。このパラメーターを true に設定すると、関数が matchedPoints1matchedPoints2 から基礎行列を計算できない場合にランタイム エラーをレポートします。このパラメーターを false に設定すると、status 出力をチェックして基礎行列の妥当性を検証できます。

出力引数

すべて折りたたむ

基礎行列。入力 matchedPoints1 および matchedPoints2 の点から計算される 3 行 3 列の行列として返されます。

[P21]*FundamentalMatrix*[P11]'=0

ピクセル単位のイメージ 1 の matchedPoints1 の点である P1 は、イメージ 2 の matchedPoints2 の点である P2 に対応します。

コンピューター ビジョンでは、基礎行列は、ステレオ イメージ内の対応する点を関連付ける 3 行 3 列の行列になります。2 台のカメラで 2 つの異なる位置から 3 次元シーンを見る場合、3 次元の点とその 2 次元イメージへの投影との間にはいくつかの幾何学的関係があり、イメージ ポイント間の制約となります。同じシーンの 2 つのイメージは、エピポーラ幾何によって関連付けられます。

インライアのインデックス。M 行 1 列の論理インデックス ベクトルとして返されます。要素が true に設定されている場合、matchedPoints1matchedPoints2 の対応するインデックス付きのマッチ点を使用して基礎行列が計算されていることを意味します。要素が false に設定されている場合、インデックス付きの点が計算に使用されていないことを意味します。

データ型: logical

ステータス コード。次のいずれかの値として返されます。

ステータス
0:エラーなし。
1:matchedPoints1matchedPoints2 に十分な数の点が含まれていません。Norm8Point メソッドおよび MSAC メソッドには少なくとも 8 個の点、LMedS メソッドには 16 個の点が必要です。
2:十分な数のインライアが見つかりませんでした。

データ型: int32

ヒント

カメラの内部パラメーターがわかっている場合には、estimateEssentialMatrix を使用します。内部パラメーターは、カメラ キャリブレーター アプリを使用して取得できます。そうでない場合、カメラの内部パラメーターを必要としない関数 estimateFundamentalMatrix を使用できます。基礎行列は共面ワールド ポイントから推定できないことに注意してください。

アルゴリズム

すべて折りたたむ

基礎行列の計算

Norm8Point 法を選択すると、関数は matchedPoints1matchedPoints2 のすべての点を使用して基礎行列を計算します。他の手法を選択すると、関数は次のアルゴリズムを使用して外れ値を排除し、インライアから基礎行列を計算します。

  1. 基礎行列 F を 3 行 3 列の零点の行列に初期化します。

  2. ループ カウンター n をゼロに設定し、ループ回数 N を指定されたランダム試行の回数に設定します。

  3. n < N である間、次の手順を繰り返します。

    1. matchedPoints1matchedPoints2 から点のペアを 8 個ランダムに選択します。

    2. 選択した 8 個の点を使用し、正規化 8 点アルゴリズムを使用して基礎行列 f を計算します。

    3. matchedPoints1matchedPoints2 のすべての点について、f の適合度を計算します。

    4. f の適合度が F より良い場合、F を f に置き換えます。

      MSAC 法の場合は、N を更新します。

    5. n = n + 1

MSAC 法の無作為抽出の回数

MSAC 法では、アルゴリズム ループの反復のたびにランダム試行の回数 N が更新されます。関数は、次に従って N をリセットします。

N = min( N, log(1p)log(1r8))。
ここで、p は指定した信頼パラメーターを表し、r は以下に示すように計算されます。
iNsgn(dui,vi),t)/N。ここで、ab の場合は sgn(a,b)=1、その他の場合は 0 です。
MSAC 法を使用すると、アルゴリズムのランダム性のために、すべての実行で結果が同一にならない場合があります。

Sampson 距離

関数は、Sampson 距離を使用して、基礎行列に従って点のペアの距離を測定します。以下の方程式を使用して Sampson 距離を計算できます。この方程式において、u は matchedPoints1 を、v は matchedPoints2 を表します。

d(ui,vi)=(viFuiT)2[1(FuiT)12+(FuiT)22+1(viF)12+(viF)22]

ここで、i は対応する点のインデックスを表し、(FuiT)j2 はベクトル FuiT における j 番目のエントリの二乗を表します。

対応する点に対する基礎行列の適合度

次の表に、計算された基礎行列の適合度を各手法において判定する方法をまとめています。

メソッド適合度の測定
LMedSmedian(d(ui,vi);i=1:N) 入力点の数。値が小さいほど、適合度が高くなります。
MSACiNmin(d(ui,vi),t).値が小さいほど、適合度が高くなります。

参照

[1] Hartley, R., A. Zisserman, Multiple View Geometry in Computer Vision, Cambridge University Press, 2003.

[2] Rousseeuw, P., A. Leroy, Robust Regression and Outlier Detection, John Wiley & Sons, 1987.

[3] Torr, P. H. S., and A. Zisserman, MLESAC: A New Robust Estimator with Application to Estimating Image Geometry, Computer Vision and Image Understanding, 2000.

拡張機能

バージョン履歴

R2012b で導入