複数視点画像から3次元形状を復元するライブラリ『openMVG』

最近、この手の2D→3D復元系のライブラリを色々と調べている。何となく、自分で3D復元ツールを作ってみたくてね。

この間のOpenGVは複数画像からカメラ(視点)の3次元位置・姿勢を推定するライブラリだった。↓



こっちのopenMVG(Multiple View Geometry)は、名前の通り、複数視点から3次元形状を復元するためのオープンソースのライブラリ。(中身の処理はあんまり違いが無い気もする)
ライセンスはMPL(Mozilla Public License)2.0なので、商用利用も可能。

openMVG: “open Multiple View Geometry”

openMVG

“open Multiple View Geometry”は、コンピュータビジョン研究者、特にMultiple View Geometryのコミュニティを対象としたライブラリです。このライブラリは、多視点幾何における古典的な手法を簡単に扱うことができ、多視点幾何の問題を正確に解けるように設計されています。
openMVGのポリシーは「シンプルに保つ、メンテナンス性を保つ」です。OpenMVGは、コミュニティでの変更が行いやすいように、コードの可読性を重視しています。機能とモジュールは全てユニットテスト済みです。このテスト駆動開発によって、コードの動作と再現性を保証します。また、この構造はユーザーが特定の機能を学び、理解する助けとなるでしょう。
より詳しく知りたい場合は、openMVG GitHubのリポジトリをご覧ください。


スポンサーリンク

と、公式ページに書いてあるので、アルゴリズムのお勉強にも有用なのではないでしょうか。公式ドキュメントはこちら


スポンサーリンク


以前Structure from Motionを調べた時にチラホラとopenMVGという名前は聞いてたんだけど、その頃はコンピュータビジョンについて知らなさ過ぎてスルーしちゃってた。
Structure from Motion (多視点画像からの3次元形状復元)
3DCGをガッツリ学んでたもんで、「2次元の画像処理よりも3次元のCGの方が抽象度が高くて美しい」という感覚があって、コンピュータビジョンに対して「お前らとは次元が違うんだよ」とか思ってたんだけど、最近のコンピュータビジョンは結構3次元なの...


Youtubeを見ると、openMVGとPMVS(Patch-based Multi-view Stereo Software)というツールと併用して3次元復元した動画がいくつかアップされている。

OpenMVG+PMVS dense cloud reconstruction

OpenMVG 3D reconstruction sparse vs dense

公式ページに

openMVG provides complete Structure from Motion implementations:
a sequential pipeline
a global pipeline

って書いてあるけど、”complete Structire from Motion implementations”ってのはカメラ姿勢と疎な点群の復元までですかね。

追記:openMVGにGUIを付けたツールを見つけた↓



スポンサーリンク

関連記事

