Simple Structure from Motion 〜 実装編0(テストコードとビルド)

前回のエントリからちょっと間が空いてしまいました...が,Structure From Motion の簡易版ができたのでエントリを残しておきます.

0.目的&動機

沖縄で勉強してた Structure from Motion の知識整理をしたく,とっても簡易化した SFM を作りました.あくまでも,SFMの仕組みを理解することを主目的としてます.で,だいぶ丁寧に撮影した写真でないと落ちます(笑)なので,実際にSFMを使う場合は,下で説明する Theia とか,Colmap とかを使ってください.ただ,性能はあまりでないものの,SFMの必須の流れ&アルゴリズムを理解するのには結構役立つと思います.最新のオープンソースのものはもっと洗練されてますが,基本の流れ+αでできているものがほとんどだったので.

1.コード

バンドル調整とか,ロバスト性を上げるロジックとかが入ってないですが,,,,これは時間を見つけて更新できれば.
github.com

2.参考にしたソース

Mastering OpenCV という本の 4 章で SFM を扱っているのですが,該当するコードが下記になります.下記のコードをしらみつぶしに読んで自分なりに書き換えたコードが,今回のコードになってます.なので,大きな流れはほぼ下記のコードに沿ってます.
github.com

国際通り三次元復元!のために使っている&読んでいるコードが下記のソースです.いくらか SFMオープンソースコードがありますが,おそらく Theia が一番性能が良い(=大量の写真に耐えうる&ロバストに三次元復元ができる.)ような気がしてます.が,それでも国際通りで撮影した写真の枚数が多すぎてまだうまくいってないです...
github.com

Colmap は SFM だけでなく,Multiview Stereo も実装されてます.
github.com

3.ビルド&実行の流れ.

3.1.Github からダウンロード & ビルド
git clone git@github.com:koichiHik/three_view_sfm.git three_view_sfm
cd three_view_sfm
sh build.sh
3.2.テストデータのダウンロード

2で説明しているデータを落とす必要があります.3.1から続きでコマンド打ちます.

cd ..
git clone git@github.com:openMVG/SfM_quality_evaluation.git SfM_quality_evaluation
3.3.実行

3.1でビルドしたコードと3.2でダウンロードしたテストデータを使って動かします.

cd three_view_sfm
./build/bin/three_view_sfm --directory=../SfM_quality_evaluation/Benchmarking_Camera_Calibration_2008/fountain-P11/images/

4.実行結果

4.1.実験に使った画像

SFMコミュニティの方が提供してくれている,下記の画像を使ってます.

f:id:rkoichi2001:20190721223751j:plain
噴水写真

4.2.特徴点の表示

噴水の写真は11枚あるんですが,一つ一つの組み合わせに対する特徴点マッチングの結果が出てきます.

f:id:rkoichi2001:20190721222640p:plain
SIFTによる特徴点マッチング1

f:id:rkoichi2001:20190721222739p:plain
SIFTによる特徴点マッチング2

4.3.SFM結果

まず最初の2台の結果が表示され,以降5秒毎にカメラが追加されていきます.右側の壁みたいなやつは誤マッチングですが,,,これは勉強用ということで.

f:id:rkoichi2001:20190721230139p:plain
SFMによる点群生成

ということで,ひとまずコードの流れをエントリにまとめました.ここからはいつもどおり全体構成のエントリを作って,そこから細かくエントリを書いていければと思います.が,時間かかるなあ...