はじめに
対象物体の表面形状を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 については後述します。
使用した機材
カメラ
SONY α7 IIPC
- 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データを生成します。
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/
OpenMVS
OpenMVSは低密度点群データを使用して、MVS技術で高密度点群データを生成するライブラリです。
実行用ディレクトリ作成
下図の構成になるよう新規フォルダを作成します。
- images(処理対象の写真を置くフォルダ)
- matches(特徴点およびマッチング結果を保存するためのフォルダ)
- outReconstruction(生成された3Dデータ保存先フォルダ)
- sensor_width_camera_database.txt(カメラ情報データベース)
※openMVG/src/openMVG/exif/sensor_width_databaseからsensor_width_camera_database.txtをimagesフォルダの親階層にコピー
実行ファイル
以下の順番でツールを実行します。
-
カメラ情報と画像ファイルのリストアップ実施
- 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/
-
特徴点の抽出
- openMVG_main_ComputeFeatures [OpenMVG]
- input:sfm_data.jsonファイル
- output:matchesフォルダに複数ファイル
openMVG_main_ComputeFeatures -i SfMTest/matches/sfm_data.json -o SfMTest/matches/
-
一致する特徴点の探索
- openMVG_main_computeMatches [OpenMVG]
- input:sfm_data.jsonファイル
- output:matchesフォルダに複数ファイル
openMVG_main_ComputeMatches -i SfMTest/matches/sfm_data.json -o SfMTest/matches/
-
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/
-
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
-
高密度点群データ生成
- DensifyPointCloud [OpenMVS]
- 入力:scene.mvsファイル
- 出力:scene_dense.plyファイル(高密度点群データ)
openMVS_build/bin/DensifyPointCloud SfMTest/outReconstruction/scene.mvs
時間がかかる処理もあるので、以下のようなシェルスクリプトファイルを作成して実行すれば、上記の実行ファイルが一括処理されるので簡単です。
シェルスクリプトサンプルファイル:sample.sh (687バイト)
3Dデータ表示
MeshLab
MeshLabは3Dデータの表示・編集・変換などをおこなう無料ソフトウェアです。
生成された scene_dense.ply ファイルを読み込むと確認することができます。
3Dデータサンプルファイル:sample.ply (25.3MB)
3Dデータ生成の失敗例と原因
撮影条件を満たしていない画像や、色や形状の特徴が対象物体として適さない場合は、結果に大きな影響を与えることが分かりました。失敗例と原因は次のようなものです。
オーバーラップ率の低い撮影
点字ブロック
写真の赤い丸どうし、緑の丸どうしが同じ場所を示していますが、オーバーラップ率が低すぎるため特徴点を十分に得られず、次のような結果になりました。
単調な形状の対象物体
シャッター
写真のように同じ模様の繰り返しで特徴的な部分が少ない物体の場合は、オーバーラップ率の高い写真を多く撮影しても特徴点が取れないため、欠けた状態で出力されてしまいました。8枚の写真を使いましたがカメラ位置(左画像の緑点)が3点しか取れていないことからも分かります。
工事現場の仮囲い
こちらも同様に単調な形状のため、期待する結果は得られませんでした。物体の形状もカメラ位置も正しいものがありません。
ハイライトの白飛びやシャドウの黒潰れによる情報欠損
造花の置物
そこまで明るい/暗いと感じない部分まで抜けてしまいました。特徴の少ない白や黒い物体はこのような結果になる可能性が高いです。その他に、透明なものや光沢があるものも対象物体としては向いていません。フォトレタッチソフトで画像を加工するとこの問題が解消される可能性はあります。
3Dデータ生成のソフトウェアについて
SfM / MVS の処理をおこなうソフトウェアはいろいろあります。OpenMVG / OpenMVS のみを使用するよりも簡単で高速に高精度の3Dデータを生成できます。
Regard3D
Regard3Dはオープンソースの無料ソフトで、OpenMVGの機能をGUIで使えるようにしたツールです。高密度データの生成も可能です。
Metashape
Metashapeは有料ソフトですが、無料の評価版を試すことができます。
起動すると以下のような選択画面になるので、いずれかを選んでください。「Continue using Metashape Professional in demo mode」はプレビューとして使うには十分でした。
- 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」をクリック
グラフィックボードの設定(処理速度が上がります)
ツールメニューの「Tools」 – 「Preferences」…を選択
「GPU」タブ内にデバイスが検出されていれば、チェックを入れます。
調査して分かったこと
高精度の結果が必要な場合はハイスペックな環境が推奨されます。
画像の質が精度に大きく影響
高解像度でオーバーラップ率の高い多くの画像を収集することが有効です。
オーバーラップ率を意識した撮影の難しさ
撮影時にオーバーラップ率を考えながら撮るのは手間がかかるため、動画撮影やドローンの自動飛行で撮影する等の自動化が有効です。
映像のリアルタイム処理
SfM/MVGは計算量が多いため、撮影しながらリアルタイムに3Dデータを生成することは困難です。あらかじめ撮影したデータからバッチ処理するのに向いた技術といえます。
おわりに
SfM/MVSは市販のカメラやスマートフォンで撮影した画像さえあれば3Dデータを生成できるため、様々なシーンに活用できます。解像度や必要枚数の制約はありますが、過去に撮りためた映像や、不特定多数の観光客が撮った写真から3Dデータを生成できる場合もあるでしょう。
精度向上にはドローンを活用した自動撮影やオーバーラップ率を計算するシステム等の導入も有効です。弊社はシステム開発を会社として、パッケージソフトの販売ではなくお客様のニーズに合わせた”受託開発”を専門としています。本記事に記載された技術に関するご質問や、利活用のご相談などがございましたらお気軽にお問い合わせください。