画像から3Dモデル生成(Photogrammetry)に関する調査のまとめ （201912月更新）

※2019年12月更新しました。

# やりたいこと
- 二次元画像複数枚から3次元モデルに変換したい。
- 開発停止と有料化してしまった123DCatchのことが忘れられない。
- どういう技術が使われてるのか知りたい。
- できれば無料でやりたい。


# 検索ワード
- **SFM** (Structure From Motion) 多視点画像からの3次元形状復元
- **PCL** (Point Cloud Library) 点群データ処理ライブラリ
- **MVS** (Multi-View Stereo) 多眼ステレオ

などなど


## meshroom (AliceVision)

https://github.com/alicevision/meshroom

Alicevisonはオープンソースで開発されている、Photogrammetryソフトウェアです。
現状あるオープンソース系の中では一番スジがいいので、おすすめできます。

meshroomはその機能を使用できるソフトウェアで、かなり手軽にPhotogrammetryが出来ます。

触ってみましたが、写真を適当に投げてそのままデフォルトで処理するだけで、ざっくりとメッシュまで生成してくれます。
パラメーターも調整できるようになっている他、ノードベースの処理を組めるので、軽いワークフローまで構築できます。

MeshLabほど機能は無いですが、必要十分な機能を提供してくれているので、とても使いやすいかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49526/66bd4533-5d0d-22bc-a9bd-209d484ab613.png)

ざっくり適当な動画で試してみました。
カメラトラッキングだけでも全然実用性ありますね。


## RealityCapture （有料
https://www.capturingreality.com/

おそらく業界のデファクトとなっている、有名なPhotogrammetryソフト。

こちらは、他の測量データと連携できるようで、商用用途を想定している。
UIがしっかりしていて、きちんとソフトウェアとして作り込まれてる印象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49526/443fd60d-0965-f431-44ae-88991e949d41.png)

ある程度までは無料で使える。かっちりとPhotogrammetryしたい場合はこのソフトを使うのがいい気がしています。

## Trino 

http://www.trnio.com/

iOSアプリがあって、ナビにしたがってやればお手軽に3Dモデルを作ってくれる。
お手軽な分、精度とか機能は低め？


## Autodesk ReCap (有料)

https://www.autodesk.co.jp/products/recap/overview

Autodeskが提供する有料（購読）アプリ
ReCap Photo が123D Catchの後継となるアプリで、¥6000/月かかる。



## Pix4D（有料)

https://www.pix4d.com/jp
ドローンでの測量に特化している産業用の測量用ソフトウェア群

---
などなど、ちょっと調べれば色々出てくる＋陳腐化や開発終了も早いので、気になったらちゃんと調べてみることをおすすめします。


# 基礎技術とオープンソースのアプリ

3次元形状復元の基本となる技術ですが、大まかに

1. SFM(Structure From Motion）
    2. 画像から特徴点の抽出
    3. 特徴点から３次元位置の推定アルゴリズム
    4. 点群データ（Point Cloud）への変換
1. PointCloud（点群データ） をMesh化　（poisson surface reconstruction）
1. テクスチャをマッピングしてExport

＋MeshLabで頂点数減らしたり、いらない点を削除したりできます。

細かい解説は、記事最下部の参考リンクを参照してみて下さい。

## VisualSFM

http://ccwu.me/vsfm/

複数の画像から特徴点を解析して、点群データにしてくれるアプリです。
Windowsならアプリとしてありますが、MacOS/Linuxはビルドが必要で、ハードルが高いです。

類似アプリとして[Regard3D](http://www.regard3d.org/)や[COLMAP](https://colmap.github.io/)などがあります。

Regard3Dは手元のMacで試してみました。
扱いやすいのとMeshLabへの連携が取りやすい。また、設定項目もかなり細かくあるので、微調整もできるので、いろいろ試行錯誤できそうです。

諸々の計算にはかなり時間がかかるため、ハイスペックなPCで実行することをおすすめします。

 ---- 

ちなみに、点群データをMeshへと変換する[Poisson Surface Reconstruction](http://hhoppe.com/poissonrecon.pdf)ですが、
このポワゾン方程式アルゴリズムは他で色んな所に使われてるので、おもしろいです。

周りのランダムな点との勾配をポワゾン方程式に当てはめて計算すると、いい感じで点と点の間が埋まるらしい。

興味がある方は調べてみては？


## PCL Point Cloud Library

http://pointclouds.org/

オープンソースのPoint Cloud (点群データ)を処理できるライブラリです。
プログラムのライブラリなので、プログラミング環境に組み込むことが必須です。

よりインタラクティブに、立体や平面をトラッキングしたい用途で主に使用します。
スマホアプリで平面推定したり、Kinnectなどの、DepthSensorと組み合わせて、対象物をリアルタイムにMesh化したり様々な用途に応用が効きます。



## MeshLab

http://www.meshlab.net/

キャプチャーした点群を処理するためのソフトウェア。

無料かつ点群データを扱える数少ないアプリで、クセはありますがかなり高機能です。
やりたいことを調べれば日本語の記事が結構できてきます。
様々なアルゴリズム処理を試せます。


# ワークフロー

Photogrammetryを実際にゲーム内でアッセトとして使うまでのワークフローをUnityが公開しています。

https://unity3d.com/files/solutions/photogrammetry/Unity-Photogrammetry-Workflow_2017-07_v2.pdf


# 小話

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49526/6df33094-fbbb-37cd-6be8-7d746ad11e02.png)
フラットで特徴点の取りづらい物体をキャプチャするときは、手芸用のラメパウダー等をふりかけるといいらしい。（筆者未検証）

# 参考リンク
[ChainerでDeep Learningをしない（SfMからSLAMまで）](https://qiita.com/peisuke/items/fbe00bacb22df8115323)
[Structure from Motion (多視点画像からの3次元形状復元)](https://medium.com/@NegativeMind/structure-from-motion-%E5%A4%9A%E8%A6%96%E7%82%B9%E7%94%BB%E5%83%8F%E3%81%8B%E3%82%89%E3%81%AE3%E6%AC%A1%E5%85%83%E5%BD%A2%E7%8A%B6%E5%BE%A9%E5%85%83-108328ea6b03)
[2D→3D復元技術で使われる用語まとめ](https://blog.negativemind.com/2016/02/17/2d-to-3d-terminology/)
[乃木坂46メンバーを動画から三次元へ復元する](https://qiita.com/syinari0123/items/f8b8ae08a80002361855)
[Awesome 3D reconstruction list](https://github.com/openMVG/awesome_3DReconstruction_list)