GUI操作だけで画像から3DマッピングするSfMソフトRegard3Dの使い方



近年はSfM（Structure-from-motion，画像を用いた3次元復元）の商用化などにより，三次元復元が身近になっています．その手順を手元のPCで簡単に体験できるソフトの一つがRegard3Dです．

- フリー
- GPU必要なし（ノートPCでOK）
- GUIでお手軽，コマンドライン操作なし
- 画像読み込み，対応点マッチング，バンドル調整，多視点ステレオまで，パイプラインが全てそろっている

以下では，画像を読み込んでメッシュを保存するまでの，簡単な使い方を説明します．




# ダウンロード

https://www.regard3d.org/

からメニューのダウンロードへ行きます．

<img width="521" alt="スクリーンショット 2020-05-26 16.03.09.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/a61c0b06-bcb1-8e53-d350-871688a4c0a8.png">

リンク
https://sourceforge.net/projects/regard3d/files/latest/download
をクリックします．しばらくるとダウンロードされます．Windows版もMacOS版も，同じリンクです（自動判別）．

<img width="483" alt="スクリーンショット 2020-05-26 16.02.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/3ad0868b-d292-5f58-794f-d5a559fcd2ab.png">


# インストール

インストーラをクリックしてインストールします（素直なのでここでの説明は省略）



以下の説明はこのバージョンのものです．（MacOS）

<img width="458" alt="スクリーンショット 2020-05-26 16.51.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/231901e1-678d-04d1-c0f3-b74e5cf28217.png">



# 起動

起動します．

<img width="987" alt="スクリーンショット 2020-05-26 16.02.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/06a05726-a6c5-211d-88b8-5f6dec979213.png">

# 画像の準備

SfMで三次元復元するシーンの画像ファイルを準備します．
- JPEGファイル（exif情報を使うので）
- サイズは1200x900程度で十分（これより高解像度だと計算に時間がかかってしまう）
- ある物体を床において，その周囲を斜め上から取り囲むようにして５−１０枚ほど撮影する，とうまく三次元復元できるかも
- ボケ，ブレがないように撮影
- テクスチャが十分にあるようなものを撮影（つるつるピカピカの物体はダメ）




# 実行

## プロジェクトの作成

File->New projectまたはプロジェクト新規作成ボタンを押します．

<img width="61" alt="スクリーンショット 2020-05-26 16.06.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/a3af0919-5cd1-8587-2313-a71d42da179c.png">

以下を指定してOKを押します
- Set project path：プロジェクト保存パスを設定
- Project name：プロジェクト名
- Projeft file：（自動で設定されます）

<img width="526" alt="スクリーンショット 2020-05-26 16.07.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/70023bd6-b6ac-8f60-60be-d434c580bbba.png">

プロジェクトが作成されました．
次からはこのプロジェクトファイルをFile->Open projectで読み込めばOK


## 画像の追加

「Add Picture Set...」ボタンを押して，3次元復元する画像を指定します．

<img width="294" alt="スクリーンショット 2020-05-26 16.08.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/79e133d4-32cc-8468-3908-a3e38dc7abb9.png">

Add files．．．を押します．

<img width="235" alt="スクリーンショット 2020-05-26 16.09.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/6320a536-878b-6a42-1df7-e5c12708122d.png">

画像ファイルを複数選択して追加します．

<img width="280" alt="スクリーンショット 2020-05-26 16.10.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/41b2c2c6-7da6-8192-b614-6bf2cbf0cf23.png">

画像が追加されました．

<img width="900" alt="スクリーンショット 2020-05-26 16.13.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/90bc77dc-88d6-2461-f4db-7f5290bac3fc.png">

OKなら右下のOKボタンを押します．

注意：もしカメラ名や焦点距離などの情報が全く無い場合には，jpegファイルにexif情報がないことになります．普通のデジカメで撮影するとexif情報は入っていますが，画像のリサイズなどで処理をするとexifがなくなる場合がありますので，その処理などを確認してexif情報を残してください．

