2010/07/19

OpenCVで自動的にパノラマ写真を作る(OpenCV Panography)

以前、コンピュータビジョンの勉強用資料として紹介した、"Computer Vision Algorithms and Applications" に、
パノラマ写真の作り方が載っていたので実際にやってみました。
(パノラマ写真を作ることを英語でpanographyとかImage stitingと言うようです。)

※今回はOpenCVのサンプルにあるfind_obj.cppをベースに作っています。


デジカメで撮った複数枚の画像から大きなパノラマ画像を作る方法は下記の通りです。
1.カメラの位置をなるべく動かさず(回転はOK)、複数枚の画像を撮ります。
2.それぞれの画像の中から、特徴量を抽出します(今回はSURFを使っています)
3.異なる2枚の画像の特徴量を比較し、2枚の画像間のホモグラフィ行列を求めます。
4.求めたホモグラフィ行列を利用して、1枚ずつパノラマ画像に貼っていきます。

では、早速作っていきましょう。
1.材料の準備
今回の材料は下記の3枚です。
(自転車でちょっと峠まで行って写真を撮ってきました。)



2.特徴を探す
画像の特徴をひとまず目で探してみましょう。
image1の右側にある水色で囲った部分と、image2の水色の部分が同じもので、
image2の右側にあるオレンジで囲った部分とimage3のオレンジの部分が同じものであることがわかります。
(ほかにも特徴はありますが、ぱっと見てわかりやすいのが上記の2つです。)

この特徴探しをコンピュータにやってもらうのですが、今回はOpenCVに実装されているSURF特徴量を使います。
SURFを使うと、移動はもちろん、回転やスケーリングにも強い特徴を求めることが出来ます。

3.特徴のマッチング
画像ごとの特徴のリストが作られたので、次はこれを比較します。
2つの画像間で同じ物体が存在する場合は、2つの特徴リストの中に一致する特徴があるはずです。
今回、一致するものを探すために最近傍探索を使用しています。
(正直この辺はよくわかってないのですが、とりあえず特徴リストAにある特徴Anと、
特徴リストBにある特徴Bm(nとmは任意の数)の差が最小になるものを探し、それを特徴のペアとすることのようです)

特徴リスト間で対応する特徴の組が求まったら、それを元にホモグラフィ行列を求めます。
対応する特徴間の差(つまり特徴のX方向とY方向の移動量)のリストを求めて、
OpenCVの関数cvFindHomographyにホモグラフィ行列を求めてもらいます。

4.画像を合成する
今回は画像が3枚なので、image1とimage2間のホモグラフィ行列H12と、image2とimage3間のホモグラフィ行列H13がわかっていますが、
image1とimage3間のホモグラフィ行列はわかっていません。

ですが、image1とimage2間、image2間とimage3間の関係はホモグラフィ行列を使い、
下記のように表せるので、
image1 = H12 image2
image2 = H23 image3

image1とimage3間の関係は
image1=H12 H23 image3
となるはずです。

以上のことを踏まえてプログラムを作ると、下記のような結果になりました。


右下方向に拡大していっているのが気になりますが、それっぽく合成されてるようです。


あとは、↓こうなってるのを



こんな感じに補正してやれば
それっぽいパノラマ画像が出来そうです。

現在のパノラマ画像を作るところの処理は
・image1を左上に貼り付ける
・image2の透視変換画像(H12を使用)を求めて、貼り付ける
・image3の一時的な透視変換画像(ホモグラフィ行列H12を使用)を求めて、
さらにその一時的な画像にホモグラフィ行列H23を使用した投資変換画像を求めて貼り付ける

といった感じになってるので、

・image1を左上に貼り付ける
・image2の透視変換画像(H12を使用)を求める
・image2の歪みを直して貼り付ける
・image3の一時的な透視変換画像(ホモグラフィ行列H12を使用)を求めて、
さらにその一時的な画像にホモグラフィ行列H23を使用した投資変換画像を求める
・image3の歪みを直して貼り付ける

といった感じにすれば、キレイなパノラマ画像が作れそうです。


2011-06-28 追記
OpenCV2.3に、ベータ版ですがパノラマ写真作成ソフトがつきました。


ではまた。

0 件のコメント:

コメントを投稿