7

私はステッチに深く入り込もうとしています。を使用してcv::detailいます。

私はこの例に従おうとしています:

スティッチング パイプラインについては大まかに理解しています。

matchesGraphAsString()グラフを返す関数があります。このグラフをどのように計算するのか疑問に思っています。さらに、この場合の信頼区間の定義は何ですか。

出力は DOT 形式で、サンプル グラフは次のようになります。

graph matches_graph{
"15.jpg" -- "13.jpg"[label="Nm=75, Ni=50, C=1.63934"];
"15.jpg" -- "12.jpg"[label="Nm=47, Ni=28, C=1.26697"];
"15.jpg" -- "14.jpg"[label="Nm=149, Ni=117, C=2.22011"];
"11.jpg" -- "13.jpg"[label="Nm=71, Ni=52, C=1.77474"];
"11.jpg" -- "9.jpg"[label="Nm=46, Ni=37, C=1.69725"];
"11.jpg" -- "10.jpg"[label="Nm=87, Ni=73, C=2.14076"];
"9.jpg" -- "8.jpg"[label="Nm=122, Ni=99, C=2.21973"];
}

ここlabelで 、Nm、 とはどういう意味ですか? Ni公式文書にはこれらの詳細が欠けているようです。

4

2 に答える 2

7

これは実に興味深い質問です。@hatboyzero が指摘したように、変数の意味はかなり単純です。

  • Nmは一致の数です (オーバーラップ領域では、明らかな外れ値は既に削除されています)。
  • NiはRansacでホモグラフィを見つけた後のインライアの数です。
  • Cは、2 つのイメージが一致する信頼度です。

マッチングの背景

パノラマの構築は、すべての画像で関心ポイントを見つけ、それらの記述子を計算することによって行われます。SIFT、SURF、ORB などのこれらの記述子は、画像の同じ部分を検出できるように開発されました。それらは単なる中次元のベクトルです (64 次元または 128 次元が一般的です)。2 つの記述子間の L2 またはその他の距離を計算することにより、一致を見つけることができます。イメージのペアで一致するものがいくつ見つかるかは、 Nmという用語で表されます。

これまでのところ、一致は関心点の周囲の画像領域の出現によってのみ行われたことに注意してください。非常に一般的に、これらの一致の多くは明らかに間違っています。これは、記述子が同じように見える (考えてみてください: 複数の窓がある建物の窓枠や木の葉などの反復オブジェクト)、または記述子が少し情報量が少なすぎることが原因である可能性があります。

一般的な解決策は、幾何学的制約を追加することです。画像ペアは同じカメラで同じ位置から撮影されたものです。したがって、一方の画像で近接している点は、もう一方の画像でも近接している必要があります。より具体的には、すべてのポイントが同じ変換を受けている必要があります。カメラレンズ系の節点を中心にカメラを回転させたパノラマの場合、この変換は 2D ホモグラフィである必要があります。

Ransacは、最適な変換と、この変換と一致するすべての一致を見つけるためのゴールド スタンダード アルゴリズムです。これらの一貫した一致の数はNiと呼ばれます。Ransac は、この場合、4 つの一致 (論文のセクション 3.1 を参照) をランダムに選択し、これら 4 つの一致にホモグラフィを適合させることによって機能します。次に、考えられるすべての一致から、このホモグラフィと一致する一致の数を数えます。500 回繰り返し (論文を参照)、最後にインライアが最も多いモデルを取得します。次に、すべてのインライアを使用してモデルを再計算します。アルゴリズムの名前は、RANdom SAmple Consensus: RanSaC に由来します。

信頼項

私への質問は、この不思議な自信についてでした。計算された場所はすぐにわかりました。

からstitching/sources/matches.cpp:

// These coeffs are from paper M. Brown and D. Lowe. "Automatic Panoramic Image Stitching
// using Invariant Features"
matches_info.confidence = matches_info.num_inliers / (8 + 0.3 * matches_info.matches.size());

// Set zero confidence to remove matches between too close images, as they don't provide
// additional information anyway. The threshold was set experimentally.
matches_info.confidence = matches_info.confidence > 3. ? 0. : matches_info.confidence;

前述の論文の セクション 3.2 (「画像一致検証の確率モデル」) には、これが何を意味するかについての詳細が記載されています。

このセクションを読んで、いくつかのことが際立っていました。

  1. 彼らのモデルには多くの変数 (ほとんどが確率) があります。これらの値は、正当な理由なく論文で定義されています。以下は重要な文です。

実際には、p0、p1、p(m = 0)、p(m = 1)、および pmin の値を選択しましたが、原則としてデータから学習できます。

したがって、パラメータは何もないところから抜き出されたものであるため、これは単なる理論上の演習にすぎません。原則として学習できることに注意してください。

  1. この論文では、式 13 に信頼度の計算が含まれています。正しく読み取らmatches_info.confidenceれた場合、値が 1 より大きい場合、2 つの画像が適切に一致していることを意味します。

  2. 信頼度が 3 を超えている場合に、一致を削除する (信頼度を 0 に設定する) ことには何の正当性も見当たりません。これは、外れ値がほとんどないことを意味します。プログラマーは、異常値であることが判明した一致の数が多いということは、画像が大きく重複していることを意味すると考えていたと思いますが、これはこの背後にあるアルゴリズムによって提供されていません。(単純に、マッチングは特徴の外観に基づいています。)

于 2014-10-17T20:38:10.493 に答える
2

オンラインで入手できる OpenCV のソース コードをざっと見てみると、次のような意味であることがわかります。

  • Nm - ペアごとの一致の数
  • Ni - 幾何学的に一貫した一致の数
  • C - 2 つの画像が同じパノラマからのものであるという確信

私は、OpenCV ソース コードのバージョン 2.4.2 のmodules/stitching/src/motion_estimators.cppにあるmatchesGraphAsStringの本体のスニペットに基づいて仮定しています。いえ

        str << "\"" << name_src << "\" -- \"" << name_dst << "\""
            << "[label=\"Nm=" << pairwise_matches[pos].matches.size()
            << ", Ni=" << pairwise_matches[pos].num_inliers
            << ", C=" << pairwise_matches[pos].confidence << "\"];\n";

さらに、NiCの用語に関する情報については、detail::MatchesInfoのドキュメントも参照しています。

于 2014-10-17T18:56:06.523 に答える