前回RealityCaptureの概要を知るために作業の流れを紹介しました。今回はフォトグラメトリーで一番最初に行うアライメント処理について説明します。アラインメント(Alignment )とは、複数の画像からカメラの位置や向きを特定する処理です。

 

前回:RealityCaptureの使い方と3Dモデル作成のステップバイステップガイドクで高品質な3Dモデルを作ってみよう!
https://riragon.com/realitycapture-3d-tukaikata/

 

私は仕事で5年間ぐらいRealityCaptureを使っています。Alignment Settingsより、撮影方法が大切です。アライメントがダメなものはダメで、良いものは良い結果になります。設定を変えてもアライメントの結果はあまり変わりません。アライメントが上手くゆく撮影方法を確立するほうが重要です。

RealityCaptureを使っている多くの人は、アライメント設定はおまじない程度の気持ちで適当に設定しているのではないでしょうか。ちなみに設定を変えなくても、大きく結果が異なる(稀にすごく良い結果になる)ので、アライメントはカオス的な処理です。とはいえアライメント設定方法を知っておくことで、役に立つこともあるでしょう。

Alignment Settingsメーカ説明サイトはこちらです。
https://rchelp.capturingreality.com/en-US/appbasics/alignsettings.htm

 

アライメントの練習用に軽量なデータDL

実際にアライメントしてみることが近道です。軽量にダウンロードできるGingerbread Manを以下からダウンロードします。数値をいろいろ変えてアライメントしてみよう!結果はたいして変わらないはず?

https://www.capturingreality.com/sample-datasets

画像をDLしたらRealityCaptureにドロップします。ALIGNMENTタブのSettingsをクリックします。メニューのしたに設定一覧が出てきます。

 

 

RealityCapture Alignment Settings(アラインメントセッティング)

重要な用語がコンポーネントです。コンポーネントは、互いに重なり合う画像を通じて、相互に関連付けられたカメラのグループです。

複数のコンポーネントが存在する場合は、互いに関連付けられていない部分があるためです。不十分な画像のオーバーラップや特徴点の欠如などが原因です。つまり繋がらないってことです。

アライメントの理想は、撮影した画像がすべて1つのコンポーネントになることです。Alignment Settingsを工夫するより、残念ですが、撮影方法を工夫したほうが大きく改善されます。

 

①Max features per mpx(メガピクセルあたり最大特徴点数)

初期設定は10000です。1メガピクセル(例:1000ピクセル×1000ピクセルが1メガピクセル)あたりの特徴点の最大数です。特徴点が多いほど処理速度は遅くなりますが、コンポーネントの数が少なくなる可能性があります。コンポーネントの数が少なくなる=分析が上手くゆくということです。初期設定の倍の20000ぐらいに設定します。根拠は何かのチュートリアルの設定です。オマジナイです。

むやみに増やしても結果はほとんど変わりません。残念ながら。

 

②Max features per image(画像ごとの最大特徴点数)

初期設定は40000です。画像ごとに使用される特徴点の絶対的な上限を定義します。特定の画像で検出される特徴点の数を制限することで、計算の負荷を管理し、効率的な処理を実現します。画像ごとの特徴点の絶対数の制限を定義します。大きいサイズの画像でアライメントする場合は、こちらの設定が有効になるでしょう。初期設定の倍の80000ぐらいに設定します。根拠は何かのチュートリアルの設定です。オマジナイです。

意識したことはありませんが、ある程度の大きな画像(例:2000ピクセル×2000ピクセル以上は4メガピクセル以上)は、Max features per imageの設定が適用されるのではないでしょうかね。

 

③Image overlap(画像のオーバーラップ)

初期設定はMediumです。隣接する画像と画像がどの程度オーバーラップ(重なりがあるか)しているかを元に設定します。画像のオーバーラップが20%以下の場合は「Low」に設定、60%以上ある場合は「High」に設定します。40%ぐらいの場合は「Medium」です。

画像の共通エリアが大きいほど、RealityCaptureがカメラのポーズを計算するのが容易になり、処理速度が向上します。オーバーラップが少なく十分な画像がない場合は、コンポーネントが分離しやすくなります。つまり撮影する写真は、60%以上の重複があるように細かく撮影するべきです。

あまり気にせず「Medium」で使っています。繋がりが悪い場合(コンポーネットが複数になる)は、「Low」に設定するとつながることがあります。

 