HerokuでMEAN stack
Unityの各コンポーネント間でのやり取り
TensorFlowでCGを微分できる『TensorFlow Graphics』
OpenMVSのサンプルを動かしてみる
Unityで使える数値計算ライブラリ『Math.NET Numerics』
OpenCVのfindEssentialMat関数を使ったサンプルを読んでみる
C++ 標準テンプレートライブラリ (STL)
HD画質の無駄遣い その2
コンピュータビジョンの技術マップ
2D→3D復元技術で使われる用語まとめ
写真に3Dオブジェクトを違和感無く合成する『3DPhotoMagic』
オープンソースの顔認識フレームワーク『OpenBR』
WordPress on Google App Engineを1週間運用してみて
オーバーロードとオーバーライド
Raspberry PiのGPIOを操作するPythonライブラリ『RPi.GPIO』の使い方
オープンソースのStructure from Motionライブラリ『Theia』
ブログをGoogle App EngineからAmazon EC2へ移行
OpenCV 3.3.0 contribのsfmモジュールのサンプルを動かしてみる
YOLO (You Only Look Once):ディープラーニングによる一般物体検出手法
タマムシっぽい質感
iOSデバイスのためのフィジカル・コンピューティングツールキット『konashi(こなし)』
SSII 2014 デモンストレーションセッションのダイジェスト動画
IronPythonを使ってUnity上でPythonのコードを実行する
Web経由でRaspberry PiのGPIOを操作したい
網元AMIで作ったWordpressサイトのインスタンスをt1microからt2microへ移行した
UnityでLight Shaftを表現する
プログラミングスキルについて考える
Unityで画面タッチ・ジェスチャ入力を扱う無料Asset『TouchScript』
画像中の人物表面のUV座標を推定する『DensePose』
「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
PSPNet (Pyramid Scene Parsing Network):ディープラーニングによ...
3分の動画でプログラミングを学習できるサイト『ドットインストール』
オープンソースの顔の動作解析ツールキット『OpenFace』
ニューラルネットワークと深層学習
AR (Augmented Reality)とDR (Diminished Reality)
軽量なジオメトリ処理ライブラリ『libigl』
オープンソースのPhotogrammetryフレームワーク『Alice Vision』
SSII2014 チュートリアル講演会の資料
ディープラーニングに対応したPythonの機械学習ライブラリ『Pylearn2』
FacebookがDeep learningツールの一部をオープンソース化
Structure from Motion (多視点画像からの3次元形状復元)
iPhoneで3D写真が撮れるアプリ『seene』

コメント

  1. 千里 より:

    面白いブログ、ありがとうございます。
    OpenMVGについての質問ですが、複数のカメラ画面から室内の立体空間を再現する上、特定の場所にものが置いているかを判別することが可能ですか?もし、可能なら、その場合、カメラの台数や、撮影角度について、要求がありますか?

    • NegativeMind より:

      こんにちは。

      openMVGは画像から3次元形状を復元するためのライブラリですので、「特定の場所に物が置いてあるかを判別する」という目的での使用には適していません。
      要件を聞く限り、単純に2次元の背景差分で対処できる気がします。

      カメラを固定しておけば、「物が無い状態」と「物がある状態」で撮影画像の特定の領域の画素だけが変化しますので、その変化を検出すれば目的を果たせるのでは?

      OpenCVの背景差分機能や、BGSLibraryという背景差分用のライブラリを試してみてはいかがでしょうか?

      • 千里 より:

        早速のご返事、大変ありがとうございます。
        今回対象となっているのは、以下のような駐輪場です。
        http://www.sagamiharashi-machimidori.or.jp/img/uploads/3/20071023093446_1.jpg
        比較的に少ないカメラによって、各場所に自転車が止まっているかを判別したいです。

        自転車が重なっているため、背景差分だけでは、判別しにくいかと考えております。
        撮影場所によりますが、各場所を区切って空間情報を抽出して、その空間にものがあるかを判別できるなら、比較的に判別しやすいかもしれません。
        素人の考えですみませんが、色々と教えて頂ければ、幸いです。

        • NegativeMind より:

          なるほど、自転車の有無を検出したいのですか。確かに背景差分は難しそうですね。
          この場合、画像認識で対処するより、安価な物理的なスイッチ、あるいは距離センサーを各スペースに設置した方が確実な気はします。(お金かかりますね…)

          リンクの画像を見てふと思ったのですが、駐輪場に止まるのが自転車限定であれば、車輪(楕円形状)を検出するのもアリかもしれません。
          利用者がルール通りに駐輪してくれると仮定すると、撮影画像上での車輪(楕円形状)の位置はおおよそ予想がつきますから、その位置にならぶ楕円の数を数えるとか。
          遮蔽の関係で上手く検出できるか保証できませんが、カメラの配置を工夫して自転車の後輪が必ず撮影できるように設置してみれば実験ぐらいはできるかも。

          すみません、ちょっとお役に立ててないかも・・・

          ちなみに、openMVGを使って3次元復元する場合でも、各自転車が重なって写ったままの画像からは正しく形状復元できません。