3DF Zephyrに動画を取り込んでパンダの3Dモデルを作成する

# はじめに
- 最近、フォトグラメトリが気になる。
 - フォトグラメトリ：複数枚の写真から視差情報を解析し、3Dスキャンする技術。
- 今回は、3Dモデルにしたい物体の周りを動画撮影し、[3DF Zephyr](https://www.3dflow.net/3df-zephyr-free/)というソフトを使って、3Dモデルを作成してみた。
- 動画を取り込むと言っても、動画から複数枚の写真を抽出して、その写真から3Dモデルを作成する流れ。
- パンダが好きなので、パンダのぬいぐるみを3Dモデル化した。

# 開発環境
- 使用PCのスペック
 - OS: Windows10 Pro
 - GPU: GeForce GTX 1080
- 使用したソフト
 - 3DF Zephyr Free(無料版。取り込める写真は50枚まで。)

# 作成手順
- 基本の作成手順は以下のサイトが参考になりました。
    - [とりあえず始めるフォトグラメトリ\(1\) とりあえずスキャンして Unity 上で表示する](https://manabuokajima.hatenablog.com/entry/2018/04/09/195819)
    - [3DF Zephyr tutorials](https://www.3dflow.net/technology/documents/3df-zephyr-tutorials/)


## 1. 新規プロジェクト作成　〜　動画を3DF Zephyrに取り込んで点群生成
1. 3DF Zephyr Freeを起動 -> メニューバー[ワークフロー] -> [新規プロジェクト]
2. 左3項目を選択 -> [次へ]。一度に高密度点群、メッシュ、テクスチャを出力してくれる。![新規プロジェクトウィザード.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/53d765ae-2500-2103-35b3-d724f7c0f89c.png)
3.写真選択ページで[ビデオから写真を入力]を押下。![動画選択.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/7ba90495-16cf-160e-8a40-9fe3db902f63.png)
4. [入力ファイル] で動画を選択。[出力ファイル]で、動画から抽出した画像の出力先を選択。 [フレームの抽出とワークスペースの入力]を押下。![動画取り込み.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/62264440-e593-b390-634d-d5890b58c72c.png)
5. 今回は抽出するFPSを1.00にしたため、32枚の画像が抽出された。[次へ]![3D_ÉrÉfÉIéÊÇËçûÇ›èIÇÌÇË.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/582668ef-9c24-a35a-0005-71fcc1308b29.png)
6. カメラ修正ページでは今回は較正は変更せず、[次へ]
7. テクスチャ付メッシュ作成ウィザードページで、[テクスチャの最大数]を1に変更。[次へ]
8. カメラ方向ページで、[カテゴリー]を今回は近接範囲を選択。[次へ]
9. 高密度点群作成ページで、[カテゴリー]を今回は近接範囲を選択。[次へ]
10. サーフェスモデル化ページで、[カテゴリー]を今回は近接範囲を選択。[次へ]
11. モデル化開始ページで設定内容を確認し、[実行]
12. しかし、、32枚中11枚しか画像が取り込まれず、、パンダの右半分が空洞に；；抽出するFPSを1.00にしたことで、写真同士の視差や特徴点を上手く解析できなかったと思われる。
![](http://i.giphy.com/2dievgejfjUy8ysuZk.gif)

## 2. 動画から抽出する画像を増やしてリベンジ
1. というわけで、1.1〜1.3まで同様に行う。
2. [抽出するFPS]を2.00に変更![3D_íäèoÇ∑ÇÈFPSÇ2Ç…ÇµÇƒÇ›ÇÈ.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/f1a992bb-43cb-3968-1985-6f7ccfa14ec2.png)
3. 抽出された画像が54枚だったため、3DF Zephyr Freeでは以下のような警告が出て、51枚目以降は破棄される![3D_åxçê.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/dba5a1d6-1b48-dc1e-5947-e4cae1811d54.png)
4. 1.4〜1.11まで同様に行う。
5. 50枚全ての画像が取り込まれて、パンダが概ね欠けることなく出現。
![3D_高密度点群編集前PNG.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/512aadbf-bd31-29ae-90f7-c7227a5e805f.png)


## 3. 高密度点群から不要部分を選択削除
パンダ以外の背景を削除していきます。
1. 左サイドバーの[高密度点群(1)]を選択し、高密度点群を表示させる。![高密度点群を選択.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/afb42a28-ca2d-ebb0-cbf3-bef47debde76.png)
2. メニューバー[編集] -> [選択] -> [手動選択]
3. ドラッグで削除したい範囲を選択すると赤くなる![3D_éËìÆëIëÇ≈çÌèú.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/2b00de0f-a2d3-093c-0ecf-93520b15c532.png)
4. [選択アイテムを削除]アイコンを押下し、不要な点群を削除していく![選択アイテムを削除.png](https://qiita-image-store.s3.amazonaws.com/0/200334/e94305a4-88bc-bcd9-7093-a88ed9f8ef8b.png)
5. 不要な点群を削除したものがこちら![不要な点群を削除.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/f7db5fbf-ab6c-ae90-3d91-40e56cea1713.png)

## 4.メッシュ化
1. 左サイドバーの[Dense point cloud 1]を選択した状態で、メニューバー[ワークフロー] -> [メッシュ抽出]
2. メッシュが作成される ![メッシュ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/73b87ca9-09ce-543a-ac78-95982574b287.png)
3. 左サイドバーの[メッシュ(2)]に[Mesh 2]を選択した状態で、メニューバー[ワークフロー] -> [テクスチャ付メッシュ作成]
4. テクスチャ付メッシュ作成ウィザード設定で、[テクスチャの最大数]を1に変更。[次へ]![3D_ÉeÉNÉXÉ`ÉÉïtÇ´ÉÅÉbÉVÉÖ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/c5d9ec69-659e-711e-4eb2-78ced2b2c19a.png)
5. テクスチャ付メッシュが作成された。ぬいぐるみのもこもこ感が少しわかるようになった気がする。![3D_ÉeÉNÉXÉ`ÉÉïtÇ´ÉÅÉbÉVÉÖÇ™ê∂ê¨Ç≥ÇÍÇΩ.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/97308f38-a11c-74a9-5e06-cacf44581885.png)
6. メニューバー[出力] -> [テクスチャ付メッシュを出力]。今回はobj/mtlで出力。![3D_出力.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/dc62151d-f898-0d81-df8c-e1cbcb041360.png)

# 出来上がりはこんな感じ
出力したobjファイルをWindows10にプリインストールされている3DBuilderで見てみた
一応パンダであることは分かる
![3D_3DBuilderÇ≈å©ÇƒÇ›ÇÈ.PNG](https://qiita-image-store.s3.amazonaws.com/0/200334/728710d5-4c48-7314-650b-8df0fd16e4e3.png)


# 作ってみて
- **取り込む写真の枚数について**
    - 3DF Zephyr Freeは無料版ということで、50枚までしか写真を取り込めない。
    - 取り込んだ写真の枚数が少ないと、視差情報を取得しにくいためか、点群化に使用できる写真が32枚中11枚しかなかった。
    - 3Dモデルの精度を上げるには写真50枚だと限界がある。(お金を積むしか…w)
- **動画と複数枚の写真、どっちを使った方が良さそう？**
    - 動画だと、指定したfpsで切り取った写真がボケていると精度に影響しそう。
- **感じたこと・気になったこと**
    - 3DF Zephyrには、マスク機能を使って、取り込む写真に写っている3Dモデルにしたい対象物と背景をマウスでざっくりなぞって認識させることができる。しかし、取り込む枚数が多いほど気が遠くなるような作業になる・・・今回みたいに点群化した後に、不要な点群を選択して削除する方が楽だと感じた。
    - 今回使用した枚数と同じ、写真50枚で作成したら精度が変わるかどうか比較してみたい。
    - 今回はほとんどプリセットやアドバンスの設定のまま点群化、メッシュ化したため、カスタマイズ設定するときのパラメータについて調べてみる。
    - 3DF Zephyrでメッシュを出力して、3DBuilderやMeshLabで確認すると、3Dモデルが横向きになっているのは、3DF Zephyrは座標系が右手系、他が左手系のため。