Blender
VisualSFM
コンピュータービジョン

VisualSFMのカメラ情報をblenderで読み込む

More than 1 year has passed since last update.

VisualSFMで復元したカメラ情報のblenderへの読み込みは既に他の方々が色々試してコードも公開してくれています。

本記事は、とある公開されているコードを自分用に少し改変したので、そのまとめです。


やりたいこと

VisualSFM(とPMVSあるいはCMPMVS)で復元した3DデータをBlender上で撮影視点と重なるようにレンダリングしたい。下図のようなイメージ。

flow.jpg


実行環境


  • windows 8.1(64ビット)

  • VisualSFM v0.5.26

  • blender 2.7.6b

※試していませんが、ソフトのバージョンはもっと古くても大丈夫だと思います。


VisualSFMとは

被写体を写した複数枚の画像から、それぞれの撮影視点間の位置や向き、焦点距離を推定したり、撮影シーンの3次元情報を復元してくれるソフトです。但し、動的なシーンへの適用は難しいと思います。

以下のページで公開されています。

http://ccwu.me/vsfm/


VisualSFMからBlenderへのカメラ情報のインポート


ソースコード

解説記事は以下のページです。

Importing Bundler Scenes to Blender (G'raffics)

http://koelzk.crispy-cow.de/article/9/importing-bundler-scenes-to-blender

今回ベースとしたのは以下のコードです。

https://github.com/soniquev8/VSFMBundle_to_Blender/blob/master/import%20vsfm.py

これをもとに改変したコードは以下です。

https://github.com/kibekibe/VSFMBundle_to_Blender/blob/multi_cameras/import%20vsfm.py


変更点



  • Blender上のビュートラック操作を考慮した座標変換を削除


    • 理由は、VisualSFMやCMPMVSで出力したPLYファイルと座標系を揃えたいから。

    • Blenderでは、XY平面を地面と見なして、それに合わせたトラックボール操作ができるようになっていると思います(間違ってたらご指摘ください)。

    • 一方でVisualSFMが推定するシーンの座標系は、XY平面が地面とは限りません。

    • そこで、オリジナルのソースは、Blenderでトラックボール操作しやすくなるように、VisualSFMが推定したカメラ位置を座標変換していると思います。

    • そうすると、VisualSFMで復元した3Dモデルも同じように座標変換してあげないといけないのですが、面倒だったので、今回改変したソースでは、いっそのこと、この座標変換をしないことにしました。




  • 1台のカメラを時間方向に視点を変える代わりに、撮影枚数と同じ台数のカメラを生成。


    • blenderへの読み込み後に、手動でカメラ位置をまとめて動かしたいため(それしか方法を知らないだけで、もっと良い方法があるかもしれません)。




インポート方法

まず上記スクリプトをアドオンとして登録します。

登録はBlender上で行います。

Blenderを起動します。

メニューの「ファイル」から「ユーザー設定...」を選択します。

するとBlenderユーザー設定というタイトルのウィンドウ(正式にはユーザー・プリファレンスのウィンドウ?)が表示されます。

usersetting.jpg

次にアドオンパネルを表示します。

そして、ダイアログの下部にある「ファイルからインストール」ボタンを押して、上記のスクリプト(import vsfm.py)を選択します。

addon_regist_RedCircle.jpg

すると、「Import-Export: import VSFM camera」というアドオンがあるはずですので、右側のチェックボックスにチェックを入れます。

addon_active_redcircle.jpg

チェックを入れたら、このウィンドウは閉じて、メニューの「ファイル」→「インポート」を見てみます。

「VSFM CamerasFile(txt)」という項目があればアドオン登録は完了です。

あとは、この項目を選択して、cameras_v2.txtを選択すればカメラのインポートができます。

cameras_v2.txtはVisualSFM上でPMVSを実行すると生成されるフォルダにあります(以下の図参照)。

import_camera_v2.jpg

読み込みが完了すると、VisualSFMで推定したカメラ情報に基づいて各撮影視点のカメラがシーンに生成されます。

以下の図では、復元された3Dモデルも既にインポートしています。ちなみに3DモデルはCMPMVSを使って復元しました。(CMPMVSは→http://ptak.felk.cvut.cz/sfmservice/websfm.pl?menu=cmpmvs)

blender_after_import.jpg

これで、あとは、お好みのカメラを選択してレンダリングすれば、撮影画像に重畳することができます。↓こんなカンジ。左から順に、撮影画像、Blenderでレンダリングした画像、左2枚を重ね合わせた画像。

result_3.jpg

以下参考文献

【VisualSFM】

Structure from Motion

[1] Changchang Wu, "Towards Linear-time Incremental Structure From Motion", 3DV 2013

[2] Changchang Wu, "VisualSFM: A Visual Structure from Motion System", http://ccwu.me/vsfm/, 2011

Bundle Adjustment

[3] Changchang Wu, Sameer Agarwal, Brian Curless, and Steven M. Seitz, "Multicore Bundle Adjustment", CVPR 2011

Feature Detection

[4] Changchang Wu, "SiftGPU: A GPU implementation of Scale Invaraint Feature Transform (SIFT)", http://cs.unc.edu/~ccwu/siftgpu, 2007

【CMPMVS】

[5] M. Jancosek, T. Pajdla. Multi-View Reconstruction Preserving Weakly-Supported Surfaces, CVPR 2011 - IEEE Conference on Computer Vision and Pattern Recognition 2011