「画像から3Dモデルを再構築したい」
「COLMAPをWindowsで動かしたい」
このような場合には、この記事の内容が参考になります。
この記事では、COLMAPについて解説しています。
本記事の内容
- COLMAPとは?
- COLMAPのダウンロード
- COLMAPのインストール
- COLMAPの動作確認
それでは、上記に沿って解説していきます。
COLMAPとは?
COLMAPとは、写真から3Dモデルを再構築するソフトウェアです。
GUI・コマンドラインの両方で利用可能となっています。
動作環境は、Linux、Mac、Windowsと何でもOKです。
また、COLMAPはオープンソースのSfM・MVSツールと呼ばれています。
- Structure from Motion (SfM)
- Multi-View Stereo (MVS)
SfMでは、次の処理が実行されます。
- 特徴点の抽出
- 特徴点のマッチング
プロセスとしては、多くの画像から特徴点を抽出します。
そして、それらの特徴点間の対応関係を見つけます。
その結果として、3Dの点群とカメラの位置・姿勢の情報が取得できます。
MVSでは、SfMで取得できた情報を基に3Dモデルを再構築します。
その際、画像からテクスチャを生成することも可能になります。
以上、COLMAPについて説明しました。
次は、COLMAPのダウンロードを説明します。
COLMAPのダウンロード
この記事では、Windows環境を前提に説明を行います。
公式のダウンロードページ
https://demuc.de/colmap/#download

「Pre-Release Version」リンクをクリックするとGitHubのページへ移動。
現状では、バージョン3.8が最新となっています。

「COLMAP-3.8-windows-cuda.zip」の方をダウンロードします。
ファイルは124MB程度のため、すぐにダウンロードできます。
以上、COLMAPのダウンロードを説明しました。
次は、COLMAPのインストールを説明します。
COLMAPのインストール
ダウンロードしたzipファイルを解凍します。
必要なモノは、以下。

この親ディレクトリを適当な場所に移動させます。
その際、「COLMAP-3.8-windows-cuda」だと長いので「COLMAP」にディレクトリ名を変更します。
移動したら、その場所を環境変数「Path」に登録しましょう。
例えば、次のようなパスを登録することになります。

登録できたら、「COLMAP -h」コマンドを実行します。
PowerShellでもDOSプロンプトでも、どちらでもOK。
> COLMAP -h COLMAP 3.8 -- Structure-from-Motion and Multi-View Stereo (Commit 45edd3dfde0d945d305de3f299f3c36ae098620c on 2023-02-03 with CUDA) Usage: colmap [command] [options] Documentation: https://colmap.github.io/ Example usage: colmap help [ -h, --help ] colmap gui colmap gui -h [ --help ] colmap automatic_reconstructor -h [ --help ] colmap automatic_reconstructor --image_path IMAGES --workspace_path WORKSPACE colmap feature_extractor --image_path IMAGES --database_path DATABASE colmap exhaustive_matcher --database_path DATABASE colmap mapper --image_path IMAGES --database_path DATABASE --output_path MODEL ...
このように表示されたら、COLMAPのインストールは成功です。
以上、COLMAPのインストールを説明しました。
次は、COLMAPの動作確認を説明します。
COLMAPの動作確認
COLMAPの動作確認を説明します。
内容的には、COLMAPの簡単な使い方の説明にもなっています。
- 画像の準備
- 新規プロジェクトの作成
- 特徴点の抽出
- 特徴点のマッチング
- 3Dモデルの再構築
- 3Dモデルの読み込み
画像の準備
まず、画像を準備する必要があります。
画像は、COLMAP側でサンプル用を用意してくれています。
次のURLにアクセス。
https://demuc.de/colmap/datasets/
OneDriveに転送されて、次のようなダウンロードページに移動します。

ここでは、最もサイズの小さい「south-building.zip」をダウンロードしましょう。
zipファイルを解凍した中身は、以下のような画像が保存されています。

名前を「images」にから「input」に変更して、適当な場所へ移動しておきます。

新規プロジェクトの作成
まずは、COLMAPを起動します。
Pathを通しているなら、「COLMAP」コマンドを実行するだけで起動できます。

そうすると、COLMAPのGUIが表示されます。
新規プロジェクトを作成するために、「File > New project」を選択。

プロジェクトの情報を入力する画面が、表示されます。

