画像から3次元形状を復元!OpenMVGでSfMを試してみた

今回は2次元の形状からカメラ位置や3次元形状を特定する手法である、SfM(Structure from Motion)を試してみます。

SfMを手軽に実行出来るツールとして、

等があります。

Bundlerはオープンソースですがソースの中身が整理されておらず、VisualSFMはオープンソース化されておりません。
そんな中最近OpenMVG(open Multiple View Geometry)というライブラリが出来た様です。
こちらはソースコードがかなり綺麗にメンテナンスされ、ユニットテストもきちんと書かれています。
ただ、ネット上で検索したところ日本語の情報が殆ど見つからなかったので、このソースコードを使って実際にSfMを実行してみたいと思います。

必要なもの
  • OpenMVG(今回はmac上でビルド、windowsでも可)
  • PMVS(windows用のバイナリを使用)
  • MeshLab(点群のビューワーとして利用)
疎な点群を得る手順(以下mac上で実行)

1. ここからOpenMVGのソースコードを取得します。

2. ビルド

 $ ls
     AUTHORS BUILD  docs  logo  README.md  src  ...
 $ cd ..
 $ mkdir openMVG_Build
 $ cd openMVG_Build
 $ cmake -DCMAKE_BUILD_TYPE=RELEASE -G "Xcode" . ../openmvg/src/
 $ xcodebuild -configuration Release

3. 生成物の確認

 $ pwd
      /Users/******/openMVG_Build
 $ ls software/SfM/Release/
     openMVG_main_computeMatches  openMVG_main_IncrementalSfM ...

4. 画像の準備
自前で準備してももちろん良いのですが、画像によってはうまく3次元化が出来ない場合があります。
今回は、Bundlerに同包されている画像を流用する事にします。



5. 対応点の検出
事前にフォルダを幾つか作成しておきます。

 $ mkdir software/SfM/images && mkdir software/SfM/matches && mkdir software/SfM/outReconstruction

また先ほど用意したET画像をimagesフォルダ直下に配置します。
続いて、以下のコマンドを実行します。

 $ software/SfM/Release/openMVG_main_computeMatches -i software/SfM/images -e *.jpg -o software/SfM/matches

6. 3次元化の実行
次のコマンドを実行します。

 $ software/SfM/Release/openMVG_main_IncrementalSfM -i software/SfM/images/ -m software/SfM/matches/ -o software/SfM/outReconstruction/ -p 1

すると、以下のエラーが発生します。

One of the input required file is not a present (lists.txt, matches.h.txt, matches.f.txt, K.txt)

これは校正行列が書かれたファイルが存在しないために起こるエラーです。

 $ cat software/SfM/images/K.txt
     700 0 320
     0 700 240
     0 0 1

となるようにK.txtファイルを用意して、再度openMVG_main_IncrementalSfMを実行します。
※700は焦点距離を表していますが、本来はカメラ校正を行って求めるべき値です。
今回は3次元化がうまく出来るように実験的に数字を求めてます。


途中で

type INITIAL pair Indexes: X enter Y enter

と求められるので、
0 [Enter]
3 [Enter]
として実行してみました。

ここで得られた点群はとても疎であるため、続いてPMVSを用いて密な点群を求めます。
software/SfM/outReconstruction/PMVSフォルダをwindowsマシンにコピーしておきます。

密な点群を得る手順(以下windows上で実行)

1. ここからPMVSのwindows用バイナリを取得します。

2. 先ほどのPMVSフォルダをカレントディレクトリに設定した状態で、

 $ CMVS-PMVS/binariesWin-Linux/Win64-VS2010/pmvs2.exe ./ pmvs_options.txt

と実行します。
すると、PMVS/models/pmvs_options.txt.plyファイルが生成されます。

3. MeshLabでpmvs_options.txt.plyを開きます。

このように9枚のET画像から3次元のETを復元する事が出来ました。


以上、駆け足でしたがSfMを試すことが出来ました。
いかがでしたでしょうか。身の回りの写真で色々試してみると面白いかもしれませんね。


SfMを含めコンピュータビジョン全般についてかなり詳しく書かれてます。

4章でOpenCVを使ったSfMが紹介されてます。(サンプルコードもダウンロード出来ます。)

PMVSを開発した方の解説記事が載っています。