Help us understand the problem. What is going on with this article?

Structure From Motion (SfM)を試す 〜 OpenMVG編 (Ubuntu 16.04) 〜

More than 1 year has passed since last update.

前回に続き、Structure From Motion (SfM) についての内容となります。

今回は、OpenMVG + OpenMVS を使い、複数枚の撮影画像から三次元モデルを作成してみました。
三次元モデルの表示には、MeshLab を使用しています。

※サンプルデータ実行→オリジナルデータ実行の順に記載しています。

OpenMVG

OpenMVG とは

Structure From Motion の手法を用いたライブラリになります。

実行環境

・Ubuntu 16.04 LTS

入力画像

・サンプルデータ
城の画像 11枚
https://github.com/openMVG/ImageDataset_SceauxCastle/tree/master/images

導入手順

  • 要求パッケージをインストール
sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libxxf86vm1 libxxf86vm-dev libxi-dev libxrandr-dev
  • Githubからソースコードをクローン&サブモジュールのアップデート
git clone --recursive https://github.com/openMVG/openMVG.git
  • ビルドディレクトリ作成
cd openMVG
cd ..
mkdir openMVG_Build
cd openMVG_Build
  • ビルド
cmake -DCMAKE_BUILD_TYPE=RELEASE . ../openMVG/src/
make 
もしくは(Nはコア数)
make -jN

参考)
https://github.com/openMVG/openMVG/blob/master/BUILD.md

実行

  • チュートリアル実行 以下の Python ファイルを修正する。
    openMVG/src/software/SfM/tutorial_demo.py.in の "@OPENMVG_SOFTWARE_SFM_BUILD_DIR@" 部分を
    /openMVG/src/build/Linux-x86_64-Release へのパスへ置き換えます。
# Indicate the openMVG binary directory
OPENMVG_SFM_BIN = "@OPENMVG_SOFTWARE_SFM_BUILD_DIR@"

# Indicate the openMVG camera sensor width directory
CAMERA_SENSOR_WIDTH_DIRECTORY = "@OPENMVG_SOFTWARE_SFM_SRC_DIR@" + "/../../openMVG/exif/sensor_width_database"
  • Python実行
python tutorial_demo.py.in

実行後 /tutorial_out フォルダが生成され、点群情報のファイルが作成されます。

次に、生成されたファイルを確認します。

MeshLab

MeshLab を使い、生成した点群データを読み込みます。

MeshLab とは

MeshLab は、三角形メッシュの処理と編集を行うオープンソースシステムです。
メッシュの編集、クリーニング、修復、検査、レンダリング、テクスチャリング、
および変換のための一連のツールを提供します。

参考)
http://www.meshlab.net/
https://qiita.com/yuzsh/items/ab2869345f5e9e499199

導入手順

sudo apt-get install meshlab

実行

MeshLab を起動します。

meshlab

点群データの読み込み

先ほど生成した以下のファイルを読み込む事で、カラー情報を含んだ点群データを表示出来ます。
[Path to OpenMVG]/src/software/SfM/tutorial_out/reconstruction_sequential内の colorized.ply

MVG_S1.png

OpenMVS

OpenMVS を使い、密な点群を再構築します。

OpenMVS とは

点群データを使って、より密な点群を求めるの Multi-View Stereo という手法を使ったライブラリになります。

参考)
https://blog.negativemind.com/2016/08/31/openmvs-sample/

導入手順

ビルド

以下のページ内の手順通りにビルドを実行します。
https://github.com/cdcseacave/openMVS/wiki/Building#linux-compilation

実行

OpenMVGからOpenMVSのプロジェクトファイルへ変換する

OpenMVG の openMVG_main_openMVG2openMVS を使用し、
先ほど出力した sfm_data.bin を scene.mvs ファイルへ変換します。

cd <path to openMVG>/src/build/Linux-x86_64-Release
./openMVG_main_openMVG2openMVS -i ../../software/SfM/tutorial_out/reconstruction_sequential/sfm_data.bin -o ../../software/SfM/tutorial_out/reconstruction_sequential/scene.mvs

密な点群データ作成

  • 以下のフォルダに入力画像をあらかじめ OpenMVG で使用した画像を入れておきます。

[path to openMVS]/openMVS_build/bin/undistorted_images/

  • 実行
cd <openMVS>/openMVS_build/bin/
./DensifyPointCloud <openMVG>/src/software/SfM/tutorial_out/reconstruction_sequential/scene.mvs

※エラー対応メモ
・scene.mvs を生成場所から移動して実行していまうと「入力画像がありません」エラーが発生する
[App ] error: failed loading image header
[App ] error: failed reloading image '〜/undistorted_images/100_7100.JPG'
[App ] error: invalid project

MeshLab で表示
  • scene_dense.ply が生成されるので MeshLab で読み込みます。

MVG_S2.png

密な点群データが表示されています。

テクスチャー適応

  • ラフなメッシュの再構築
cd <path to openMVS>/openMVS_build/bin/ && ./ReconstructMesh <path to openMVG>/src/software/SfM/tutorial_out/reconstruction_sequential/scene_dense.mvs
  • テクスチャーを貼る
cd <path to openMVS>/openMVS_build/bin/ && ./TextureMesh <path to openMVG>/src/software/SfM/tutorial_out/reconstruction_sequential/scene_dense_mesh.mvs
MeshLab で表示
  • scene_dense_mesh_texture.ply が生成されるので MeshLab で読み込みます。

MVG_S3.png

綺麗な三次元データが表示されています。

オリジナルデータ

次にオリジナルデータで試してみました。

入力画像

・オリジナルデータ
スマートフォンで自ら撮影した箱の画像 14枚(全方向から撮影しています)

MVG_S4.png

カメラデーターベース登録

撮影したスマートフォンカメラの物理的なセンサーサイズの横幅を
sensor_width_camera_database.txt に登録する必要があります。
※使用するカメラが既に登録済みであれば必要はありません。
※登録方法は以下のサイトを参考にしました。
http://blog.goo.ne.jp/yoossh/e/cb24d1dbe945bea3b572e15faba9a64c

・登録先ファイル名
openMVG/src/openMVG/exif/sensor_width_database/sensor_width_camera_database.txt

実行

サンプルデータと同様に実行しました。

sfm_mvs.gif

綺麗な箱の三次元データが表示されました。

以上、今回は OpenMVG + OpenMVS を使い、複数枚の撮影画像から三次元モデルを作成してみました。

i-enter
「効果」をつねに提供します。スマホアプリ開発No.1の実績。最新のIoTに対応した開発も行います。
https://www.i-enter.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした