満上育久(大阪大学 産業科学研究所)
このページは,映像情報メディア学会誌「私の研究開発ツール(第46回)Bundler: Structure from Motion for Unordered Image Collections」の補足ページとして作成しました.
Structure from Motion(以下SFM)とは,あるシーンをカメラの視点を変えながら撮影した複数枚の画像からそのシーンの3次元形状とカメラの位置を同時に復元する手法である(図1).この技術は,得られるシーンの3次元形状に着目すればコンピュータビジョンにおける形状復元問題の1解法であり,一方カメラの位置推定に着目すればロボットビジョンにおける自己位置推定手法と捉えることもできる.このように,SFMは応用範囲の広い基本的かつ重要な技術である.
図1 Structure from Motion
Bundlerは,このSFMの処理を容易に実行できるオープンソフトウェアであり,図2のようにあるシーンをさまざまな位置から撮影した画像さえ用意すれば実行することができる.開発者はCornell UniversityのN. Snavely氏で,本稿執筆時の最新バージョンは0.4である.
図2 Bundlerに入力される画像群の例
なお,Bundlerが担当する処理は,特徴点群の最適な対応付けを求めるためのバンドル調整と因子分解である.その前処理となる特徴点抽出については,適当なオペレータを別途用意することになっている. README.txt ではD. G. Lowe氏のSIFT実装の利用方法を紹介しているが,スクリプトの軽微な修正によってR. Hess氏の実装など他のオペレータも使用可能である.
Bundlerのインストールは簡単である.アーカイブをダウンロード・展開してできる INSTALL.txt と README.txt を参考に,必要となるライブラリをインストールし,ソースをコンパイルをする.ここでは,Ubuntu 10.04 におけるインストール手順を示すが,他のディストリビューション・バージョンでも同様にインストールが可能である.
以下のライブラリをaptitudeやapt-getでインストールする.
Bundlerのアーカイブをダウンロードし,展開する.
% wget http://phototour.cs.washington.edu/bundler/distr/bundler-v0.4-source.tar.gz % tar zxvf bundler-v0.4-source.tar.gz % cd bundler-v0.4-source/ |
この時点でのカレントディレクトリを,以後 BUNDLER_PATH とする.
上述の通り,Bundlerには特徴点抽出処理は含まれないので,D.G. Lowe氏の実装をダウンロードし,実行バイナリを指定のディレクトリにコピーする.
% cd .. % wget http://www.cs.ubc.ca/~lowe/keypoints/siftDemoV4.zip % unzip siftDemoV4.zip % cp ./siftDemoV4/sift BUNDLER_PATH/bin |
Bundlerをコンパイルする.
% cd BUNDLER_PATH % make |
libANN_char.soへパスを通す. .bashrc や .zshrc に以下の1行を追記する.
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:BUNDLER_PATH/lib |
Bundlerの実行は至って簡単である.JPEG形式で保存された画像列をあるディレクトリ(image_dirとする)に格納し,そのディレクトリ上で RunBundler.sh スクリプトを実行すればよい.
% cd image_dir/ % BUNDLER_PATH/bin/RunBundler.sh |
このスクリプトは, image_dir 内の画像リストの作成,SIFTオペレータの実行,バンドル調整など,必要となる一連の処理を順に呼び出している.他のオペレータを使いたい場合など,一連処理の一部を他の手法に置き換えたい場合にはこのスクリプトを編集する.しかし,通常の使用であればこのスクリプトを書き換えること無く実行するだけで充分である.
実行後, image_dir 内に list.txt を含むいくつかのテキストファイルと bundle というディレクトリが生成される. list.txt は読み込まれた画像のリストである.その他のテキストファイルは一連の処理の中間データであり,ここでは説明を省略する.SFMの実行結果は, bundle ディレクトリ内に格納されている.このディレクトリ内にもいくつかファイルが存在するが,ここでは最も重要な2つのファイルは bundle.out と points***.ply を取り上げる.以下に,これらのファイルについて説明する.
Bundlerによって得られるSFM処理結果というべきファイルであり,各カメラの内部パラメータ(焦点距離・歪みパラメータ等),外部パラメータ(3次元位置・姿勢),各特徴点の3次元位置・色,その点の復元に使用された各画像の特徴点の情報が網羅されている.このファイルの構造を以下に示す.
冒頭の2行がヘッダであり,まず1行目にバージョン情報,2行目にカメラ数と3次元座標が得られた特徴点の数が記されている.
3行目以降は,記されたカメラ数分のカメラパラメータが列挙される.各カメラのパラメータは5行からなり,1行目は焦点距離fと歪みパラメータk1, k2,2~4行目はカメラの姿勢を表す回転行列R,5行目はカメラの位置を表す並進ベクトルtを示している.
すべてのカメラのパラメータが列挙されると,次に特徴点の情報が列挙される.各特徴点の情報は3行で表現され,1行目はその3次元位置,2行目は色情報である.3行目は少し複雑で,冒頭の自然数nはその特徴点に対応する点が映っている画像の枚数(視点の個数)である.この各画像に対して,(カメラ番号)・(そのカメラ画像内での2次元特徴点番号)・(X座標)・(Y座標)が列挙される.すなわち,この行は1+4n個という可変長の要素を持つ.
このファイルにはBundlerによって得られた各特徴点の3次元座標とカメラ位置が含まれる.これらはすべて上述の bundle.out に内在する情報だが,PLY形式で書かれているため,後述するMeshLab等の3次元点群表示・編集ソフトで開いて結果を視覚的に確認することができる.また,PLYファイルの読み書き用のライブラリ[7][8]も公開されており,これらを使用すれば特徴点に対する後処理のプログラムなどを容易に開発することができる.なお,ファイル名の *** には復元に使用されたカメラ数が入る.基本的には最も大きい値のファイルを確認すればよい.
MeshLabは,3次元の点群データやメッシュデータの表示・編集が可能なオープンソースプログラムである.Windows/Linux/MacOSXで動作し,各OS用のインストーラも提供されているため,容易に導入できる.Ubuntuの場合,MeshLabのパッケージが存在するので,インストーラを実行する必要すらなく,aptitudeやapt-getで直ちに導入できる.多くのファイルフォーマットをサポートしており,上述のPLY形式も開くことができる.また,点群に対するメッシュ生成,メッシュの位置合わせや統合,欠損修復などの関する最近の手法がいち早く実装されており,これらを容易に利用することができる点で非常に有益である.
このMeshLabで,上述の points***.ply を開いた様子を 図3 に示す.左側がフロントビュー,右側がサイドビューである.
図3 Bundlerで得られる疎な3次元点群とカメラ位置
図中の点線枠内の点が推定されたカメラ位置,それ以外の点がシーン中の3次元点群である.得られる3次元点群はSIFT特徴量で対応がとれた点のみのため,通常,シーン全体に対して密に得られることはなく,図のように疎な点群として得られる.
シーンの3次元形状復元の目的でSFMを用いる場合,上述のような疎な点群では充分な結果とは言えない.密なシーン形状を獲得するためには,このSFMの結果をもとにMulti-view Stereoなどの形状復元手法を適用しなければならない.このMulti-view Stereoの実装はいくつか存在するが,ここではBundlerとの親和性の高さからY. Furukawa氏らのPatch-based Multi-view Stereo Version 2 (PMVS2)を取り上げる.
実行手順は以下の通りである.まず,Bundlerに用意されている Bundle2PMVS コマンドを実行する.
% cd image_dir/ % BUNDLER_PATH/bin/Bundle2PMVS list.txt ./bundle/bundle.out |
これにより, imge_dir 内に pmvs というディレクトリが作成され,その中にいくつかのファイルも生成される.次に, pmvs/prep_pmvs.sh をエディタで開き,BUNDLE_BIN_PATHを以下のように書き換える.
書き換えたスクリプトを実行した後,最後にPMVS2を実行する.
% sh pmvs/prep_pmvs.sh % cd pmvs % PMVS2_PATH/program/main/pmvs2 ./ pmvs_options.txt |
3次元形状復元データは pmvs/models/ に生成される.同ディレクトリ内の pmvs_options.txt.ply をMeshLabで開いた様子を 図4 に示す.SFMの結果と比較してシーンが密に復元されている様子が確認できる.
図4 PMVS2で得られる密な3次元点群