SfM/MVSによる画像からの3Dデータ生成

対象物体の表面形状を3Dデータ化することを目的として、以下の条件を満たした上で実現可能な技術を調査し、3D計測技術の中からSfM/MVS技術を採用しました。 複数枚の写真に写る対象物体がSfM/MVS技術を使って3Dデータ化されるプロセスを、実例と合わせてご紹介します。

はじめに

 

対象物体の表面形状を3Dデータ化することを目的として、以下の条件を満たした上で実現可能な技術を調査し、3D計測技術の中からSfM/MVS技術を採用しました。

条件

  • 対象物体が大型な場合とする
  • 対象物体が離れた場所にあるとする(10m~20m)
  • 使用機材は導入しやすいものとし、特殊な機材は使わないこと
  • 低コストであること

3Dデータ化したい対象物体を、市販のカメラで複数枚撮影するだけで3Dデータを作成できるのがSfM/MVS技術です。「SfM(Structure From Motion)多視点画像からの3D形状復元」で生成されるのは、低密度な点で構成された3Dデータです。高密度な点群データを生成するために「MVS(Multi-View Stereo)多眼ステレオ」を使います。

対象物体が大きい/離れた場所にあるなどの場合に、3D計測技術の中でもこのSfM/MVS技術が適しています。必要な機材も市販のカメラがあればよく、低コストで導入できるのもたいへん魅力的です。
ドローンによる空撮画像にこの技術を使い、地形測量や遺跡調査もおこなわれています。

ただし、SfMでは大きさ(スケール)は算出されませんので、測量用途の場合は指標となるマーカーも含めて撮影し、生成された3Dデータの寸法を補正する必要があります。


複数枚の写真に写る対象物体がSfM/MVS技術を使って3Dデータ化されるプロセスを、実例と合わせてご紹介します。

3Dデータ生成の実例:凹凸のある壁

まずは、こちらの結果をご覧ください。

表面に適度な凹凸をもつ大きな壁を対象物体としました。

凹凸のある壁の写真

生成された3Dデータを MeshLab というフリーソフトで表示します。MeshLab については後述します。

凹凸のある壁の写真から生成された3DデータをMeshLabで表示させたアニメーション

使用した機材

カメラ

SONY α7 II

PC

  • OS:Ubuntu
  • メモリ:16GiB
  • プロセッサ:Intel Core i7-8550U CPU 1.80Ghz x 8
  • グラフィック:Intel UHD Graphics 620 (Kabylake GT2)
  • OSの種類:64ビット
  • ディスク:500GB

使用した画像

対象物体から3mほど離れた場所から撮影した17枚の画像を使用しました。

凹凸のある壁の写真セット
  • サイズ:1968 ☓ 1312 px(元データ 6000 ☓ 4000 px を縮小)
  • 解像度:350 dpi
  • 焦点距離:49mm

サンプル画像:sample.zip (40.5MB)

3Dデータ生成にかかった時間

約3分30秒

3Dデータ生成までのプロセス

下記のプロセスで3Dデータを生成します。

3Dデータ生成までのプロセス

1. 撮影

  • 対象物をカメラで複数枚撮影

2. SfM(Structure From Motion)多視点画像からの3D形状復元

  • 画像に写っている特徴点を手がかりとして撮影時のカメラ位置を算出
  • 特徴点から三角測量により復元された低密度点群データを生成

3. MVS(Multi-View Stereo)多眼ステレオ

  • 高密度点群データを生成
  • テクスチャ付きのポリゴンモデルを生成

この中で特に「撮影」は、結果を左右する最も重要なプロセスです。隣接画像で共通する特徴点を抽出するために、特徴点を十分に得られる写真を撮らなければならないからです。

SfMではOpenMVG、MVSではOpenMVSというライブラリをそれぞれ使用します。

撮影条件の注意点

特徴点を十分に得られる写真を撮るために、以下のような撮影条件の注意点があります。

オーバーラップ率80%以上

同じ領域が複数枚の写真に映るように撮影することをオーバーラップといいます。連続する2枚の写真の80%が同じ領域となるように撮影します。

オーバーラップ図

対象物体の形状に合わせた撮り方

対象物体の大きさや撮影距離、凹凸の具合に応じた撮影方法があります。

石像や岩など(小~中型)
石像や岩など小型や中型物体の撮影方法
カメラを対象物体に向けて円を描くように複数の角度から高密度に撮影します。
地形や建物など(大型)
地形や建物など大型物体の撮影方法
対象物に対して平行移動で撮影します。
正面から撮影した写真ばかりだと、実際とは異なる歪みが生じる(ドーミング)ため、対策と精度の向上のために、20度を超えない角度で内側に向けて斜めに撮影した写真を追加します。

カメラの設定

撮影した画像データの質は、生成される3Dデータの精度に影響を与えます。対象物体がブレていたり画像にノイズが入っていると期待する結果を得られない可能性が高いです。

より質の高い画像データを得るために、カメラの設定を行う場合は、撮影場所の環境に合わせて次のことを意識して調整してください。

  • F値:高めに(高すぎると画質が低下する)
  • シャッタースピード:可能な限り短くする(ブレを防ぐ)
  • ISO感度:可能な限り低くする(ノイズを減らして画質を高める)
  • 焦点距離:画像ごとに変わらないよう固定する
  • ※明るさが不十分な場合はソフトウェアで調整する

実例の対象物体は、「環境が違っても、誰が撮っても、十分な精度の結果が得られること」を前提としていたためオートモードで撮影しました。また、焦点距離が異なる画像が含まれていると3Dデータの生成に失敗したため焦点距離を固定して撮影しました。

SfM/MVSによる3Dデータ生成

次に、SfM/MVS処理をおこなうための環境を構築します。以下にUbuntu (Linux)環境での構築例を示します。

PCスペック

  • OS:Ubuntu
  • メモリ:16GiB
  • プロセッサ:Intel Core i7-8550U CPU 1.80Ghz x 8
  • グラフィック:Intel UHD Graphics 620 (Kabylake GT2)
  • OSの種類:64ビット
  • ディスク:500GB

下準備

ライブラリをインストールするために、以下のツールを準備しました。

C/C++コンパイラ

C++11対応のコンパイラが必要です。
Visual Studio、GCC、Clang
CMakeを実行するために使用します。

CMake

CMakeは開発環境に合わせたビルドファイルを生成するツールです。
ライブラリをビルドするために使用します。

Git

Gitはファイルの変更履歴を保持するバージョン管理システムです。
ライブラリのソースコードをGitHubからクローンしてビルドするために使用します。

ライブラリのインストール

OpenMVG

OpenMVGは複数枚の画像からSfM技術で低密度点群データを生成するライブラリです。
ドキュメント:https://openmvg.readthedocs.io/en/latest/

Ubuntuコマンドライン

#必要な外部ライブラリをインストール
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

#ビルドディレクトリ作成
mkdir openMVG_Build &&  cd openMVG_Build

#ビルド
cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/
cmake --build . --target install

#makeまたはctestを使用してテストを実行
#CMakeコマンドラインで要求された場合-DOpenMVG_BUILD_TESTS=ON
make test
ctest --output-on-failure -j
						

OpenMVS

OpenMVSは低密度点群データを使用して、MVS技術で高密度点群データを生成するライブラリです。

Ubuntuコマンドライン

#パッケージのアップデートとインストール
sudo apt-get update -qq && sudo apt-get install -qq

#必要な外部ライブラリをインストール
sudo apt-get -y install git mercurial cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev

#cmake時にvcglibの場所を指定するために代入
main_path=`pwd`

#Eigenビルド (必須)
hg clone https://bitbucket.org/eigen/eigen#3.2
mkdir eigen_build && cd eigen_build
cmake . ../eigen
make && sudo make install
cd ..

#Boostインストール (必須)
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev

#OpenCV開発用パッケージインストール (必須)
sudo apt-get -y install libopencv-dev

#CGALインストール (必須)
sudo apt-get -y install libcgal-dev libcgal-qt5-dev

#VCGLibインストール (必須)
git clone https://github.com/cdcseacave/VCG.git vcglib

#Ceresインストール (オプション)
sudo apt-get -y install libatlas-base-dev libsuitesparse-dev
git clone https://ceres-solver.googlesource.com/ceres-solver ceres-solver
mkdir ceres_build && cd ceres_build
cmake . ../ceres-solver/ -DMINIGLOG=ON -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j2 && sudo make install
cd ..

#GLFW3インストール (オプション)
sudo apt-get -y install freeglut3-dev libglew-dev libglfw3-dev

#OpenMVSビルド
git clone https://github.com/cdcseacave/openMVS.git openMVS
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="$main_path/vcglib"
※$main_path 部分は、お使いの環境に合わせて書き換えてください

#OpenMVSを共有ライブラリとして使用する場合はCMakeコマンドに追加
-DBUILD_SHARED_LIBS=ON

#OpenMVS ライブラリインストール (オプション)
make -j2 && sudo make install
						

実行用ディレクトリ作成

下図の構成になるよう新規フォルダを作成します。

実行用ディレクトリ構成
  • images(処理対象の写真を置くフォルダ)
  • matches(特徴点およびマッチング結果を保存するためのフォルダ)
  • outReconstruction(生成された3Dデータ保存先フォルダ)
  • sensor_width_camera_database.txt(カメラ情報データベース)

※openMVG/src/openMVG/exif/sensor_width_databaseからsensor_width_camera_database.txtをimagesフォルダの親階層にコピー

実行ファイル

以下の順番でツールを実行します。

  1. カメラ情報と画像ファイルのリストアップ実施

    openMVG_main_SfMInit_ImageListing [OpenMVG]
    input:imagesフォルダ内の画像ファイル
    output:matchesフォルダに複数ファイル
    openMVG_main_SfMInit_ImageListing -i SfMTest/images/ -d SfMTest/sensor_width_camera_database.txt -o SfMTest/matches/

  2. 特徴点の抽出

    openMVG_main_ComputeFeatures [OpenMVG]
    input:sfm_data.jsonファイル
    output:matchesフォルダに複数ファイル
    openMVG_main_ComputeFeatures -i SfMTest/matches/sfm_data.json -o SfMTest/matches/

  3. 一致する特徴点の探索

    openMVG_main_computeMatches [OpenMVG]
    input:sfm_data.jsonファイル
    output:matchesフォルダに複数ファイル
    openMVG_main_ComputeMatches -i SfMTest/matches/sfm_data.json -o SfMTest/matches/

  4. 3Dモデル化とバンドル調整

    openMVG_main_IncrementalSfM [OpenMVG]
    input:sfm_data.jsonファイル
    output:outReconstructionフォルダにcloud_and_poses.ply(低密度点群データ)ほか複数ファイル
    openMVG_main_IncrementalSfM -i SfMTest/matches/sfm_data.json  -m SfMTest/matches/ -o SfMTest/outReconstruction/

  5. mvsプロジェクトファイルに変換

    openMVG_main_openMVG2openMVS [OpenMVG]
    input:sfm_data.binファイル
    output:scene.mvsファイル
    openMVG_main_openMVG2openMVS -i SfMTest/outReconstruction/sfm_data.bin -d SfMTest/outReconstruction/ -o SfMTest/outReconstruction/scene.mvs

  6. 高密度点群データ生成

    DensifyPointCloud [OpenMVS]
    入力:scene.mvsファイル
    出力:scene_dense.plyファイル(高密度点群データ)
    openMVS_build/bin/DensifyPointCloud SfMTest/outReconstruction/scene.mvs

時間がかかる処理もあるので、以下のようなシェルスクリプトファイルを作成して実行すれば、上記の実行ファイルが一括処理されるので簡単です。
シェルスクリプトサンプルファイル:sample.sh (687バイト)

上記ファイルの内容

#保存用フォルダの中身を空にする
rm -r *.log
rm -r *.dmap
rm -r SfMTest/matches/*
rm -r SfMTest/outReconstruction/*

#カメラ情報と画像ファイルのリストアップ実施
openMVG_main_SfMInit_ImageListing -i SfMTest/images/ -d SfMTest/sensor_width_camera_database.txt -o SfMTest/matches/

#特徴点の抽出
openMVG_main_ComputeFeatures -i SfMTest/matches/sfm_data.json -o SfMTest/matches/

#一致する特徴点の探索
openMVG_main_ComputeMatches -i SfMTest/matches/sfm_data.json -o SfMTest/matches/

#3Dモデル化とバンドル調整
openMVG_main_IncrementalSfM -i SfMTest/matches/sfm_data.json  -m SfMTest/matches/ -o SfMTest/outReconstruction/

#mvsプロジェクトファイルに変換
openMVG_main_openMVG2openMVS -i SfMTest/outReconstruction/sfm_data.bin -d SfMTest/outReconstruction/ -o SfMTest/outReconstruction/scene.mvs

#高密度点群データ生成
openMVS_build/bin/DensifyPointCloud SfMTest/outReconstruction/scene.mvs
					

3Dデータ表示

MeshLab

MeshLabは3Dデータの表示・編集・変換などをおこなう無料ソフトウェアです。
生成された scene_dense.ply ファイルを読み込むと確認することができます。
3Dデータサンプルファイル:sample.ply (25.3MB)

3Dデータ生成の失敗例と原因

撮影条件を満たしていない画像や、色や形状の特徴が対象物体として適さない場合は、結果に大きな影響を与えることが分かりました。失敗例と原因は次のようなものです。

オーバーラップ率の低い撮影

点字ブロック

点字ブロックの写真

写真の赤い丸どうし、緑の丸どうしが同じ場所を示していますが、オーバーラップ率が低すぎるため特徴点を十分に得られず、次のような結果になりました。

点字ブロックの写真を使ったSfM処理結果の画像
SfM
点字ブロックの写真を使ったMVS処理結果の画像
MVS(生成失敗)

単調な形状の対象物体

シャッター

シャッターの写真

写真のように同じ模様の繰り返しで特徴的な部分が少ない物体の場合は、オーバーラップ率の高い写真を多く撮影しても特徴点が取れないため、欠けた状態で出力されてしまいました。8枚の写真を使いましたがカメラ位置(左画像の緑点)が3点しか取れていないことからも分かります。

シャッターの写真を使ったSfM処理結果の画像
SfM
シャッターの写真を使ったMVS処理結果の画像
MVS

工事現場の仮囲い

工事現場の仮囲いの写真

こちらも同様に単調な形状のため、期待する結果は得られませんでした。物体の形状もカメラ位置も正しいものがありません。

工事現場の仮囲いの写真を使ったSfM処理結果の画像
SfM
工事現場の仮囲いの写真を使ったMVS処理結果の画像
MVS(生成失敗)

ハイライトの白飛びやシャドウの黒潰れによる情報欠損

造花の置物

造花の置物の写真
造花の置物の写真を使ったMSV処理結果の画像

そこまで明るい/暗いと感じない部分まで抜けてしまいました。特徴の少ない白や黒い物体はこのような結果になる可能性が高いです。その他に、透明なものや光沢があるものも対象物体としては向いていません。フォトレタッチソフトで画像を加工するとこの問題が解消される可能性はあります。

3Dデータ生成のソフトウェアについて

SfM / MVS の処理をおこなうソフトウェアはいろいろあります。OpenMVG / OpenMVS のみを使用するよりも簡単で高速に高精度の3Dデータを生成できます。

Regard3D

Regard3Dはオープンソースの無料ソフトで、OpenMVGの機能をGUIで使えるようにしたツールです。高密度データの生成も可能です。

Regard3Dで低密度データを開いた画面
Regard3Dで高密度データを開いた画面

Metashape

Metashapeは有料ソフトですが、無料の評価版を試すことができます。

Metashapeで高密度データを開いた画面
Metashapeで高密度データを開いた画面

起動すると以下のような選択画面になるので、いずれかを選んでください。「Continue using Metashape Professional in demo mode」はプレビューとして使うには十分でした。

Metashapeを起動した直後の画面
Activate Metashape Professional using a valid license code
ライセンスキーを入力して製品版を使えます。
Start a free 30-day traial
30日間無料試用版です。全機能が利用でき、プロジェクトの保存や生成したモデルの出力も可能です。
Continue using Metashape Professional in demo mode
デモモードです。プロジェクトの保存や生成したモデルの出力はできずプレビューのみが可能です。機能的な制限はなく使えます。

以下の初期設定をすると使いやすくなります。

日本語化

ツールメニューの「Tools」 – 「Preferences」…を選択
「一般」「General」タブの「Language:」を「Japanese」を選択し「Apply」をクリック

Metashapeで日本語化を設定する画面

グラフィックボードの設定(処理速度が上がります)

ツールメニューの「Tools」 – 「Preferences」…を選択
「GPU」タブ内にデバイスが検出されていれば、チェックを入れます。

Metashapeでグラフィックボードの設定をする画面

調査して分かったこと

3Dデータ生成時間は、PCの性能・画像サイズ・枚数に依存

高精度の結果が必要な場合はハイスペックな環境が推奨されます。


画像の質が精度に大きく影響

高解像度でオーバーラップ率の高い多くの画像を収集することが有効です。


オーバーラップ率を意識した撮影の難しさ

撮影時にオーバーラップ率を考えながら撮るのは手間がかかるため、動画撮影やドローンの自動飛行で撮影する等の自動化が有効です。


映像のリアルタイム処理

SfM/MVGは計算量が多いため、撮影しながらリアルタイムに3Dデータを生成することは困難です。あらかじめ撮影したデータからバッチ処理するのに向いた技術といえます。

おわりに

SfM/MVSは市販のカメラやスマートフォンで撮影した画像さえあれば3Dデータを生成できるため、様々なシーンに活用できます。解像度や必要枚数の制約はありますが、過去に撮りためた映像や、不特定多数の観光客が撮った写真から3Dデータを生成できる場合もあるでしょう。

精度向上にはドローンを活用した自動撮影やオーバーラップ率を計算するシステム等の導入も有効です。弊社はシステム開発を会社として、パッケージソフトの販売ではなくお客様のニーズに合わせた”受託開発”を専門としています。本記事に記載された技術に関するご質問や、利活用のご相談などがございましたらお気軽にお問い合わせください。

参考記事