「Database」項目では、「New」ボタンをクリック。
「input」を設置したディレクトリに「database.db」を新規に作成します。
「Images」項目には、「input」ディレクトリをパスを設定。
次のような値が設定されていることになります。

この状態で「Save」ボタンをクリック。
「database.db」が指定した場所に作成されます。

特徴点の抽出
先ほど作成したプロジェクトを選択した状態を前提とします。
その状態で「Processing > Feature extraction」を選択。

次のようなポップアップが表示されます。

ここでは、次の2つだけ値を変更します。
- Shared for all images
- first_octave
今回の画像では、フレーム間でズームインやズームアウトがありません。
つまり、ズーム倍率が同じ画像だということです。
そのような場合には、「Shared for all images」にチェックを入れます。
おそらく、これで無駄な処理を回避できるのでしょう。
「first_octave」は、「-1」から「0」に変更します。
この変更により、処理速度がUPするということです。
それ以外は、デフォルトのままで「Extract」ボタンをクリック。
クリックすると、さらに次のようなポップアップが表示されます。

これが表示されている間は、処理中ということです。
処理が完了したら、このポップアップは消えます。
しかし、初めのポップアップは表示されたままです。
この辺のUIが、ちょっとわかりにくいです。
普通は、初めのポップアップも閉じますからね。
ややこしいと感じる場合は、次のアイコンをクリックしておきましょう。

クリックすると、次のようにログを確認できます。
このログにより、状況を確認することが可能になります。

この時点で、database.dbの容量が一気に増えています。
画像の特徴点情報が記載されたということなのでしょう。

特徴点のマッチング
特徴点のマッチングとは、類似度が高い特徴点同士をマッチングすることです。
わかりやすく言うと、同じ物体が写る 2 枚の画像間で 同じ物体上の同じ点を対応させることと言えます。
特徴点のマッチングを行うには、「Processing > Feature matching」を選択。

タブが各マッチングのパターンとなっています。

ここでは、「Sequential」を選択。

設定は特に変更せずに「Run」ボタンをクリック。
1分未満で完了しています。
(※処理時間は各自の環境により異なります)

この時点で、database.dbのサイズが少し増えています。
マッチング情報が追記されたということなのでしょう。

あと、「Sequential」を選択した理由を説明しておきます。
サンプル画像は、連続していることが確認できます。

通常は、動画から連続した画像を取得します。
そのため、「Sequential」をマッチングのパターンとして選択することになるでしょう。
今回のサンプル画像も連続しているので、「Sequential」で問題ありません。
後工程(再構築)でエラーが出た場合は、「Exhaustive」でマッチングをやり直してみましょう。
「Exhaustive」でマッチングし直すことで、再構築でエラーを回避できる可能性があるようです。
3Dモデルの再構築
最後の総仕上げです。
処理を実行する前に、オプションを設定します。
「Reconstruction > Reconstruction options」を選択。

次のようなポップアップが表示されます。

「General」タブにおける「multiple_models」項目のチェックを外します。

用途によるとは思いますが、今回は一つのシーン(家のある空間)をモデルにしようとしています。
そのため、「multiple_models」項目のチェックを外すという設定を行います。
設定が終わったら、3Dモデルの再構築の処理を実行します。
「Reconstruction > Start reconstruction」を選択。

選択すると、処理が始まります。
GUIの画面上でモデルが再構築されている様子を確認できます。

処理は、2分ちょっとで完了しました。

画面上の3Dモデルは、マウスでグリグリで動かすことが可能となっています。

この時点で、database.dbのサイズは変化なしです。

再構築された3Dモデルは、別途出力する必要があります。
そのための出力先を用意しましょう。

ここでは、「output」ディレクトリを新規作成します。
モデルを出力するには、「File > Export model」を選択。

保存先は、用意した「output」を選びます。
「output」には、次のファイルが保存されます。

3Dモデルの読み込み
一旦、COLMAPを閉じましょう。
そして、再度COLMAPを起動します。
保存したモデルを読み込みます。
モデルを読み込むには、「File > Import model」を選択。

「output」ディレクトリを選択。
そうすると、次の3Dモデルが表示されます。

マウスでグリグリできますね。
これで、一通りの処理を検証できました。
以上、COLMAPの動作確認を説明しました。