Learn OpenCV

The Tower of Babelは、聖書の神話によると、人類最初のエンジニアリングの失敗だったそうです。 このプロジェクトは、明確な使命、多くの人員、時間的制約、適切な技術 (レンガとモルタル) といった素晴らしい資質をすべて備えていました。 しかし、神が人間の労働者の言語を混乱させ、もはやコミュニケーションをとることができなかったため、見事に失敗したのです。

「ホモグラフィ」という言葉を聞くと、私たちがいまだにコミュニケーションでいかに苦労しているかをよく思い出します。 ホモグラフィーは奇妙な名前のシンプルな概念です!

ホモグラフィーとは何か?

図1に示した平面(本の上部)の2つの画像を考えてみてください。 赤い点は2つの画像で同じ物理的な点を表しています。 コンピュータビジョンの専門用語では、これを対応点と呼ぶ。 図1.は、赤、緑、黄、オレンジの4色の対応点を示している。 ホモグラフィーは、一方の画像の点を他方の画像の対応点に写す変換(3×3行列)です。

Figure 1 : 3D平面(本の上部)の2つの画像はホモグラフィーによって関連している

ここで、ホモグラフィーが3×3行列なので、

最初の画像と第2の画像の対応点セットについて考えてみましょう。 すると、ホモグラフィーは次のようにそれらをマッピングします。

ホモグラフィーによる画像の位置合わせ

上の式は、現実世界の同じ平面上にある限り、対応する点のすべての集合に当てはまります。 つまり、1枚目の画像にホモグラフィーを適用すれば、1枚目の画像の本と2枚目の画像の本が整列するのです! 図2

Figure 2 : 3次元平面のある画像と同じ平面のある画像はホモグラフィで位置合わせできる

しかし、平面上にない点はどうでしょうか? 図2のように、ホモグラフィでは整列されません。 しかし、画像に2つの平面がある場合はどうでしょうか。

パノラマ:ホモグラフィの応用

前節では、2つの画像のホモグラフィがわかれば、一方の画像を他方の画像にワープさせることができることを学びました。 しかし、一つ大きな注意点がありました。 画像には平面(本の天辺)が含まれていなければならず、その平面部分だけが正しく整列されている必要がありました。 その結果、平面だけでなく、どんな風景でも撮影し、カメラを回転させて2枚目を撮影すると、2枚の画像はホモグラフィーで関連づけられることがわかりました つまり、カメラを三脚に載せて撮影します。 次に、カメラを縦軸に回転させて、もう一枚撮ります。 全く任意の3次元風景を撮影した2枚の画像は、ホモグラフィーの関係で結ばれています。 2枚の画像には共通の領域があり、それを位置合わせしてつなぎ合わせると、2枚の画像からなるパノラマ画像ができあがります。 そんなに簡単なんですか? いいえ、そうではありません。 (しかし、基本的な原理は、ホモグラフィーを使って位置合わせをし、継ぎ目が見えないようにインテリジェントにステッチすることです。

ホモグラフィーの計算方法

二つの画像間のホモグラフィーを計算するには、二つの画像間の少なくとも4点の対応関係を知っておく必要があります。 4点以上の対応点があれば、なおよいでしょう。 OpenCVは、対応するすべての点に最もフィットするホモグラフィを頑健に推定します。 通常、これらの点の対応は、画像間でSIFTやSURFなどの特徴量を照合して自動的に見つけますが、この投稿では、単に手で点をクリックします。

まず、使い方を見てみましょう。

C++

Python

C++ と Python の両方で、より完全な例を見てみましょう。

OpenCV C++ Homography Example

図2.の画像は、以下のC++コードを用いて生成することが可能です。 以下のコードは、2つの画像から対応する4点を取り出し、画像をもう一方の画像にワープさせる方法を示しています。

OpenCV Python Homography Example

図2.の画像は、以下のPythonコードで生成することも可能です。 以下のコードは、2つの画像から対応する4点を取り出して、画像をもう一方の画像にワープさせる方法を示しています。

ホモグラフィーの応用

ホモグラフィーの最も興味深い応用は、パノラマ画像の作成(別名:イメージモザイク、イメージスティッチング)であることは間違いないでしょう。 パノラマについては、後ほど紹介します。

ホモグラフィーを使った遠近感の補正

図3. 遠近法補正

例えば、図1のような写真があったとします。 本の四隅をクリックすると、図 3 のような画像がすぐに表示されたら、クールだと思いませんか。 この例のコードは、以下のダウンロードコーナーで入手できます。 以下はその手順です。

  1. 本の四隅を収集するユーザーインターフェイスを書く。 これらの点をpts_srcと呼ぶことにしましょう
  2. 本のアスペクト比を知る必要があります。 この本の場合、アスペクト比(幅/高さ)は3/4である。 そこで、出力画像サイズを300×400とし、目的点(pts_dst)を(0,0), (299,0), (299,399), (0,399)
  3. pts_srcとpts_dstを使ってホモグラフィを求める。
  4. ホモグラフィをソース画像に適用すると図3の画像が出てきます。
この投稿で使用したコードと画像は、こちらからニュースレターを購読してダウンロードできます。

Virtual Billboard

多くのスポーツ中継では、ライブ映像に広告が挿入され、仮想的に表示されています。 例えば、サッカーや野球では、フィールドの境界のすぐ外側にある小さな広告ボードに設置された広告をバーチャルに変更することができます。 広告主は、全員に同じ広告を表示するのではなく、その人の属性や場所などに応じて表示する広告を選ぶことができるのです。 これらのアプリケーションでは、広告ボードの四隅が映像の中で検出され、それが目的地となります。 広告の四隅はソースポイントとして機能する。 ホモグラフィーは、これらの4つの対応するポイントに基づいて計算され、それはビデオフレームに広告をワープするために使用されます。

この記事を読んだ後、おそらくバーチャル ビルボードに画像を配置する方法について考えがあると思います。 図4.は、インターネットにアップロードされた最初の画像を示しています。

Figure 4. インターネットにアップロードされた最初の画像.

そして、図5.は、タイムズスクエア.

を表示しています。 The Times Square
この例やこの投稿の他の例で使用したコード (C++ & Python) と画像は、こちらのニュースレターを購読するとダウンロードできます。

The Times Squareのビルボードの1つを好きな画像に交換することが可能です。 以下はその手順です。

  1. 画像にあるビルボードの四隅を集めるユーザーインターフェイスを書きます。 これらの点をpts_dstと呼ぶことにする
  2. 仮想ビルボードに貼りたい画像の大きさをw×hとする。したがって画像の角( pts_src )は、 (0,0), (w-1,0), (w-1,h-1), (0,h-1)
  3. pts_src と pts_dstを使ってホモグラフィを取得する .
  4. このホモグラフィーを元画像に適用し、先画像とブレンドすると、図6のような画像が得られます。

図6では、タイムズスクエア画像に図4の画像を挿入していることに注意してください。

図6. 仮想ビルボード

Subscribe & Download Code

If you liked this article and would like to download code (C++ and Python) and example images used in this post, please subscribe to our newsletter.Please use in a single single image. また、無料の Computer Vision Resource Guide をお届けします。 ニュースレターでは、C++/Python で書かれた OpenCV のチュートリアルやサンプル、コンピュータビジョンや機械学習のアルゴリズムやニュースなどを共有しています。

Subscribe Now

Image Credits

  1. 図 4 の写真はインターネットに初めてアップされた写真画像でした。 フェアユースに該当します。
  2. 図5.で使われている画像。 ( The Time Square ) は GFDL の下でライセンスされています。

コメントを残す

メールアドレスが公開されることはありません。