- もしすべての画像で「Sensor width」の欄に数値が入っている場合には，問題ありません．次の「センササイズの指定」をスキップしてください．
- もしN/Aが入っている場合には，Regard3Dのデータベースcsvに，その画像ファイルを撮影したカメラのセンササイズを入力する必要がありますので，次の「センササイズの指定」に進んでください．


## センササイズの指定

Regard3Dをインストールした場所の`sensor_database.csv`を書き換えます．

### Windoowsの場合：

書き換えるファイルは
`C:\Users\あなたのユーザー名\AppData\Local\Regard3D\sensor_database.csv`
にあります．

以下の図のように，エクスプローラーから「ローカルディスク」「ユーザー」「自分の名前のフォルダ」へ行きます．
<img width="318" alt="スクリーンショット 2020-05-27 8.10.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/3363e500-e719-272e-4a45-50ddfedd2d0c.png">
<img width="362" alt="スクリーンショット 2020-05-27 8.10.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/118aecb4-ca7a-f4de-546b-cd76ceae3e70.png">
<img width="228" alt="スクリーンショット 2020-05-27 8.11.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/ab54033b-9044-f232-9644-e283145dbf60.png">

AppDataは隠しフォルダなので，エクスプローラーの設定で隠しフォルダを表示するようにしてください．
<img width="987" alt="スクリーンショット 2020-05-27 8.11.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/240bbe74-a546-af7f-db84-706b0512cac9.png">
たどり着いたら，ファイルをメモ帳などで開きます．
<img width="775" alt="スクリーンショット 2020-05-27 8.13.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/a8ee8f23-8696-067e-b3d4-0205e5b23d95.png">



### MacOSの場合

書き換えるファイルは
`/Applications/Regard3D.app/Contents/Resources/sensor_database.csv`
にあります．

以下の図のように，Finderから「アプリケーション」に行き，Regard3Dを右クリックして「パッケージの中身を表示」を選ぶと，このフォルダにたどり着けます
<img width="428" alt="スクリーンショット 2020-05-26 16.16.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/6cdef50b-f60a-95d4-885d-640f27e366da.png">
たどり着いたら，ファイルをテキストエディタなどで開きます．
<img width="372" alt="スクリーンショット 2020-05-27 8.06.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/dca4feb0-e898-a50b-5180-5dd7bf5a2185.png">


### sensor_database.csvの書き換え

新しく行を追加します（どこでも良いですが，元ファイルがアルファベット順になっているので，以下ではその順になる行に追加しています）

以下のように，この場合は「Camera」と「Camera model」に表示されている文字列を，以下のフォーマットでセミコロン（;）で区切って追加します．

- Camera;Camera model;センササイズの実数値

<img width="453" alt="スクリーンショット 2020-05-26 16.18.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/2d3a32d7-5e3c-14d1-7467-87648f551c9c.png">

```text:sensor_database.csvの中身
...
AgfaPhoto;AgfaPhoto sensor 830s;5.75
Apple;iPad;6.16
Apple;iPad mini (5th generation);6.16
BenQ;BenQ AC100;6.16
BenQ;BenQ AE100;6.16
...
```

#### Tips

- センササイズが分かる場合
 - 単位はmmです．カメラのマニュアルの仕様の欄にセンササイズが書いてある場合があります
- センササイズがわからない場合
 - 厳密でなくても大丈夫のはず．．．．似たようなカメラの似たような数字（6.16とか5.75とか）を記入して，三次元復元を試してみてください


#### 書き換えたらregard3dを再起動

regard3dを一旦終了して，起動し直して，File->Open projectでプロジェクトファイルを読み込んで，再度画像を追加してください．今度はセンササイズの欄に数字が入っているはずです．

<img width="797" alt="スクリーンショット 2020-05-26 16.26.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/416c214d-41fc-155d-e548-36aa875bb70d.png">

OKなら右下のOKボタンを押します．


