11

Visual Studio 2010 で OpenCV 2.3.1 を使用してイメージ スティッチングのプロジェクトに取り組んでいます。

私は現在2つの問題を抱えています。

(私の評判は10を超えていないので、この投稿には2つのハイパーリンクしか投稿できません。コメント領域に別の2つを投稿します)

次のリンクで説明されている手順に従いました opencvで2つの画像をステッチする

  1. 両方の画像で SURF 特徴を見つけて一致させる
  2. RANSAC による外れ値の除去
  3. ホモグラフィの計算
  4. ターゲット画像を参照画像にワープする

下の写真は私が現在持っている結果です:

2 つの画像は、カメラを使用して同じ位置で別の方向から撮影されています(三脚を使用しました)。

ここに画像の説明を入力

それから私は別のテストを試みました。今回も同じカメラで2枚撮影。しかし、カメラを元の位置から少し動かしてから、2 枚目の写真を撮りました。結果は、次のようにかなりひどいものです。

ここに画像の説明を入力

問題 1:**2 台のカメラが異なる位置にある場合、**標準のパノラマ スティッチング技術 (ホモグラフィまたはカメラ回転モデルに基づく) が機能しないということですか?

将来、FOVを広げるために、異なる位置にある2台のカメラにスティッチングアルゴリズムを実装したいので、異なる位置で撮影した画像をスティッチングしようとしました:(コメントに写真を投稿します。 plz チェックFOVを広げます )

しかし今、私は間違った方向に進んでいるようです:(。


アルゴリズムの実行中、特徴の検出と照合にほとんどの時間がかかることがわかりました。

問題 2: 2 つの画像の特定の部分 (オーバーラップ領域) の特徴を計算するだけで、ホモグラフィを使用して変換を実行できますか? つまり、画像全体を計算するわけではありません。

このように考えるのは、2 枚の画像の重なり部分の量を指定すれば、画像全体の特徴量を計算する必要がないと思うからです。オーバーラップ領域の特徴を計算して一致させることができれば、速度が大幅に向上するはずです。

以下に示す最初のコードは、画像全体の特徴を計算する元のコードです。

    int minHessian = 3000;

    SurfFeatureDetector detector( minHessian );
    vector<KeyPoint> keypoints_1, keypoints_2;

    detector.detect( frm1, keypoints_1 );
    detector.detect( frm2, keypoints_2 );

    //-- Calculate descriptors (feature vectors)  
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1, keypoints_1, descriptors_1 );
    extractor.compute( frm2, keypoints_2, descriptors_2 );

アルゴリズム全体の実行に必要な時間を短縮するために、次のことを行いました。

    //detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
    //detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );

    //-- Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1, descriptors_1 );
    extractor.compute( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2, descriptors_2 );

上記のコードを使用すると、計算時間は大幅に短縮されますが、悪い結果が得られます: (コメントに写真を投稿します。悪い結果を確認してください)

現在立ち往生しており、次に何をすべきかわかりません。本当に希望し、助けを感謝します。ありがとう。

4

1 に答える 1

8

問題 1: よくわかりませんが、スティッチングの問題は、2 つの写真間のカメラの移動が原因のようです。グローバル ホモグラフィ変換だけでは、2 つの画像を完全に重ね合わせる方法はありません。ホモグラフィーは、次の 2 つの場合にのみ十分です。

  1. カメラは純粋に回転します (移動なし)
  2. カメラは一般的な動きをしますが、シーンは平面です

そうは言っても、ボトルがない場合、シーンはかなり平面的です (オブジェクトはカメラの移動に比べてかなり離れています)。したがって、ホモグラフィによる近似で十分な場合があります。画像を適切にブレンドするだけです。そのためには、最初に 2 つの画像の差が最小になる場所を「カット」して、ブレンド (ラプラシアンなど) を適用する必要があります。車の上部に取り付けられたカメラの問題については、この近似はまだ妥当である可能性があるため、ホモグラフィ モデルを使用できる可能性があります。

適切なブレンディングによるホモグラフィが十分でない場合は、3D 再構築技術、またはホモグラフィ要件を「緩和」する他の方法を検討する必要がある場合があります。文献には、モザイク化中の視差を扱った論文がいくつかあります。ただし、これらは基本的なホモグラフィ ステッチングよりもかなり複雑です。

問題 2: はい、オーバーラップがどこにあるかがはっきりしている限り、それは可能です。ただし、このオーバーラップ領域が小さすぎないようにする必要があります。そうしないと、計算するホモグラフィが歪む可能性があります。前に説明したように、オフィス データセットの問題は、カメラの移動が原因のようです。

最後に、SURF 特徴検出/マッチング パラメータを少し調整することをお勧めします。特徴点はやや低めのようです。

于 2012-06-24T13:08:40.497 に答える