④Image downscale factor(画像のダウンスケール係数)

初期設定は1です。アライメントの分析に利用する画像サイズの設定です。最高の精度を得るためには、フル(ダウンスケール係数1)を使用します。画像を縮小することで処理速度は向上しますが、解像度が低下するため、詳細の検出が難しくなります。ダウンスケールなので2は1/2、3は1/3でしょう。縦横の解像度が1/2になると、ピクセル数自体は1/4になります。たぶん倍々に小さくなる仕組みと推測です。

アライメントの結果は、1でも2でも変わらない印象です。2にすると処理がすぐ終わるので2で使っています。複数回アライメントをする方が効果がある気がします。1だとコンポーネットが複数になるが、2にすると上手くまとまることも。謎です。運です。

 

⑤Max feature reprojection error(特徴点の再投影エラー)

初期設定は2です。アラインメント中に使用される内部精度レベルです。エラーを最大でも3ピクセル以内に保つことを推奨します。この設定により、特徴点の再投影誤差が小さくなり、より精度の高いアラインメントが可能になります。アライメント中に使用される内部精度レベルです。最大値を3pxに設定し、この範囲でエラーを最大限に保つことをお勧めします。何も考えずに2で使っています。2より下げた方が良いという人もいます。

 

 

Camera Priors/Control Point Prior Settings

次はCamera Priors/Control Point Prior Settingsです。測量系のフォトグラは経験したことがなく、初期設定のまま使っています。ドローンを使う場合も意識したことがありません。

地図上の正確な位置を特定するジオリファレンシングや地理情報システムGIS、基準点グラウンドコントロールポイントから測定されたデータの正確性を調整したときに有効なようです。GPS、RTK、PPKなどを利用する測量や土木工事プロジェクトで有効な設定かもしれません。

 

Use camera priors for georeferencing (ジオリファレンシングのためのカメラの事前情報の使用)

画像の事前位置がアラインメントプロセスおよびシーンのジオリファレンシングに使用されます。

Position accuracy位置の精度

カメラの事前位置の精度を指定します。これは、計算された位置が事前の値と等しいと考えられる範囲を定義します。

Units (単位)

カメラの事前情報及びその精度が表示される座標系の単位。

Position prior hardness (位置事前の硬さ)

計算された位置が事前の位置にどれだけ近いかを定義する値。この値が大きいほど、計算された位置は事前の位置に近くなります。これにより、カメラ間の視覚的な接続が変わる可能性があります。

Yaw/Pitch/Roll accuracy (ヨー/ピッチ/ロールの精度)

カメラの事前の方向の精度を指定します。これは、計算された方向が事前の値と等しいと考えられる範囲を定義します。

Orientation prior hardness (方向事前の硬さ)

計算された方向が事前の方向にどれだけ近いかを定義する値。この値が大きいほど、計算された方向は事前の方向に近くなります。これにより、カメラ間の視覚的な接続が変わる可能性があります。

画像計測の精度 [px](Image measurements accuracy [px])

手動で配置されたコントロールポイントの画像内での偏差範囲を定義する値です。

位置精度(Position accuracy)

各座標における基準点の位置の精度を指定します。

定義された距離精度(Defined distance accuracy)

距離制約の通常の精度の値を設定します。

単位(Units )

コントロールポイントの事前情報およびその精度が表示される座標系の単位です。

 

Draft Mode

アライメントは、たいして時間が掛からないので、ドラフトモードは使っていません。数百枚から数千枚の場合は、アライメントの解像度を下げて確認しています。ドラフトでも速度は同じぐらいの印象です。超大規模(10000枚とか)のプロジェクトなら有効なのかもしれません。

以下の項目ですが、オーバーラップと、解像度は先と同じです。最終モデル最適化(Final model optimization)をYESにすると、バンドル調整が実行されるようです。バンドル調整とは、複数の画像から得られる観測データを利用して、カメラの位置(ポーズ)とオブジェクトの3D座標を同時に最適化する処理のことです。まあ普通にアライメントすればよいのでは?と思います。

 

Advanced Settings

Advanced Settingsには、期待できそうな項目が並びます。。上手くできないとき、いろいろ変更してみる項目です。結果はあまり変わらない?

アライメント後に再構築領域を追加(Add a reconstruction region after alignment)
YESにすると、アライメント完了後に再構築領域が自動的に作成されます。範囲指定が自動のほうが便利ですから、※いつもYESです。