## 特徴点の検出と特徴量のマッチング

以下のように画像が追加されている状態です．
（Number of picturesは読み込まれた画像の枚数）

「Compute matches．．．」を押します．

<img width="364" alt="スクリーンショット 2020-05-26 16.27.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/4f2af495-66e8-f235-8aff-eed44e328c2e.png">

設定ウィンドウが出ます．デフォルトで問題ないことは多いので，そのまま右下のOKボタンを押します．

<img width="672" alt="スクリーンショット 2020-05-26 16.28.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/6eb1bea1-c707-ec05-8de6-bf05075ea504.png">

マッチングが行われます．画像サイズや枚数によって，数分から数十分かかる場合もあります．気長に待ちましょう．
終了したら，OKボタンを押します．

<img width="659" alt="スクリーンショット 2020-05-26 16.29.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/041a8db2-83c0-ff3b-8c95-f14e36b53594.png">

マッチング結果を確認しますので，Show matching results...を押します．

<img width="277" alt="スクリーンショット 2020-05-26 16.30.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/5010178a-06e6-f645-033a-322c5c58f9fc.png">

上のペインが画像セット，下のペインがマッチング結果です．
- マッチングした2枚の画像ペアが左下に出ます．
- 下のShow Matchesボタンを押すと，2枚の画像間の対応点マッチング結果を線で表示します．
- 多数のペアが多数の点で対応が取れていると良い状態です．（2−3枚程度では以降の処理が失敗する）

<img width="1242" alt="スクリーンショット 2020-05-26 17.12.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/09a890e5-0ebf-6de3-df8a-ed57a4d4ec6f.png">


確認が済んだら（気が済んだら）OKボタンを押して戻ります．


## 三角測量：カメラ位置の計算（バンドルアジャストメント）

次に，マッチングがとれた画像から，それを撮影したカメラの位置姿勢パラメータと，特徴点の3次元座標を計算します．
Triangulation...を押します．


<img width="277" alt="スクリーンショット 2020-05-26 16.30.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/5010178a-06e6-f645-033a-322c5c58f9fc.png">


設定ウィンドウが出ます．デフォルトで問題ないことは多いので，そのまま右下のOKボタンを押します．


<img width="491" alt="スクリーンショット 2020-05-26 16.34.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/a5a04370-e902-d22c-b288-329989feb3f1.png">


### 失敗

以下のようなウィンドウが出たら，失敗したことになります．

<img width="540" alt="スクリーンショット 2020-05-26 16.35.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/476beda8-8ba2-7d04-0bde-f35dabb75e5b.png">

失敗の原因は色々ありますが，対応点が取れた画像ペアの数が少ないとダメです．画像を撮影し直しましょう．

もしくは，以下のOld incremental Structure from Motionを試してみましょう．

<img width="494" alt="スクリーンショット 2020-05-26 16.43.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/609378f1-2527-fda1-1a0b-c50faadd1977.png">

### 成功

成功したら以下のようなウィンドウが出ます．OKを押します．

<img width="441" alt="スクリーンショット 2020-05-26 16.47.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/cabb62b8-1f58-6f62-01f5-49b419d1d549.png">


### 復元された点とカメラの表示

ウィンドウの真ん中の紺色のペインには，復元された点とカメラが3次元の点として表示されています．マウスでグリグリ動かせます．ただしこのままでは見にくいです．．．


<img width="984" alt="スクリーンショット 2020-05-26 17.15.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/7d884c14-2ad3-8036-641f-8ec63a464ba9.png">

右のスライドバーでPoint sizeを変えて大きくすると，点が見えるようになります．
- 緑色：カメラの座標
- 色付きの点：復元された特徴点（色は画像から取得）


<img width="985" alt="スクリーンショット 2020-05-26 17.15.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/23d5898d-af99-9dac-965c-714caf4fd0a1.png">


## 密な点群の作成

推定されたカメラ位置を利用して，多視点ステレオ（MVS）を実行し，もっと多数の点の3次元復元を行います．
Create dense pointcloud...を押します．