測定提案を有効にする(Enable measurement suggestions)
3Dからの画像測定の提案を有効にすることができます。※いつもenableのまま。

コンポーネントの再マッチを強制(Force component rematch)
アプリケーションはより良い接続を見つけるために、画像/カメラ間で再アライメントを行います。新しいマッチを見つけるためにカメラのポーズを使用します。※説明を見るとよさそうな機能ですが、どうにもならないときは、Tureにしてもどうにもならない。効果があるのかな?

背景特徴検出(Background feature detection )
システムにプロセッサの優先度を低くして背景の特徴点を自動検出させるかどうかを選択します。例えば、コントロールポイントを設置する場合に便利です。コンピュータが画像を事前処理し、結果として時間を節約できます。※コントロールポイントを設定するときに、この設定を意識したことがありません。意味あるのかな?

背景スレッドの優先度(Background thread priority)
背景検出の優先度です。低または通常から選択できます。※背景をトラッキングの要素にしたいときに有効なのでしょうけれど、意識して使ったことがありません。

プリセレクター特徴(Preselector features )
初期設定が10000です。検出された特徴からアライメントに使用される特徴の数です。最適には検出された特徴の1/4から1/2に設定します。※なので20000ぐらいにするというのが定説です。

検出器の感度 低/中/高/超高(Detector sensitivity )
超高に設定すると、テクスチャが弱い場所でより多くの特徴点を検出します。これにより、画像のノイズによるテクスチャがあるかもしれない点も追加されます。一方、低に設定すると、画像登録に使用できる特徴点を捨てることになります。※繋がらないときに低にしたり高にしたりしますが。。。

ジオリファレンスされたコンポーネントのマージ(Merge georeferenced components )
同様に、アラインされたシーンが複数のコンポーネントに分かれ、それらすべてがジオリファレンスされている場合、共通の視覚的交差がなくても、アプリケーションはそれらを結合します。※繋がらないときONにしますが。。。。

歪みモデル(Distortion model )
使用したい歪みモデルを定義します

インポート時に画像を特徴として優先する(Prefer images as feature during import)
RealityCaptureは.zfprjモザイク画像をインポートし、アライメントプロセス中に特徴源として使用すること。※意味が不明ですが、効果があるのかな?モザイク画像って何だろう。

 

 

歪みモデル(Distortion model )について詳しく見てゆきましょう

カメラのレンズに関して重要な項目ですが、うまく撮影できたものはどの設定でも大体上手くゆきます。一般的にはスマホやGoProで撮ったらDivision、一眼レフだったらBrown3、いわゆるバナナエフェクト(直線が曲がる)を感じたらBrown3 with tangential2って感じです。

Division
Divisionは単純な歪みを確実にカバーし、フィッシュアイオプティクス(例えばGoPro)にも非常に効果的です。この歪みは単一パラメータの除算モデルによってモデル化されます。

Brown3
Brown3は世界で最も人気のある歪みモデルです。180度未満の光学系に対応します。これは放射状歪みの多項式モデルで、3つのモデリングパラメータを持っています。デフォルトとして使用されます。※普通のちゃんとしたレンズの時に最適な設定という理解です。

Brown4
Brown4は、画像の中央と端で異なる歪みをカバーできます。これも放射状歪みの多項式モデルですが、4つの係数を持ちます。※たぶん安い歪みが変なレンズを使った場合に良い設定かな。

Brown3 with tangential2 / Brown4 with tangential2
Brown3またはBrown4に接線方向の歪みを追加します。これにより、レンズのオフセットを補正できます。現在のほとんどの光学系では、接線方向の歪みは無視できるほど小さいです。※これはレンズの非対称配置、レンズマウントのずれなどがある場合に有効ってことでしょう。

K + Brown3 with tangential2 / K + Brown4 with tangential2
これらのモデルは、Brownモデルにカメラキャリブレーション全体の最適化を加える可能性を提供します。これには、スキューとアスペクト比が含まれます。K + …を使用しない場合、RCはデフォルトでスキューをゼロ、アスペクト比を1と仮定します。※異なるカメラが複数混じっている場合はこの設定がよいようですね。

いつもなんとなくBrown3 with tangential2を使っています。

ヒントに、最初はより単純なDivisionモデルから始めて、後でBrownに変更してデータを最適化します。とあるので、そのように作業するとよいのかもですね。まあ設定より撮影の方が重要な要素です。