<img width="275" alt="スクリーンショット 2020-05-26 16.50.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/27c92e2c-51ca-413b-71ae-ef89aeb2c518.png">

設定ウィンドウが出ます．デフォルトで問題ないことは多いので，そのまま右下のOKボタンを押します．

<img width="661" alt="スクリーンショット 2020-05-26 16.51.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/cbea1481-65ce-31f1-7fba-934a8614d882.png">

MVSによる三次元復元が始まります．

<img width="578" alt="スクリーンショット 2020-05-26 16.52.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/d64cfca4-7687-e96c-a941-2b84bdb53eef.png">

密な点群が復元されました

<img width="974" alt="スクリーンショット 2020-05-26 17.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/f8d6c922-e9f3-d1c8-2422-181dde53f982.png">

拡大すると確かに点です．つまりまだ表面はありません．


<img width="977" alt="スクリーンショット 2020-05-26 17.17.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/4e3c9600-a0f6-79ab-b1a1-b5069516b859.png">


## メッシュ生成

点群から物体表面のメッシュを生成します．
Create Surface...を押します．

<img width="304" alt="スクリーンショット 2020-05-26 17.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/194ebbf5-5e88-3bf5-200a-50575e64d8be.png">

設定ウィンドウが出ます．デフォルトで問題ないことは多いので，そのまま右下のOKボタンを押します．

<img width="584" alt="スクリーンショット 2020-05-26 17.18.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/fa72633f-53d3-d5a5-6f3e-56ef498832c2.png">

処理が始まります．

<img width="379" alt="スクリーンショット 2020-05-26 17.19.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/38021e22-d65e-6b2d-4de4-7cf1ac410ccc.png">

処理が終わりました

<img width="975" alt="スクリーンショット 2020-05-26 17.19.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/5ee2d1a9-4419-bb36-a457-aef47f1d35d1.png">

## レンダリング

拡大してみる

- デフォルトはスムーズシェーディングがかかって滑らか
 - Polygon modeがFill，Shading modelがSmooth
<img width="728" alt="スクリーンショット 2020-05-26 17.20.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/c8f25074-9293-689c-cf45-454d62cbef68.png">
- Polygon modeをLineにすると，ワイヤーフレーム表示になる
<img width="739" alt="スクリーンショット 2020-05-26 17.20.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/27ddac15-25f1-5fde-4647-29d6bae63b95.png">
- Polygon modeをpointにすると，点群表示になる
<img width="725" alt="スクリーンショット 2020-05-26 17.20.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/3d6f398f-eaff-0680-d4f1-0d984553b691.png">
- Polygon modeをFillにして，Shading modelをFlatにする（フラットシェーディング）
<img width="736" alt="スクリーンショット 2020-05-26 17.20.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/767eca71-5f6a-a272-7ac2-092f0ccbced6.png">
- Enable lightのチェックを外すと立体的な影のレンダリングがなくなる
<img width="711" alt="スクリーンショット 2020-05-26 17.23.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/a58e5cab-b014-1970-ea25-63df5620f294.png">


## 保存

Export surfaceを押す

<img width="266" alt="スクリーンショット 2020-05-26 17.24.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/299493c0-d7b8-1f89-58f6-328fdfc40bc6.png">

ファイル名とフォルダを選んでSaveを押す
- File typeは，通常は*.plyでOK
 - Audodesk/Alias社製品を持ってるならobjでもよいかも

<img width="335" alt="スクリーンショット 2020-05-26 17.24.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44835/560e23e7-cfa1-4e3d-226d-cc0003dec63a.png">

このplyファイルは3Dビューアで開ける（blenderやmeshlabなど）


# Meshlabで表示

## ダウンロード＆インストール

https://www.meshlab.net

のDownloadからインストーラをダウンロードして，インストール（省略）

## plyファイルの読み込み

File --> Import Mesh..からファイルを選択．
表示されます．